mirror of
https://github.com/SoftEtherVPN/SoftEtherVPN.git
synced 2025-06-28 11:55:08 +03:00
Compare commits
1417 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
12ed43f6eb | ||
|
d8bcb863f5 | ||
|
7228de494d | ||
|
afa848454a | ||
|
6f76880767 | ||
|
cb9ccf41a5 | ||
|
62c71ebe5c | ||
|
80bab0f7d7 | ||
|
c742f6c5cf | ||
|
7a6a1e2ed0 | ||
|
e1ec3d42e5 | ||
|
6e9247fff1 | ||
|
80179d5cc5 | ||
|
2265435d62 | ||
|
b4916f20af | ||
|
260bc09276 | ||
|
d01781d537 | ||
|
48042cfbc1 | ||
|
a7a7eef82b | ||
|
a4c3713f4b | ||
|
abc516757e | ||
|
3fee01e1cf | ||
|
b3dfdc2ad0 | ||
|
8d06ac3348 | ||
|
9d1c3306e0 | ||
|
7729966c50 | ||
|
591cf0e9b9 | ||
|
39996ab0a2 | ||
|
f525b4d660 | ||
|
a081fdd5c8 | ||
|
10a2806f12 | ||
|
2628ac1884 | ||
|
972256c578 | ||
|
e2e8193495 | ||
|
71b6aa7a8c | ||
|
8be6d756b8 | ||
|
a6c5f0d135 | ||
|
c2487c6b2e | ||
|
817214da1f | ||
|
015f93f7b7 | ||
|
cdd3bddcc6 | ||
|
0a1f0913d9 | ||
|
18cbd4627a | ||
|
a8bc827706 | ||
|
e475d70c0b | ||
|
e94240d9a0 | ||
|
023eb3465d | ||
|
5d1ce1a2cd | ||
|
d8569ad31a | ||
|
e3e0c33e3b | ||
|
9f01143c83 | ||
|
93df1ee631 | ||
|
8f0deb576c | ||
|
27d233a522 | ||
|
128fefc63e | ||
|
31fed5a28f | ||
|
a8ce56b28b | ||
|
08e24917b8 | ||
|
e2017772c7 | ||
|
a836b3bd5e | ||
|
3a25c6bf73 | ||
|
67fe99e1dc | ||
|
4e8f797036 | ||
|
b1bdc03cd7 | ||
|
d4d20e4443 | ||
|
c76f11a523 | ||
|
a45219bb78 | ||
|
25585a1e3d | ||
|
4370efcc90 | ||
|
1d57ccf94a | ||
|
04912037c0 | ||
|
b8fbb3e3d8 | ||
|
98a8d5249d | ||
|
dd2a53e049 | ||
|
7ce9c088ff | ||
|
1f9ce6f9c2 | ||
|
28ded982a7 | ||
|
de9c566f33 | ||
|
0af6c96d88 | ||
|
c2c1388f8c | ||
|
d15f92c9b2 | ||
|
7dc3f2240c | ||
|
c2a7aa5481 | ||
|
6f57449164 | ||
|
48f6bc57cc | ||
|
eb66e7d360 | ||
|
13e6369db3 | ||
|
102485a4b8 | ||
|
bc31a5cfd3 | ||
|
68964ab0d7 | ||
|
bf3c50fde4 | ||
|
b06486b37d | ||
|
26c61b3213 | ||
|
1bea86ef94 | ||
|
6825234e0a | ||
|
a794726a07 | ||
|
dae352104c | ||
|
4fe5352931 | ||
|
ebe52afa9a | ||
|
c06e5ad1dd | ||
|
b2ec1bd5dd | ||
|
bfaff4fdb0 | ||
|
08213b7f0e | ||
|
98852b77d9 | ||
|
645a078f8e | ||
|
af2196468a | ||
|
42647480b0 | ||
|
60496ac7fb | ||
|
63ffab9ee4 | ||
|
2fe4ca0f8c | ||
|
a50d8910ba | ||
|
315ffffeec | ||
|
141060101d | ||
|
5a88b34ddb | ||
|
7006539732 | ||
|
8ad34b2012 | ||
|
186d48fba2 | ||
|
37231ac006 | ||
|
9378c341f7 | ||
|
99e277aa71 | ||
|
bcb896b178 | ||
|
6e5395cc8d | ||
|
9ce27f363e | ||
|
d568cc1727 | ||
|
c9b5e25c87 | ||
|
7f074d0c0b | ||
|
f8c5fa5384 | ||
|
74f7269ef6 | ||
|
41f83c9e32 | ||
|
f66866fda1 | ||
|
071a87297b | ||
|
cd86bd810d | ||
|
831905d281 | ||
|
5ee8e3f00c | ||
|
2f9f157a1e | ||
|
5cf45ad62b | ||
|
c838ba0009 | ||
|
9982e128ef | ||
|
ac28302b59 | ||
|
9a009d750a | ||
|
c36d7187a8 | ||
|
465df16505 | ||
|
723d8e0682 | ||
|
6582955cfa | ||
|
71d71e51db | ||
|
74ea87d725 | ||
|
ca832a9cef | ||
|
23e9f74e7e | ||
|
7b9fd5bdcd | ||
|
53b7db3578 | ||
|
4c1eeb717b | ||
|
7981e16e0b | ||
|
62e7f0ba8a | ||
|
2dbebe271d | ||
|
eb793dc257 | ||
|
97203568e7 | ||
|
9c0b5f7001 | ||
|
a39560749d | ||
|
495cddd518 | ||
|
0d9b4faae3 | ||
|
e8c14cba68 | ||
|
ff37c35cfa | ||
|
56c12de929 | ||
|
2789b16c12 | ||
|
f6c185f279 | ||
|
44821c7130 | ||
|
64cb8e1eff | ||
|
fc7093ed36 | ||
|
370d83ffa0 | ||
|
645d5ebb55 | ||
|
09b7e4f6e5 | ||
|
0dfc82c14e | ||
|
48cb3fdebe | ||
|
913934f7c0 | ||
|
442885deb5 | ||
|
d4dbf3cdc5 | ||
|
b58d57ffeb | ||
|
01b05af333 | ||
|
60ee463044 | ||
|
36456e63a6 | ||
|
4e4bd79ad2 | ||
|
dc2b11918a | ||
|
7398bf2724 | ||
|
ff4b74afda | ||
|
e6792d8893 | ||
|
8cde812157 | ||
|
3574f8aa98 | ||
|
9429243dbe | ||
|
895c16e3e8 | ||
|
6a170ac691 | ||
|
6dbf7e9ae2 | ||
|
54ae7f725b | ||
|
35077deaf1 | ||
|
3b932f5fee | ||
|
f4bbe476be | ||
|
2dec52b875 | ||
|
c49e462ed1 | ||
|
b8e542105f | ||
|
18dc2621ec | ||
|
f57f05a599 | ||
|
f736d18267 | ||
|
1be55ebb94 | ||
|
d8dec75bc5 | ||
|
fc2a33d1f3 | ||
|
68615fe64e | ||
|
2fd6c0b76a | ||
|
6833a7a11d | ||
|
643cbbbf88 | ||
|
205a94cda2 | ||
|
2868ff1ef6 | ||
|
a9a93a2824 | ||
|
979eb803a6 | ||
|
5e63124bb5 | ||
|
68e704097d | ||
|
716ae59f1f | ||
|
8162ca3d12 | ||
|
d9686df302 | ||
|
8345deebe4 | ||
|
63595f79c5 | ||
|
7fe3e6a800 | ||
|
107c4ba362 | ||
|
aa65e11fc8 | ||
|
519d94f925 | ||
|
950ecc186c | ||
|
2abd9de923 | ||
|
5d8ff7ed4f | ||
|
8f8677f164 | ||
|
088b5c2df3 | ||
|
acb6a53b31 | ||
|
e122e964f3 | ||
|
df108b559d | ||
|
efac849ed7 | ||
|
a80d3f2032 | ||
|
1cf2e7a8ea | ||
|
137b8ef67a | ||
|
c2fe874865 | ||
|
14fea1f4a2 | ||
|
f6f2660060 | ||
|
5d667e4261 | ||
|
adccc6b7d4 | ||
|
a2aa254f11 | ||
|
c0440031e9 | ||
|
07733b29cb | ||
|
eb785e08fe | ||
|
1493ccb44d | ||
|
49f8112d83 | ||
|
5633314981 | ||
|
dcdbce63d5 | ||
|
8ac021a38c | ||
|
e4330ca71a | ||
|
35b5d0640f | ||
|
f88341ce40 | ||
|
0ab5199272 | ||
|
41be858df0 | ||
|
6665efb822 | ||
|
8826484245 | ||
|
09708bc8cb | ||
|
696a9bc0a1 | ||
|
1c0bdb0c30 | ||
|
96e4fc040f | ||
|
0f689d9dfc | ||
|
867c992111 | ||
|
96b1961d78 | ||
|
939eb3130e | ||
|
0ba7ad392e | ||
|
8482a52522 | ||
|
9c33605f5e | ||
|
3c70698c35 | ||
|
56b4ebfa65 | ||
|
c68d93c2e9 | ||
|
2fdd9ec4dc | ||
|
36505e3896 | ||
|
6ae786d542 | ||
|
c59df82666 | ||
|
db7d6c83d5 | ||
|
a89adaebc3 | ||
|
c46871688b | ||
|
aadc068964 | ||
|
46e73e944f | ||
|
8fc27da780 | ||
|
c983ebffc1 | ||
|
df6df007a3 | ||
|
f7a2cc5a7d | ||
|
544f03ec8b | ||
|
82ce34fccb | ||
|
6ff0ce7076 | ||
|
d2e673a47d | ||
|
b3df7a0b90 | ||
|
22c602f630 | ||
|
b4e26dec05 | ||
|
df7ea3c54a | ||
|
423631100f | ||
|
fb83ac08f2 | ||
|
e6123d36a0 | ||
|
0ff9d1a455 | ||
|
96ab969152 | ||
|
1f3a730d0a | ||
|
21963c6c68 | ||
|
91053622ab | ||
|
1519e23b3e | ||
|
f7d33568f3 | ||
|
1fe26ccb6c | ||
|
8c64dc0cd7 | ||
|
bedf1cd7e9 | ||
|
d7c487619a | ||
|
2b7b728077 | ||
|
cd2838795b | ||
|
4ff9c6393a | ||
|
e81ecbb0ec | ||
|
e20fa9ec2e | ||
|
1741dfdccc | ||
|
d045d1eeb7 | ||
|
cc61b5b3c3 | ||
|
eea1de3d25 | ||
|
7e19bbc421 | ||
|
d49b9f108b | ||
|
c67d9ee201 | ||
|
1062692d08 | ||
|
025ebec4cc | ||
|
11828be9e6 | ||
|
edcdc923ad | ||
|
7c642c7d55 | ||
|
6ce91e9c81 | ||
|
064d211fab | ||
|
43aaca509d | ||
|
f4934abc9a | ||
|
0cdf0eacbf | ||
|
0e8174c6cf | ||
|
54593e8cac | ||
|
26403c70e3 | ||
|
0a60cdf141 | ||
|
149096e13c | ||
|
8362637353 | ||
|
c7766d072b | ||
|
8215de91f9 | ||
|
6a5f4b0dfd | ||
|
58c0e1ded4 | ||
|
6e48227d93 | ||
|
1b79df7954 | ||
|
cbb90c5f23 | ||
|
2e8723b967 | ||
|
64396e2c05 | ||
|
89cc6ae717 | ||
|
ec3769ba32 | ||
|
86e44e8d7b | ||
|
260413d242 | ||
|
99374ba446 | ||
|
23c3e1d9e5 | ||
|
68283fca80 | ||
|
d8e56f9dbc | ||
|
dca2eaa370 | ||
|
c223fbe8a3 | ||
|
334e8be915 | ||
|
e2ad7d5e8f | ||
|
9eb9d57c27 | ||
|
28ec0d54b8 | ||
|
506677bf60 | ||
|
6a1b55293c | ||
|
49c1a84752 | ||
|
34a9a7bc46 | ||
|
bf9ebe21ff | ||
|
e7980ae9b1 | ||
|
9f53cf5bdb | ||
|
1027dbf385 | ||
|
675b78e502 | ||
|
c492276a94 | ||
|
661e61538e | ||
|
b5a83cc208 | ||
|
7f65bae400 | ||
|
3781d0f91c | ||
|
d76888434b | ||
|
b6d2ec3b76 | ||
|
4ebf713911 | ||
|
4981008534 | ||
|
b5727b3525 | ||
|
372759d2ad | ||
|
86e28db3d7 | ||
|
797696a9f4 | ||
|
0643ae70f5 | ||
|
8ae0a932da | ||
|
bfee06d144 | ||
|
e4f9abba1c | ||
|
05fa675d5a | ||
|
ac04c469c7 | ||
|
dc5da0c6a9 | ||
|
e85fc4435e | ||
|
cf38a3b6c2 | ||
|
04569c81c7 | ||
|
6adc996bf9 | ||
|
fa99fde893 | ||
|
d854fd6baf | ||
|
ee1ecf8b42 | ||
|
1ba86c0dc1 | ||
|
d8768367b9 | ||
|
a14d812dcb | ||
|
49ea58dd58 | ||
|
37aa1ba534 | ||
|
3ed7f7cbce | ||
|
209f60f079 | ||
|
333cbb3f29 | ||
|
5146bbbadc | ||
|
e74d9dec25 | ||
|
ad4ce138e9 | ||
|
34d443648b | ||
|
27d7f4cfbe | ||
|
4a3b4589c6 | ||
|
53d8b10de2 | ||
|
ca996ed89a | ||
|
0d075f0b42 | ||
|
8f3915417f | ||
|
bf206bd7ad | ||
|
cb6d9531b5 | ||
|
2f1bff96b2 | ||
|
5a0227ba1d | ||
|
4f9c75a3a7 | ||
|
0735af9fdf | ||
|
ca226cdc9d | ||
|
900947bd08 | ||
|
817ecf2348 | ||
|
a8be4c38e1 | ||
|
c8dca265b4 | ||
|
4c2e0867e4 | ||
|
b3afbe37e9 | ||
|
3a91490b7f | ||
|
b4bb90ec5b | ||
|
192d4938da | ||
|
43f0d3b4fa | ||
|
a742e2d193 | ||
|
fade8672c2 | ||
|
992a998a34 | ||
|
3c0e3fa49c | ||
|
c6334a44f9 | ||
|
d86cf181bf | ||
|
e8b88fd225 | ||
|
9764485774 | ||
|
a52a3928db | ||
|
32a970f976 | ||
|
56aedd6817 | ||
|
b603d2658a | ||
|
1e604407af | ||
|
24926bcc17 | ||
|
a4334753ad | ||
|
fd92c754fc | ||
|
10b5034f0d | ||
|
0a4455ac40 | ||
|
f94ac6351e | ||
|
034aae5a70 | ||
|
879bd34af4 | ||
|
a4d414891f | ||
|
09dd8a8b07 | ||
|
3c7d78a1bf | ||
|
adbbe94675 | ||
|
1c1560f6ca | ||
|
68dc4e23d8 | ||
|
f6edb5e165 | ||
|
a5565fce4b | ||
|
d95d8ddefa | ||
|
5ecade7950 | ||
|
f3905cc421 | ||
|
3cdad95ee1 | ||
|
1c3dc59892 | ||
|
529d2c232f | ||
|
7f7d72cca9 | ||
|
e65cacdf96 | ||
|
f1b464e84d | ||
|
18598b5d96 | ||
|
51585e63e3 | ||
|
c72d4fddb8 | ||
|
82b6422821 | ||
|
fc15d1ebd5 | ||
|
73ffa10f50 | ||
|
a0f831c071 | ||
|
77ee848caa | ||
|
0b74a8e4ce | ||
|
918fedb9d4 | ||
|
fc94843579 | ||
|
b91d9af5e3 | ||
|
2a40d21ef9 | ||
|
02ee7b45d7 | ||
|
384ab07996 | ||
|
e6bf956806 | ||
|
528f313dbe | ||
|
5cac4481f0 | ||
|
b4aad09f21 | ||
|
14f5854ecf | ||
|
a9239a6aab | ||
|
b178f26e52 | ||
|
9692a8d961 | ||
|
2d1c8765aa | ||
|
8392ccd1fa | ||
|
2955dc5580 | ||
|
235d5d1d0d | ||
|
e095283641 | ||
|
fb004345b4 | ||
|
9d4970841f | ||
|
4d594e00f8 | ||
|
d7be057ae0 | ||
|
2990b5ae93 | ||
|
462ebfb960 | ||
|
6e7eba8e71 | ||
|
8e292138b1 | ||
|
582a739179 | ||
|
3a2d588722 | ||
|
9c2a573cf2 | ||
|
4657d7ee49 | ||
|
c9508b7fb7 | ||
|
2853337b81 | ||
|
03859eb515 | ||
|
a56cfac947 | ||
|
82af38c482 | ||
|
f74c53b449 | ||
|
f85dff25dc | ||
|
f301ba1e60 | ||
|
dcb1023999 | ||
|
26c8fbe538 | ||
|
115b8aab82 | ||
|
3cc85c1d51 | ||
|
fc9286b11b | ||
|
224abd99b8 | ||
|
5adeeb75ea | ||
|
d0fe38384c | ||
|
84bc94b232 | ||
|
78e89eb3c7 | ||
|
fcd00547aa | ||
|
0eb0152437 | ||
|
472dde05de | ||
|
1e6806bee7 | ||
|
c01d8e6058 | ||
|
d061abae8f | ||
|
888cf188bb | ||
|
fbdd6f1f3c | ||
|
024b68120d | ||
|
2d00ab7dcc | ||
|
51a3346f70 | ||
|
7f8e527883 | ||
|
832c69add2 | ||
|
ffc095f95a | ||
|
b6d31af188 | ||
|
ee3bf7f507 | ||
|
9b3077d955 | ||
|
dd9c3546f7 | ||
|
4ddf39e760 | ||
|
ce0591d924 | ||
|
5a05e7a249 | ||
|
c3573561ed | ||
|
97a04888b7 | ||
|
37b5644291 | ||
|
101d79d7c3 | ||
|
9182a9b4e9 | ||
|
bf14817f1f | ||
|
8b87c9d4ef | ||
|
2761c1ca42 | ||
|
1f40de2dda | ||
|
ddf9e48c10 | ||
|
1bb01e55e5 | ||
|
b531d8e234 | ||
|
fce3592917 | ||
|
410b7a959d | ||
|
1590e6afb3 | ||
|
996f2f2aa0 | ||
|
7863ce8a8e | ||
|
26a27553b2 | ||
|
a1dff0f594 | ||
|
7881f8657a | ||
|
bd501ba9bf | ||
|
dfb105c2d7 | ||
|
66dc5ee581 | ||
|
56bd9733d6 | ||
|
eff784b624 | ||
|
22a9231c33 | ||
|
a2f30c8aad | ||
|
41b9973c24 | ||
|
60db1962f9 | ||
|
6e400c19af | ||
|
f2466eb919 | ||
|
c310163244 | ||
|
9dbbfcd388 | ||
|
4328e6e5ab | ||
|
505c854303 | ||
|
4efed994dc | ||
|
513ad6e792 | ||
|
0d5b05ef02 | ||
|
bcba88ca73 | ||
|
883d4d4cd7 | ||
|
4eae5820f6 | ||
|
f6adcd6bfc | ||
|
dc296f1eff | ||
|
43f8b5fc56 | ||
|
08905e57a6 | ||
|
233e28f38c | ||
|
8798978951 | ||
|
af84a30adc | ||
|
b64c15b097 | ||
|
03d67fd5b1 | ||
|
46ca5f7b98 | ||
|
ce6ea9f781 | ||
|
4221579e95 | ||
|
56bb573b17 | ||
|
e3f0837bd1 | ||
|
c1370987bf | ||
|
79d1ade09d | ||
|
a3f984e521 | ||
|
65bcbc8db3 | ||
|
43a80702a9 | ||
|
682052e0dc | ||
|
ad139a7cbb | ||
|
64f1e349f8 | ||
|
214992c232 | ||
|
82b4b083b3 | ||
|
f18837b491 | ||
|
28c90b190c | ||
|
5f76dbcfa2 | ||
|
b4817fd27a | ||
|
89ca29f259 | ||
|
7a208d6114 | ||
|
5b910322a7 | ||
|
2262b8a160 | ||
|
2923b5500a | ||
|
7acd52d724 | ||
|
8c12e79448 | ||
|
dc8d705854 | ||
|
81c71d309a | ||
|
e0182ca3d9 | ||
|
97d9761a9b | ||
|
544c9a73da | ||
|
f9a1d72ce7 | ||
|
e2d61133fe | ||
|
2f801f30de | ||
|
60568da9b7 | ||
|
515d823ef8 | ||
|
146455e97d | ||
|
c20bcb2e60 | ||
|
ce54531b53 | ||
|
cf318d7219 | ||
|
285e322171 | ||
|
cca769e2e6 | ||
|
4e248e833c | ||
|
92f41341d9 | ||
|
19af52e288 | ||
|
3a595b4a46 | ||
|
76395d8f8d | ||
|
2aaf9012a0 | ||
|
aeff295c01 | ||
|
4b05de1a93 | ||
|
92966e0f5c | ||
|
485e680cff | ||
|
f8c4713fad | ||
|
789ed26113 | ||
|
6f050f2b01 | ||
|
6a25ccfa28 | ||
|
138e0b76d6 | ||
|
ee84891559 | ||
|
0472f9c286 | ||
|
f7e988ffc7 | ||
|
a541c0286e | ||
|
30f707d6c0 | ||
|
bad9310aa4 | ||
|
d4d15b66d3 | ||
|
c4b5455663 | ||
|
192083e7c4 | ||
|
1708998a11 | ||
|
01663f836d | ||
|
4ec2995604 | ||
|
2bb6fb2845 | ||
|
a6ba9b8788 | ||
|
46b54f00be | ||
|
5cab279a8c | ||
|
3e17c818a6 | ||
|
84588095d5 | ||
|
a79f91161f | ||
|
ed6013affc | ||
|
ac04e15b72 | ||
|
4db6247b80 | ||
|
3761876254 | ||
|
934e49fea0 | ||
|
b7e7d3b028 | ||
|
808f081e3a | ||
|
8fb9bfd39c | ||
|
9d29d8813b | ||
|
68367fa2fb | ||
|
d5fa90cc71 | ||
|
68574e9af9 | ||
|
de03b3ec59 | ||
|
9e7f26395a | ||
|
b00aa39b29 | ||
|
2d82d84fd5 | ||
|
42dbfb7c7e | ||
|
ef5c32dca1 | ||
|
65483499bf | ||
|
3ffdda6c13 | ||
|
3d69a71d9b | ||
|
4506b60e80 | ||
|
b6b692046c | ||
|
56a19d7651 | ||
|
2078a069de | ||
|
562ffe8945 | ||
|
914bfe7d44 | ||
|
7f30cbccf4 | ||
|
2dab282eb2 | ||
|
ef24ff74c8 | ||
|
a8580458c4 | ||
|
6115f1c713 | ||
|
dd1eebdbed | ||
|
8495388933 | ||
|
afe576dcdc | ||
|
decfcecc97 | ||
|
d8aa470192 | ||
|
b339104f4f | ||
|
8a37f5ce11 | ||
|
e7bf97583d | ||
|
a39905c288 | ||
|
dbd4dd5ae7 | ||
|
ec201f340a | ||
|
0a924aea4d | ||
|
d161b75a7d | ||
|
621fb087f8 | ||
|
809f891f0c | ||
|
82f2c73ce9 | ||
|
5cddafbb3b | ||
|
dd6e79d526 | ||
|
5792aa7c41 | ||
|
0325c13c40 | ||
|
25e2854725 | ||
|
cf2585c079 | ||
|
1301dc93c6 | ||
|
5ed11a0270 | ||
|
5c346ef96e | ||
|
2715d80e18 | ||
|
a08857150b | ||
|
e5cfa347da | ||
|
a6239a4ae3 | ||
|
8e2616ef7d | ||
|
ea2c8f9861 | ||
|
e5e86abc0e | ||
|
992410c3d4 | ||
|
cd889f78dc | ||
|
cabcba1ef9 | ||
|
2969237e04 | ||
|
78f06569b3 | ||
|
1fa6c14e4e | ||
|
586c27d43b | ||
|
63b841efc0 | ||
|
2981a44de3 | ||
|
2db9f15ea7 | ||
|
ebd1d281dd | ||
|
9620dcbcd0 | ||
|
943ddadd3d | ||
|
272ec5a8ef | ||
|
d53f80bfa6 | ||
|
ac48ac348b | ||
|
44447e9762 | ||
|
394354ff8a | ||
|
6ff00f637b | ||
|
5611156ca8 | ||
|
f03e83369e | ||
|
501fe217ff | ||
|
bf1201aa26 | ||
|
a207260e38 | ||
|
eddf593e22 | ||
|
3fa24c6731 | ||
|
5f12684b42 | ||
|
5f6306d5e5 | ||
|
023250df9a | ||
|
16ca0694fb | ||
|
99e99a46b1 | ||
|
fffed52f3b | ||
|
69b4001355 | ||
|
c029b34b80 | ||
|
7fdacec2a6 | ||
|
190672bd84 | ||
|
5ca62bdd8a | ||
|
d0b3cde485 | ||
|
bb2e2ff997 | ||
|
a2d15615f3 | ||
|
945715e4bb | ||
|
1ac7602b3a | ||
|
3c140dde8d | ||
|
d29d1f516a | ||
|
b890c7d813 | ||
|
8bb787f233 | ||
|
819f2f92f6 | ||
|
e6a80fb4f2 | ||
|
249575a5a5 | ||
|
2c9ac51c84 | ||
|
9e7d87bea6 | ||
|
3cf23e58a3 | ||
|
f52ccc6493 | ||
|
2e0c24f6c8 | ||
|
d1ad4196bb | ||
|
1e164ecc4e | ||
|
51ffe4be2c | ||
|
20b84f3928 | ||
|
dec532a8eb | ||
|
ff3910eb86 | ||
|
684d17e86a | ||
|
efd24133be | ||
|
1c4b257a1b | ||
|
77aee2d21c | ||
|
f22b013dda | ||
|
488eb06d64 | ||
|
763e1b67a5 | ||
|
fc39173b73 | ||
|
1a4ed27e89 | ||
|
cd0db9c7d6 | ||
|
c5a3fd74c0 | ||
|
a800e6f6cc | ||
|
5b07163975 | ||
|
feba98199b | ||
|
7b73e3c0c8 | ||
|
490fc7b65c | ||
|
a8fdc1184a | ||
|
7edda54b9a | ||
|
cc5d68a7c3 | ||
|
6a7883b5fe | ||
|
61ccaed4f6 | ||
|
09f24e46b3 | ||
|
69cd39616b | ||
|
e18bb465c9 | ||
|
337a04b758 | ||
|
1c56562cc7 | ||
|
b4cd4ce360 | ||
|
818103950c | ||
|
5d782a67b4 | ||
|
cda0062367 | ||
|
a8c6a0c1b3 | ||
|
712c51a971 | ||
|
ac1b045634 | ||
|
3b2db45509 | ||
|
10e292b196 | ||
|
e8793a0098 | ||
|
5cdd2a4e4a | ||
|
e1d9eaf590 | ||
|
6b3ac84ba2 | ||
|
18ad35ebfe | ||
|
b853140626 | ||
|
5209b310e3 | ||
|
3a275d7257 | ||
|
aa65327e73 | ||
|
b352aa4cc3 | ||
|
6d85fffdb5 | ||
|
8685fe0da1 | ||
|
cd850c07ae | ||
|
14a410a179 | ||
|
c865103795 | ||
|
60410accce | ||
|
352ed759b2 | ||
|
b57a4b051b | ||
|
6c665f889f | ||
|
5bf08e63bb | ||
|
4b9c33cd30 | ||
|
78dad1d568 | ||
|
6a472d827a | ||
|
a3eb115b0a | ||
|
24d64222ea | ||
|
cc61c90372 | ||
|
35200a29ea | ||
|
c084ce30f9 | ||
|
755e09e5c1 | ||
|
2cdffffa54 | ||
|
8e53b948c5 | ||
|
ff247687ed | ||
|
588d7539f4 | ||
|
112b4c2c67 | ||
|
28d4a113dc | ||
|
3732447571 | ||
|
0133682eb3 | ||
|
3747d2bf3f | ||
|
3c99f64621 | ||
|
74a1e9bd1b | ||
|
59be67df25 | ||
|
5e0c036e39 | ||
|
6801e4b384 | ||
|
c948f65850 | ||
|
a9b30b829f | ||
|
d074899fd8 | ||
|
3c2f5a41ba | ||
|
369a8850c4 | ||
|
7b042e53d2 | ||
|
844dcdb0af | ||
|
144392c587 | ||
|
3baf4674e7 | ||
|
869496be3e | ||
|
d917b2ac73 | ||
|
96a2d5a124 | ||
|
3090688506 | ||
|
19dbdf46be | ||
|
eb5150a002 | ||
|
e0c6813d44 | ||
|
6869955acc | ||
|
f84513c95b | ||
|
45399d9797 | ||
|
b60844e276 | ||
|
40ed982079 | ||
|
eeaac4e78c | ||
|
6fe678fe84 | ||
|
853b4a57bc | ||
|
275e8a81ef | ||
|
235bd07e67 | ||
|
47d08b055e | ||
|
485a5922eb | ||
|
4514ba5e2f | ||
|
5ebdb394fc | ||
|
2fafd7c70e | ||
|
d726719602 | ||
|
09be880263 | ||
|
f7f6eeec44 | ||
|
c4838006b1 | ||
|
c52e49de2d | ||
|
9e6476c7b2 | ||
|
37f28b4119 | ||
|
f1cb86d979 | ||
|
c4ec63fe32 | ||
|
60cc784aee | ||
|
b77dd167ff | ||
|
1a8e1385cf | ||
|
e3e35f5a4c | ||
|
c15a4ba04f | ||
|
5e1c728f92 | ||
|
eb9d6e77a4 | ||
|
6e707f7550 | ||
|
71b814060d | ||
|
8e1a377b82 | ||
|
adf0f18b7a | ||
|
20bbe325fe | ||
|
1d5ded9388 | ||
|
cbbac659a3 | ||
|
2cfe031398 | ||
|
a2a6502ab9 | ||
|
f2fee4d32c | ||
|
f627b64264 | ||
|
1d6a4d3ec8 | ||
|
3b7dd25b65 | ||
|
3f16a7e704 | ||
|
4e583e43f1 | ||
|
8fdf7302a5 | ||
|
981b57ee28 | ||
|
27f7d43ff7 | ||
|
a3aea00820 | ||
|
0570f7d31c | ||
|
667108319d | ||
|
7e8b3c0b39 | ||
|
34dfc14549 | ||
|
1fe863e866 | ||
|
b41c17f45a | ||
|
ca1c6a5f3f | ||
|
8fb456f6a6 | ||
|
132926ee09 | ||
|
8a856e4672 | ||
|
e6803a1fab | ||
|
9180e065a0 | ||
|
39becfe4ab | ||
|
723f38e72f | ||
|
a2b7cb0148 | ||
|
24bd2b3198 | ||
|
9f2a5cecf3 | ||
|
a65c436e8f | ||
|
aa0ec4343c | ||
|
1bdd9a92bc | ||
|
942051d3a8 | ||
|
039cd8edf0 | ||
|
e025762a52 | ||
|
a902d3eed9 | ||
|
44f731f781 | ||
|
14e9c7299d | ||
|
f20e99f8e4 | ||
|
b9109211d3 | ||
|
9073452b09 | ||
|
bf65ef290a | ||
|
70a7c4596d | ||
|
16cdf62cc6 | ||
|
033647c8ac | ||
|
b6ef9f88c9 | ||
|
c6f186bd73 | ||
|
84bd9abb30 | ||
|
5db21a1dc1 | ||
|
4772a508dc | ||
|
1416a693e7 | ||
|
22272ec838 | ||
|
be3e45a4bf | ||
|
dcecd4c0d5 | ||
|
60c1e2027d | ||
|
6399b0f852 | ||
|
3b00d4c56b | ||
|
5dde23cb55 | ||
|
e6b8e6eee3 | ||
|
78b0684dd4 | ||
|
a6652fead2 | ||
|
c222ef525b | ||
|
c3d56c2201 | ||
|
7e5decb72a | ||
|
1e601ebf65 | ||
|
f34d3c80b1 | ||
|
c635cdd614 | ||
|
fa9e9d15a5 | ||
|
60e85afd1f | ||
|
a6970e3e61 | ||
|
eeec9a82f6 | ||
|
1a5a11d146 | ||
|
a49219db83 | ||
|
a4f87565ae | ||
|
9487bc8d47 | ||
|
70564a8f52 | ||
|
bd558e8f0a | ||
|
17e7d65839 | ||
|
e5d691977d | ||
|
f083c59905 | ||
|
41e023b369 | ||
|
a53be84e3a | ||
|
4fddb7681e | ||
|
76c9678015 | ||
|
6d3fef8da6 | ||
|
92c544cc1f | ||
|
6b6c0ae636 | ||
|
543a26c6a6 | ||
|
d836904321 | ||
|
9556f09166 | ||
|
0d79b3c3b5 | ||
|
1c07ddcb8d | ||
|
c38b0b0398 | ||
|
e4aff409f8 | ||
|
80ba3345d1 | ||
|
d1471048d9 | ||
|
614f4db8a6 | ||
|
a455dc7f0e | ||
|
c8479e3011 | ||
|
b1aae5080d | ||
|
a69c4980d5 | ||
|
c64674479d | ||
|
01abdedc45 | ||
|
18c9b74ff0 | ||
|
3a309c9f6e | ||
|
3b6c4d02ac | ||
|
876ca4ef3e | ||
|
1d2a58b172 | ||
|
6b08a451da | ||
|
2ea5c2a7b0 | ||
|
82a81a3ce6 | ||
|
9aaa9a7f15 | ||
|
ab57ef3f54 | ||
|
76ae935172 | ||
|
a676a0a6fd | ||
|
76c330e74b | ||
|
4acd7ab98e | ||
|
7829fe2c59 | ||
|
12cbf34302 | ||
|
63caa4b07f | ||
|
3c21d982fc | ||
|
59dc26aa21 | ||
|
b8f58a2f94 | ||
|
1e835e7ec2 | ||
|
5d73cd878f | ||
|
7349c4b16a | ||
|
16bde47763 | ||
|
79a60bc5f0 | ||
|
4d42f450b2 | ||
|
46d8da6744 | ||
|
51330fdb43 | ||
|
5b15b12ea9 | ||
|
12cc242529 | ||
|
4afdad09a1 | ||
|
2f90e9ecb8 | ||
|
c3d6ffc533 | ||
|
04ecbf843a | ||
|
6b41b19327 | ||
|
93dcd25d63 | ||
|
5fed2b8903 | ||
|
2aeec323f9 | ||
|
762c399c42 | ||
|
f0357d4000 | ||
|
7413fec646 | ||
|
e944e6a848 | ||
|
c8a0a5648b | ||
|
e03db7ee60 | ||
|
93183f7b3f | ||
|
1e9092ee94 | ||
|
50960dbe16 | ||
|
ea37c85391 | ||
|
21e3ce104b | ||
|
850a5faa0d | ||
|
9e46402e6b | ||
|
1144d6c430 | ||
|
926b99047a | ||
|
2fa28480f9 | ||
|
d10f83417f | ||
|
82b84a9436 | ||
|
bf4667cfce | ||
|
c6068d23c7 | ||
|
7dff0dce17 | ||
|
9f19efb7af | ||
|
7d58e6bf60 | ||
|
3f9b610c80 | ||
|
ad33008a29 | ||
|
d57fc3524c | ||
|
a9f707c813 | ||
|
24f426162c | ||
|
06fc93e08e | ||
|
e10983ec6f | ||
|
9b20444bb2 | ||
|
d6cf1b85a9 | ||
|
831c907512 | ||
|
1bd39485cf | ||
|
fb5083be29 | ||
|
a4ed656001 | ||
|
dcc99fdbb2 | ||
|
13dbf83e95 | ||
|
5c77eddaf9 | ||
|
0d69030d77 | ||
|
a9f31d7df9 | ||
|
c6117d4f8e | ||
|
c2ad67a907 | ||
|
2291bf5bf9 | ||
|
50e39826e4 | ||
|
47ad2328c0 | ||
|
17a04b4387 | ||
|
e1e29a9283 | ||
|
2592525b64 | ||
|
896ac8e285 | ||
|
6e78068a65 | ||
|
9c227f3480 | ||
|
9c6c88a1a8 | ||
|
919f6c825f | ||
|
9fbfa61b34 | ||
|
7ef7c36c83 | ||
|
9cba49b89a | ||
|
2da6e4c491 | ||
|
afc6a706e5 | ||
|
b1d2dd8d87 | ||
|
39b80e04c5 | ||
|
529d8f593c | ||
|
458906b151 | ||
|
98b08c2ad1 | ||
|
03841e4181 | ||
|
d63f637253 | ||
|
18cfe18950 | ||
|
a3c29fbca6 | ||
|
b078e1a849 | ||
|
2584adfd87 | ||
|
b0f6ac1248 | ||
|
4e9c3358d1 | ||
|
59d57338a5 | ||
|
0060ba6c18 | ||
|
560b90d02c | ||
|
a2e2d5133b | ||
|
b43a1e76da | ||
|
854814475c | ||
|
bf8cd35508 | ||
|
6dbcda6026 | ||
|
afa93c8b84 | ||
|
388da69793 | ||
|
9e8c277cf3 | ||
|
89dfa319f3 | ||
|
abbacdf2a0 | ||
|
ec72d90140 | ||
|
d25d0c2465 | ||
|
1de08b05b2 | ||
|
03f4ced2c7 | ||
|
13b531c763 | ||
|
2f12e54fbc | ||
|
8f790eeca0 | ||
|
a9468c8cd9 | ||
|
ec7a0512f6 | ||
|
98443715d9 | ||
|
beef8d6892 | ||
|
bb56998a4e | ||
|
ba94d8a6fa | ||
|
372e8aa031 | ||
|
e750ace40a | ||
|
26261236ba | ||
|
6773eb3e0b | ||
|
e0467c0a39 | ||
|
d7941be664 | ||
|
23b8161ac2 | ||
|
c1243c5198 | ||
|
270d9f1e0b | ||
|
962356af9c | ||
|
5a7e4693fc | ||
|
d790223700 | ||
|
a5b816aa59 | ||
|
45c13c5409 | ||
|
c253c55a8c | ||
|
ce6e49a3f9 | ||
|
8657955c92 | ||
|
a97b87da68 | ||
|
09ee19e72b | ||
|
e939f887c4 | ||
|
63c01ba736 | ||
|
dbfda5bad4 | ||
|
d0bc360907 | ||
|
bf493e359b | ||
|
ca1ccc204f | ||
|
575ebc1fd4 | ||
|
881f34ac56 | ||
|
3b85a116ff | ||
|
3bb0e20add | ||
|
7f8e5b00dc | ||
|
057984b87c | ||
|
dcf5c57fc2 | ||
|
162a181b04 | ||
|
8534f2843e | ||
|
b882265f84 | ||
|
72bd221bb4 | ||
|
266f013880 | ||
|
9d4d111555 | ||
|
4760b3d0c3 | ||
|
359918c1cb | ||
|
77894a34ce | ||
|
4e6f58584e | ||
|
eb64940d36 | ||
|
8ec43e7618 | ||
|
d62421adcb | ||
|
422076d6c9 | ||
|
2a572aab21 | ||
|
f32775ba47 | ||
|
619a533b8f | ||
|
80317444d8 | ||
|
2aaeed67c4 | ||
|
5ea5dd34b6 | ||
|
eee494f046 | ||
|
fca10c0975 | ||
|
e51c319648 | ||
|
ef77e95f87 | ||
|
0cf6fac7a3 | ||
|
7f9d47b3aa | ||
|
545c987a8a | ||
|
ac5e68b3ed | ||
|
3c3aa900b6 | ||
|
bd01cbff9a | ||
|
ada06e218e | ||
|
30f37beed2 | ||
|
1db9123297 | ||
|
3c02cb32b2 | ||
|
fcba22988f | ||
|
6c44cecc64 | ||
|
3ff10dc8ed | ||
|
6d32be3eb3 | ||
|
07c5716374 | ||
|
aa3a797edb | ||
|
9c0eee0aad | ||
|
884a402c0c | ||
|
a812910f85 | ||
|
79012b4b21 | ||
|
272c69d35a | ||
|
fa2ab80723 | ||
|
456efa7f87 | ||
|
eb40a80bac | ||
|
f7e9510472 | ||
|
337aaa0dfa | ||
|
740a4aafe1 | ||
|
c407f35322 | ||
|
16ed2f3e0c | ||
|
e87a8693bb | ||
|
32172ed82d | ||
|
971893c7b4 | ||
|
58e2f74f7f | ||
|
08465e3f39 | ||
|
cbaf198bd1 | ||
|
aefbd2e903 | ||
|
4be45342b7 | ||
|
0c7ba23621 | ||
|
9e250e62be | ||
|
e8ad95b083 | ||
|
f985a50f31 | ||
|
bf0d5c551e | ||
|
a1722ac2e0 | ||
|
974f18505b | ||
|
b65ebce4d6 | ||
|
557d0a02d9 | ||
|
28e9b46634 | ||
|
bc1070a7fd | ||
|
dbfc990701 | ||
|
8d37f3fa0f | ||
|
6903f9b89f | ||
|
0642427080 | ||
|
04188f8606 | ||
|
70ee8abae8 | ||
|
e143873337 | ||
|
d72329c007 | ||
|
4cbb8a8560 | ||
|
6640f05233 | ||
|
8a58af86b1 | ||
|
b8629f324f | ||
|
2d30d718a0 | ||
|
3842e813d6 | ||
|
7f29f8df85 | ||
|
03f80edfcd | ||
|
264760aaf5 | ||
|
1c89bf7ede | ||
|
52f4e5fb48 | ||
|
c48de5924a | ||
|
4e7d946214 | ||
|
e1bd84d7f3 | ||
|
6a45921f41 | ||
|
25c99a7e04 | ||
|
759d3f8709 | ||
|
e5fdbfd1e1 | ||
|
b51ebabbf4 | ||
|
304893c139 | ||
|
3e042e093b | ||
|
da13915d1e | ||
|
aa9effbf4e | ||
|
f154cf1cec | ||
|
555c7c46c6 | ||
|
c259138225 | ||
|
0bc6a9ba5e | ||
|
da518914c1 | ||
|
a5f18087cd | ||
|
6322497023 | ||
|
85ebba5e39 | ||
|
540dffda05 | ||
|
7b148d8db0 | ||
|
ba930668ba | ||
|
ac16d0e882 | ||
|
6440521f81 | ||
|
dcc684ea28 | ||
|
87702f0f7d | ||
|
f219feda2c | ||
|
bfe8ee8127 | ||
|
90902f1364 | ||
|
cdc3551ad3 | ||
|
f97a20a9cc | ||
|
0357024e62 | ||
|
9afcc91ae1 | ||
|
aae9ec0492 | ||
|
8b7b45b301 | ||
|
17dd802be3 | ||
|
c0731ee9b5 | ||
|
953989d344 | ||
|
080edcdb81 | ||
|
53e0a2e5e2 | ||
|
079ef10e1f | ||
|
b02dd7ca53 | ||
|
919cb2ae75 | ||
|
5f7d9b8c11 | ||
|
3411625177 | ||
|
32ccec317a | ||
|
7f8926e0c1 | ||
|
1af74e50ad | ||
|
8da2464831 | ||
|
b5125e566c | ||
|
5e75a1fb99 | ||
|
0e4f2a3864 | ||
|
4e4db36c11 | ||
|
18f7bfe33f | ||
|
103b6eb194 | ||
|
ae34141b7a | ||
|
292670cfa2 | ||
|
9ae379bc31 | ||
|
8908f4a933 | ||
|
60acfae417 | ||
|
092fe96676 | ||
|
1cb225c0ba | ||
|
ef6b15bda2 | ||
|
aff8566957 | ||
|
374ba7fc7d | ||
|
c1f522c10e | ||
|
5fe90bb180 | ||
|
fe71635603 | ||
|
97393bbe45 | ||
|
b34d036647 | ||
|
7d1fced672 | ||
|
e50cf278cd | ||
|
5b11e6bffd | ||
|
a6ac9456b5 | ||
|
ddf4c28789 | ||
|
139fffe6e0 | ||
|
c1d6ddf361 | ||
|
b72292edd1 | ||
|
3429e1bf31 | ||
|
cf6eef4841 | ||
|
99a029c7c4 | ||
|
f061557aad | ||
|
8173eb4509 | ||
|
a3b5484587 | ||
|
63513259c0 | ||
|
966a5e6dea | ||
|
91c5d5feb8 | ||
|
2d3469909b | ||
|
e35e2c73d3 | ||
|
68f1260f2c | ||
|
c10fdcff2c | ||
|
e496f33455 | ||
|
9e967ce5ed | ||
|
ec7a9d7281 | ||
|
081db26359 | ||
|
40cca2379e | ||
|
c2600e64a5 | ||
|
ec09309aa8 | ||
|
e3402ac676 | ||
|
76f0b2d037 | ||
|
2748ac6df5 | ||
|
d291929bd2 | ||
|
36ac327d7b | ||
|
0e22adc598 | ||
|
6dcba8f492 | ||
|
a25fea0809 | ||
|
c000c2f1e0 | ||
|
a77a98dc41 | ||
|
0beacd7680 | ||
|
6e5ac2843d | ||
|
58e659f33f | ||
|
8df347c093 | ||
|
baff1b349c | ||
|
03d78693a3 | ||
|
8ddd336c38 | ||
|
ff85841dab | ||
|
97d7f3fb05 | ||
|
8abcf3d0a9 | ||
|
ee208dd6f0 | ||
|
2d76507561 | ||
|
0ce8ad7a2b | ||
|
da8cd6a10d | ||
|
9fa9f6cdc1 | ||
|
66b906378f | ||
|
afe994f252 | ||
|
335e0503c9 | ||
|
9970d6f657 | ||
|
9fff38de2b |
@ -1,29 +0,0 @@
|
||||
version: '{build}'
|
||||
|
||||
image:
|
||||
- Visual Studio 2015
|
||||
- Ubuntu1604
|
||||
- Ubuntu1804
|
||||
|
||||
skip_branch_with_pr: true
|
||||
|
||||
clone_depth: 1
|
||||
|
||||
init:
|
||||
- ps: Update-AppveyorBuild -Version "build-$env:APPVEYOR_BUILD_NUMBER-$($env:APPVEYOR_REPO_COMMIT.substring(0,7))"
|
||||
|
||||
install: git submodule update --init --recursive
|
||||
|
||||
build_script:
|
||||
- cmd: >-
|
||||
src\BuildAll.cmd
|
||||
exit %errorlevel%
|
||||
- sh: >-
|
||||
./configure && make package -C tmp
|
||||
|
||||
artifacts:
|
||||
- path: output\pkg\*\*
|
||||
name: Windows
|
||||
|
||||
- path: build/*.deb
|
||||
name: Ubuntu
|
14
.ci/appveyor-deb-install-test.sh
Executable file
14
.ci/appveyor-deb-install-test.sh
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
|
||||
BUILD_BINARIESDIRECTORY="${BUILD_BINARIESDIRECTORY:-build}"
|
||||
|
||||
sudo dpkg -i $BUILD_BINARIESDIRECTORY/softether-common*.deb
|
||||
sudo dpkg -i $BUILD_BINARIESDIRECTORY/softether-vpnbridge*.deb
|
||||
sudo dpkg -i $BUILD_BINARIESDIRECTORY/softether-vpnclient*.deb
|
||||
sudo dpkg -i $BUILD_BINARIESDIRECTORY/softether-vpncmd*.deb
|
||||
sudo dpkg -i $BUILD_BINARIESDIRECTORY/softether-vpnserver*.deb
|
||||
|
||||
sudo systemctl restart softether-vpnserver || (sudo journalctl -xe --no-pager >> systemctl.log && appveyor PushArtifact systemctl.log && exit 1)
|
||||
|
25
.ci/appveyor-vpntest.ps1
Normal file
25
.ci/appveyor-vpntest.ps1
Normal file
@ -0,0 +1,25 @@
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
if (Test-Path "env:BUILD_BINARIESDIRECTORY") {
|
||||
$BUILD_BINARIESDIRECTORY = $env:BUILD_BINARIESDIRECTORY
|
||||
} else {
|
||||
$BUILD_BINARIESDIRECTORY = "build"
|
||||
}
|
||||
|
||||
# ('s', 'c', 'b', 'sm', 'cm') ??
|
||||
('s', 'c', 'b') | % {
|
||||
|
||||
[String] $mode = $_
|
||||
Write-Host "testing: $mode"
|
||||
|
||||
$full = (Write-Output "q\n" | & "$BUILD_BINARIESDIRECTORY\vpntest.exe" $mode)
|
||||
$t = ($full | Select-String -Pattern 'NO MEMORY LEAKS' -CaseSensitive)
|
||||
|
||||
if (($t).Count -ne 1) {
|
||||
$full
|
||||
Write-Error 'failed'
|
||||
return $false
|
||||
} else {
|
||||
Write-Host 'ok'
|
||||
}
|
||||
}
|
23
.ci/build-libressl.sh
Executable file
23
.ci/build-libressl.sh
Executable file
@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
set -eux
|
||||
|
||||
download_libressl () {
|
||||
if [[ ! -f "download-cache/librenssl-${LIBRESSL_VERSION}.tar.gz" ]]; then
|
||||
wget -P download-cache/ \
|
||||
"https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-${LIBRESSL_VERSION}.tar.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
build_libressl () {
|
||||
if [[ "$(cat ${OPENSSL_INSTALL_DIR}/.openssl-version)" != "${LIBRESSL_VERSION}" ]]; then
|
||||
tar zxf "download-cache/libressl-${LIBRESSL_VERSION}.tar.gz"
|
||||
cd "libressl-${LIBRESSL_VERSION}/"
|
||||
./configure --prefix="${OPENSSL_INSTALL_DIR}"
|
||||
make -j $(nproc || sysctl -n hw.ncpu || echo 4) all
|
||||
make install
|
||||
echo "${LIBRESSL_VERSION}" > "${OPENSSL_INSTALL_DIR}/.openssl-version"
|
||||
fi
|
||||
}
|
||||
|
||||
download_libressl
|
||||
build_libressl
|
@ -12,8 +12,9 @@ build_openssl () {
|
||||
if [[ "$(cat ${OPENSSL_INSTALL_DIR}/.openssl-version)" != "${OPENSSL_VERSION}" ]]; then
|
||||
tar zxf "download-cache/openssl-${OPENSSL_VERSION}.tar.gz"
|
||||
cd "openssl-${OPENSSL_VERSION}/"
|
||||
./config shared --prefix="${OPENSSL_INSTALL_DIR}" --openssldir="${OPENSSL_INSTALL_DIR}" -DPURIFY
|
||||
make all install_sw
|
||||
./config shared no-deprecated --prefix="${OPENSSL_INSTALL_DIR}" --openssldir="${OPENSSL_INSTALL_DIR}" -DPURIFY
|
||||
make -j $(nproc || sysctl -n hw.ncpu || echo 4) all
|
||||
make install_sw
|
||||
echo "${OPENSSL_VERSION}" > "${OPENSSL_INSTALL_DIR}/.openssl-version"
|
||||
fi
|
||||
}
|
||||
|
@ -1,17 +0,0 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
RUN_COVERITY="${RUN_COVERITY:-0}"
|
||||
|
||||
export COVERITY_SCAN_PROJECT_NAME="SoftEtherVPN/SoftEtherVPN"
|
||||
export COVERITY_SCAN_BRANCH_PATTERN="master"
|
||||
export COVERITY_SCAN_NOTIFICATION_EMAIL="chipitsine@gmail.com"
|
||||
export COVERITY_SCAN_BUILD_COMMAND_PREPEND="./configure"
|
||||
export COVERITY_SCAN_BUILD_COMMAND="make -C tmp"
|
||||
|
||||
if [ "${RUN_COVERITY}" = "1" ]; then
|
||||
# Ignore exit code, script exits with 1 if we're not on the right branch
|
||||
curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash || true
|
||||
else
|
||||
echo "Skipping coverity scan because \$RUN_COVERITY != \"1\""
|
||||
fi
|
7
.ci/memory-leak-test.sh
Executable file
7
.ci/memory-leak-test.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eux
|
||||
|
||||
echo -n | ./build/vpntest s | grep -Fq 'NO MEMORY LEAKS'
|
||||
echo -n | ./build/vpntest c | grep -Fq 'NO MEMORY LEAKS'
|
||||
echo -n | ./build/vpntest b | grep -Fq 'NO MEMORY LEAKS'
|
35
.ci/run-openvpn-tests.sh
Executable file
35
.ci/run-openvpn-tests.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
|
||||
BUILD_BINARIESDIRECTORY="${BUILD_BINARIESDIRECTORY:-build}"
|
||||
|
||||
cd $BUILD_BINARIESDIRECTORY
|
||||
|
||||
git clone https://github.com/openvpn/openvpn
|
||||
cd openvpn
|
||||
autoreconf -iv
|
||||
./configure > build.log 2>&1 || (cat build.log && exit 1)
|
||||
make > build.log 2>&1 || (cat build.log && exit 1)
|
||||
|
||||
echo test > /tmp/auth.txt
|
||||
echo test >> /tmp/auth.txt
|
||||
|
||||
CONFIG=`ls /tmp/*l3*ovpn`
|
||||
|
||||
cat << EOF > tests/t_client.rc
|
||||
CA_CERT=fake
|
||||
TEST_RUN_LIST="1 2"
|
||||
|
||||
OPENVPN_BASE="--config $CONFIG --auth-user-pass /tmp/auth.txt"
|
||||
|
||||
RUN_TITLE_1="testing udp/ipv4"
|
||||
OPENVPN_CONF_1="--dev null --proto udp --port 1194 \$OPENVPN_BASE"
|
||||
|
||||
RUN_TITLE_2="testing tcp/ipv4"
|
||||
OPENVPN_CONF_2="--dev null --proto tcp --port 1194 \$OPENVPN_BASE"
|
||||
EOF
|
||||
|
||||
sed -i 's/^remote.*$/remote 127.0.0.1 1194/g' /tmp/*l3*ovpn
|
||||
|
||||
make test_scripts=t_client.sh check
|
12
.ci/sonarcloud.sh
Executable file
12
.ci/sonarcloud.sh
Executable file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
RUN_SONARCLOUD="${RUN_SONARCLOUD:-0}"
|
||||
|
||||
if [ "${RUN_SONARCLOUD}" = "1" ] && [ ! -z ${SONAR_TOKEN+x} ]; then
|
||||
./configure
|
||||
build-wrapper-linux-x86-64 --out-dir bw-output make -C build
|
||||
sonar-scanner -Dsonar.projectKey=SoftEtherVPN_SoftEtherVPN -Dsonar.organization=softethervpn -Dsonar.sources=. -Dsonar.cfamily.build-wrapper-output=bw-output -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${SONAR_TOKEN}
|
||||
else
|
||||
echo "Skipping sonar-scan because \$RUN_SONARCLOUD != \"1\" or \$SONAR_TOKEN is not set"
|
||||
fi
|
42
.ci/start-se-openvpn.sh
Executable file
42
.ci/start-se-openvpn.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -eux
|
||||
|
||||
BUILD_BINARIESDIRECTORY="${BUILD_BINARIESDIRECTORY:-build}"
|
||||
|
||||
cd $BUILD_BINARIESDIRECTORY
|
||||
|
||||
./vpnserver start
|
||||
|
||||
#
|
||||
# wait until server listen 443
|
||||
#
|
||||
set +e
|
||||
started="false"
|
||||
for i in 1 2 3 4 5 6
|
||||
do
|
||||
s=$(echo exit | telnet 127.0.0.1 443 | grep "Connected")
|
||||
if [ "$s" != "" ]
|
||||
then
|
||||
started="true"
|
||||
break
|
||||
fi
|
||||
sleep 10
|
||||
done
|
||||
|
||||
set -e
|
||||
|
||||
if [ "$started" == "false" ]
|
||||
then
|
||||
echo "vpnserver is not listening 127.0.0.1:443"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
./vpncmd 127.0.0.1:443 /SERVER /HUB:DEFAULT /CMD:SecureNatEnable
|
||||
./vpncmd 127.0.0.1:443 /SERVER /CMD:"ProtoOptionsSet OpenVPN /NAME:Enabled /VALUE:True"
|
||||
./vpncmd 127.0.0.1:443 /SERVER /CMD:"PortsUDPSet 1194"
|
||||
./vpncmd 127.0.0.1:443 /SERVER /HUB:DEFAULT /CMD:"UserCreate test /GROUP:none /REALNAME:none /NOTE:none"
|
||||
./vpncmd 127.0.0.1:443 /SERVER /HUB:DEFAULT /CMD:"UserPasswordSet test /PASSWORD:test"
|
||||
./vpncmd 127.0.0.1:443 /SERVER /CMD:"OpenVpnMakeConfig my_openvpn_config.zip"
|
||||
|
||||
unzip -d /tmp my_openvpn_config.zip
|
5
.ci/vpntools-check.sh
Executable file
5
.ci/vpntools-check.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eux
|
||||
|
||||
./build/vpncmd /tools /cmd:check
|
25
.cirrus.yml
Normal file
25
.cirrus.yml
Normal file
@ -0,0 +1,25 @@
|
||||
FreeBSD_task:
|
||||
matrix:
|
||||
env:
|
||||
SSL: openssl
|
||||
OPENSSL_ROOT_DIR: /usr/local
|
||||
env:
|
||||
SSL: openssl32
|
||||
OPENSSL_ROOT_DIR: /usr/local
|
||||
env:
|
||||
# base openssl
|
||||
SSL:
|
||||
matrix:
|
||||
freebsd_instance:
|
||||
image_family: freebsd-14-2
|
||||
prepare_script:
|
||||
- pkg install -y pkgconf cmake git libsodium cpu_features $SSL
|
||||
- git submodule update --init --recursive
|
||||
configure_script:
|
||||
- CMAKE_FLAGS="-DUSE_SYSTEM_CPU_FEATURES=1" CFLAGS="-I/usr/local/include/cpu_features" ./configure
|
||||
build_script:
|
||||
- make -j $(sysctl -n hw.ncpu || echo 4) -C build
|
||||
test_script:
|
||||
- ldd build/vpnserver
|
||||
- .ci/memory-leak-test.sh
|
||||
- .ci/vpntools-check.sh
|
47
.github/ISSUE_TEMPLATE.md
vendored
47
.github/ISSUE_TEMPLATE.md
vendored
@ -1,47 +0,0 @@
|
||||
Hi, there!
|
||||
|
||||
Thank you for using SoftEther.
|
||||
|
||||
Before you submit an issue, please read the following:
|
||||
|
||||
Is this a question?
|
||||
|
||||
- If the answer is "yes", then please ask your question on [www.vpnusers.com](http://www.vpnusers.com).
|
||||
The issue section on GitHub is reserved for bugs and feature requests.
|
||||
|
||||
- If the answer is "no", please read the following:
|
||||
|
||||
We provide a template which is specifically made for bug reports, in order to be sure that the report includes enough details to be helpful.
|
||||
|
||||
Please use or adapt it as needed.
|
||||
|
||||
---
|
||||
|
||||
### Prerequisites
|
||||
|
||||
* [ ] Can you reproduce?
|
||||
* [ ] Are you running the latest version of SoftEtherVPN?
|
||||
|
||||
**SoftEther version:**
|
||||
**Component:** [Server, Client, Bridge, etc.]
|
||||
**Operating system:** [Windows, Linux, BSD, macOS, etc.]
|
||||
**Architecture:** [64 bit, 32 bit]
|
||||
|
||||
[In case it's a computer with known specs, such as the Raspberry Pi, you can specify it omitting the details.]
|
||||
**Processor:** [Specify brand and model. Example: AMD Ryzen 7 1800x]
|
||||
|
||||
### Description
|
||||
|
||||
[Description of the bug]
|
||||
|
||||
**Expected behavior:**
|
||||
[What you expected to happen]
|
||||
|
||||
**Actual behavior:**
|
||||
[What actually happened]
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
1. [First step]
|
||||
2. [Second step]
|
||||
3. [And so on...]
|
87
.github/ISSUE_TEMPLATE/bug_report_or_issue_report.yml
vendored
Normal file
87
.github/ISSUE_TEMPLATE/bug_report_or_issue_report.yml
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
name: Bug Report or Issue Report
|
||||
description: File a bug report or an issue report
|
||||
labels: "needs-triage"
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report!
|
||||
We provide a template which is specifically made for bug reports, to be sure that the report includes enough details to be helpful.
|
||||
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Are you using SoftEther VPN 5.x?
|
||||
description: |
|
||||
This issue tracker is for SoftEther VPN Developer Edition versioned 5.x.
|
||||
Please report issues about SoftEther VPN Stable Edition versioned 4.x through the correct path.
|
||||
See also [the top of the issue tracker](https://github.com/SoftEtherVPN/SoftEtherVPN/issues/new/choose).
|
||||
options:
|
||||
- label: Yes, I'm using SoftEther VPN 5.x, not 4.x.
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Version
|
||||
description: |
|
||||
The exact version you are using.
|
||||
It would be very nice if you let us know version tag or commit hash.
|
||||
placeholder: "5.02.5180 / 09b7e4f / 5.01.9674+git20200806+8181039+dfsg2-2build1"
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: Component
|
||||
description: Which component did you encounter an issue with?
|
||||
multiple: true
|
||||
options:
|
||||
- VPN Server
|
||||
- VPN Bridge
|
||||
- VPN Client
|
||||
- VPN Tools
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating system & version
|
||||
placeholder: "Windows 11 Pro 23H2 / Ubuntu 22.04 / FreeBSD 14.0 / macOS Sonoma / Independent"
|
||||
description: |
|
||||
Let us know about your operating system and version.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Architecture or Hardware model
|
||||
placeholder: "amd64 / aarch64 / Raspberry Pi 4B+ / Apple M2"
|
||||
description: |
|
||||
Necessary if your issue is architecture-specific.
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
placeholder: Having detailed steps helps us reproduce the bug.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: ✔️ Expected Behavior
|
||||
placeholder: What do you expect to happen?
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: ❌ Actual Behavior
|
||||
placeholder: What happened actually?
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Anything else?
|
||||
description: |
|
||||
Links? References?
|
||||
Anything that will give us more context about the issue you are encountering!
|
||||
|
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
contact_links:
|
||||
- name: Are you using SoftEther VPN 4.x?
|
||||
about: This repository is for SoftEther VPN 5.x Developer Edition, developed independently from SoftEther VPN 4.x. Visit vpnusers.com if you would like to report issues or ask questions about version 4.x!
|
||||
url: https://www.vpnusers.com/
|
||||
|
||||
- name: Questions about SoftEtherVPN 5.x
|
||||
about: Visit Discussions to ask community to help.
|
||||
url: https://github.com/SoftEtherVPN/SoftEtherVPN/discussions/new?category=q-a
|
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -3,17 +3,3 @@ Changes proposed in this pull request:
|
||||
-
|
||||
-
|
||||
|
||||
Your great patch is much appreciated. We are considering to apply your patch into the SoftEther VPN main tree.
|
||||
|
||||
SoftEther VPN Patch Acceptance Policy:
|
||||
http://www.softether.org/5-download/src/9.patch
|
||||
|
||||
You have two options which are described on the above policy.
|
||||
Could you please choose either option 1 or 2, and specify it clearly on the reply?
|
||||
|
||||
-
|
||||
|
||||
PRELIMINARY DECLARATION FOR FUTURE SWITCH TO A NON-GPL LICENSE
|
||||
|
||||
I hereby agree in advance that my work will be licensed automatically under the Apache License or a similar BSD/MIT-like open-source license in case the SoftEther VPN Project adopts such a license in future.
|
||||
|
||||
|
39
.github/workflows/build_source_release.yml
vendored
Normal file
39
.github/workflows/build_source_release.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
name: Build Source Release
|
||||
|
||||
# Trigger whenever a release is created
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: archive
|
||||
id: archive
|
||||
run: |
|
||||
VERSION=${{ github.event.release.tag_name }}
|
||||
PKGNAME="SoftEtherVPN-$VERSION"
|
||||
mkdir -p /tmp/$PKGNAME
|
||||
mv * /tmp/$PKGNAME
|
||||
mv /tmp/$PKGNAME .
|
||||
TARBALL=$PKGNAME.tar.xz
|
||||
tar cJf $TARBALL $PKGNAME
|
||||
echo "tarball=$TARBALL" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: upload tarball
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./${{ steps.archive.outputs.tarball }}
|
||||
asset_name: ${{ steps.archive.outputs.tarball }}
|
||||
asset_content_type: application/gzip
|
43
.github/workflows/coverity.yml
vendored
Normal file
43
.github/workflows/coverity.yml
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
|
||||
name: Coverity
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
scan:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install apt dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y cmake gcc g++ libncurses5-dev libreadline-dev libssl-dev make zlib1g-dev libsodium-dev
|
||||
- name: Download Coverity build tool
|
||||
run: |
|
||||
wget -c -N https://scan.coverity.com/download/linux64 --post-data "token=${{ secrets.COVERITY_SCAN_TOKEN }}&project=SoftEtherVPN%2FSoftEtherVPN" -O coverity_tool.tar.gz
|
||||
mkdir coverity_tool
|
||||
tar xzf coverity_tool.tar.gz --strip 1 -C coverity_tool
|
||||
- name: Configure
|
||||
run: |
|
||||
./configure
|
||||
- name: Build with Coverity build tool
|
||||
run: |
|
||||
export PATH=`pwd`/coverity_tool/bin:$PATH
|
||||
cov-build --dir cov-int make -C build
|
||||
- name: Submit build result to Coverity Scan
|
||||
run: |
|
||||
tar czvf cov.tar.gz cov-int
|
||||
curl --form token=${{ secrets.COVERITY_SCAN_TOKEN }} \
|
||||
--form email=chipitsine@gmail.com \
|
||||
--form file=@cov.tar.gz \
|
||||
--form version="Commit $GITHUB_SHA" \
|
||||
--form description="Build submitted via CI" \
|
||||
https://scan.coverity.com/builds?project=SoftEtherVPN%2FSoftEtherVPN
|
98
.github/workflows/docker-aio.yml
vendored
Normal file
98
.github/workflows/docker-aio.yml
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
name: docker-aio
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
tags:
|
||||
- '*'
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
name: docker-aio
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.repository_owner == 'SoftEtherVPN' }}
|
||||
steps:
|
||||
-
|
||||
name: Docker meta vpnserver
|
||||
id: metavpnserver
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ github.repository_owner }}/vpnserver
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
-
|
||||
name: Docker meta vpnclient
|
||||
id: metavpnclient
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ github.repository_owner }}/vpnclient
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
-
|
||||
name: Docker meta vpnbridge
|
||||
id: metavpnbridge
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ github.repository_owner }}/vpnbridge
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
image: tonistiigi/binfmt:qemu-v9.2.0
|
||||
#
|
||||
# TODO: unpin qemu version after default is updated
|
||||
#
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
-
|
||||
name: Login to DockerHub
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Build and push vpnserver
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
file: ./Dockerfile
|
||||
target: vpnserver
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ steps.metavpnserver.outputs.tags }}
|
||||
labels: ${{ steps.metavpnserver.outputs.labels }}
|
||||
-
|
||||
name: Build and push vpnclient
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
file: ./Dockerfile
|
||||
target: vpnclient
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ steps.metavpnclient.outputs.tags }}
|
||||
labels: ${{ steps.metavpnclient.outputs.labels }}
|
||||
-
|
||||
name: Build and push vpnbridge
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
file: ./Dockerfile
|
||||
target: vpnbridge
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ steps.metavpnbridge.outputs.tags }}
|
||||
labels: ${{ steps.metavpnbridge.outputs.labels }}
|
34
.github/workflows/fedora-rawhide.yml
vendored
Normal file
34
.github/workflows/fedora-rawhide.yml
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
name: Fedora/Rawhide
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 25 * *"
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build_and_test:
|
||||
strategy:
|
||||
matrix:
|
||||
cc: [ gcc, clang ]
|
||||
name: ${{ matrix.cc }}
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: fedora:rawhide
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
dnf -y install git cmake ncurses-devel openssl-devel-engine libsodium-devel readline-devel zlib-devel gcc-c++ clang google-cpu_features-devel
|
||||
- name: Compile with ${{ matrix.cc }}
|
||||
run: |
|
||||
export CC=${{ matrix.cc }}
|
||||
CMAKE_FLAGS="-DUSE_SYSTEM_CPU_FEATURES=1" CFLAGS="-I/usr/include/cpu_features" ./configure
|
||||
make -C build
|
||||
|
41
.github/workflows/linux.yml
vendored
Normal file
41
.github/workflows/linux.yml
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build_and_test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Install dependencies
|
||||
run: sudo apt update && sudo apt-get -y install cmake gcc g++ ninja-build libncurses5-dev libreadline-dev libsodium-dev libssl-dev make zlib1g-dev liblz4-dev libnl-genl-3-dev
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
|
||||
cmake --build .
|
||||
|
||||
- name: Build deb packages
|
||||
run: |
|
||||
cd build
|
||||
cpack -C Release -G DEB
|
||||
|
||||
- name: Upload DEB packages as artifacts
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: deb-packages
|
||||
path: build/*.deb
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
.ci/appveyor-deb-install-test.sh
|
||||
sudo apt-get -y install autoconf libtool liblzo2-dev libpam-dev fping unzip libcap-ng-dev # To build OpenVPN
|
||||
sudo .ci/start-se-openvpn.sh
|
||||
sudo .ci/run-openvpn-tests.sh
|
28
.github/workflows/macos.yml
vendored
Normal file
28
.github/workflows/macos.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build_and_test:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-15, macos-14, macos-13]
|
||||
name: ${{ matrix.os }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install libsodium
|
||||
- name: Compile
|
||||
run: |
|
||||
./configure
|
||||
make -C build
|
||||
- name: Test
|
||||
run: |
|
||||
otool -L build/vpnserver
|
||||
.ci/memory-leak-test.sh
|
||||
|
23
.github/workflows/musl.yml
vendored
Normal file
23
.github/workflows/musl.yml
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
name: alpine/musl
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
musl:
|
||||
name: gcc
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: alpine:latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install dependencies
|
||||
run: apk add binutils --no-cache build-base readline-dev openssl-dev ncurses-dev git cmake zlib-dev libsodium-dev gnu-libiconv
|
||||
- name: Configure
|
||||
run: ./configure
|
||||
- name: make
|
||||
run: make -C build
|
16
.github/workflows/stb_check.yml
vendored
Normal file
16
.github/workflows/stb_check.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
submodules: true
|
||||
- name: Check
|
||||
run: |
|
||||
cd developer_tools/stbchecker
|
||||
dotnet run ../../src/bin/hamcore
|
63
.github/workflows/windows.yml
vendored
Normal file
63
.github/workflows/windows.yml
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build_and_test:
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [
|
||||
{ ARCHITECTURE: x86, COMPILER_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/bin/clang-cl.exe", VCPKG_TRIPLET: "x86-windows-static", VCVARS_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars32.bat"},
|
||||
{ ARCHITECTURE: x64, COMPILER_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/x64/bin/clang-cl.exe", VCPKG_TRIPLET: "x64-windows-static", VCVARS_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"}
|
||||
]
|
||||
runs-on: windows-latest
|
||||
name: ${{ matrix.platform.ARCHITECTURE }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache vcpkg
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'build/vcpkg_installed/'
|
||||
key: vcpkg-${{ matrix.platform.VCPKG_TRIPLET }}
|
||||
- name: Set version variables
|
||||
run: |
|
||||
$v = python version.py
|
||||
echo "VERSION=$v" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||
shell: pwsh
|
||||
- name: Build
|
||||
env:
|
||||
ARCHITECTURE: ${{ matrix.platform.ARCHITECTURE }}
|
||||
COMPILER_PATH: ${{ matrix.platform.COMPILER_PATH }}
|
||||
VCPKG_TRIPLET: ${{ matrix.platform.VCPKG_TRIPLET }}
|
||||
VCVARS_PATH: ${{ matrix.platform.VCVARS_PATH }}
|
||||
run: |
|
||||
set BUILD_NUMBER=0
|
||||
mkdir build
|
||||
cd build
|
||||
call "%VCVARS_PATH%"
|
||||
cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE="C:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=%VCPKG_TRIPLET% -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER="%COMPILER_PATH%" -DCMAKE_CXX_COMPILER="%COMPILER_PATH%" -DBUILD_NUMBER=%BUILD_NUMBER% ..
|
||||
cmake --build .
|
||||
mkdir installers
|
||||
vpnsetup /SFXMODE:vpnclient /SFXOUT:"installers\softether-vpnclient-%VERSION%.%BUILD_NUMBER%.%ARCHITECTURE%.exe"
|
||||
vpnsetup /SFXMODE:vpnserver_vpnbridge /SFXOUT:"installers\softether-vpnserver_vpnbridge-%VERSION%.%BUILD_NUMBER%.%ARCHITECTURE%.exe"
|
||||
shell: cmd
|
||||
- name: Test
|
||||
shell: powershell
|
||||
run: |
|
||||
. .ci/appveyor-vpntest.ps1
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Binaries-${{ matrix.platform.ARCHITECTURE }}
|
||||
path: |
|
||||
build/*.exe
|
||||
build/*.pdb
|
||||
build/*.se2
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Installers-${{ matrix.platform.ARCHITECTURE }}
|
||||
path: build/installers
|
94
.github/workflows/windows_release.yml
vendored
Normal file
94
.github/workflows/windows_release.yml
vendored
Normal file
@ -0,0 +1,94 @@
|
||||
name: "Release"
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
concurrency:
|
||||
group: "${{ github.workflow }}-${{ github.ref }}"
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: windows-latest
|
||||
outputs:
|
||||
upload_url: "${{ steps.create_release.outputs.upload_url }}"
|
||||
steps:
|
||||
- name: "Checkout repository"
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: "Create GitHub release"
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v1
|
||||
build-windows:
|
||||
name: ${{ matrix.platform.ARCHITECTURE }}
|
||||
runs-on: windows-latest
|
||||
needs: ["release"]
|
||||
strategy:
|
||||
matrix:
|
||||
platform: [
|
||||
{ ARCHITECTURE: x86, COMPILER_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/bin/clang-cl.exe", VCPKG_TRIPLET: "x86-windows-static", VCVARS_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars32.bat"},
|
||||
{ ARCHITECTURE: x64, COMPILER_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/x64/bin/clang-cl.exe", VCPKG_TRIPLET: "x64-windows-static", VCVARS_PATH: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat"}
|
||||
]
|
||||
steps:
|
||||
- name: "Checkout repository"
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
- name: Cache vcpkg
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: 'build/vcpkg_installed/'
|
||||
key: vcpkg-release-${{ matrix.platform.VCPKG_TRIPLET }}
|
||||
- name: Set version variables
|
||||
run: |
|
||||
$b=(Get-Content CMakeSettings.json | Out-String | ConvertFrom-Json).environments.BuildNumber
|
||||
echo "BUILD_NUMBER=$b" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||
$v = python version.py
|
||||
echo "VERSION=$v" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
|
||||
shell: pwsh
|
||||
- name: Build
|
||||
env:
|
||||
ARCHITECTURE: ${{ matrix.platform.ARCHITECTURE }}
|
||||
COMPILER_PATH: ${{ matrix.platform.COMPILER_PATH }}
|
||||
VCPKG_TRIPLET: ${{ matrix.platform.VCPKG_TRIPLET }}
|
||||
VCVARS_PATH: ${{ matrix.platform.VCVARS_PATH }}
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
call "%VCVARS_PATH%"
|
||||
cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE="C:\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=%VCPKG_TRIPLET% -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER="%COMPILER_PATH%" -DCMAKE_CXX_COMPILER="%COMPILER_PATH%" -DBUILD_NUMBER=%BUILD_NUMBER% ..
|
||||
cmake --build .
|
||||
mkdir installers
|
||||
vpnsetup /SFXMODE:vpnclient /SFXOUT:"installers\softether-vpnclient-%VERSION%.%BUILD_NUMBER%.%ARCHITECTURE%.exe"
|
||||
vpnsetup /SFXMODE:vpnserver_vpnbridge /SFXOUT:"installers\softether-vpnserver_vpnbridge-%VERSION%.%BUILD_NUMBER%.%ARCHITECTURE%.exe"
|
||||
shell: cmd
|
||||
|
||||
- name: dir
|
||||
run: |
|
||||
Get-ChildItem -Recurse build/installers
|
||||
shell: pwsh
|
||||
|
||||
- name: "Upload softether-vpnclient"
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: "${{ github.token }}"
|
||||
with:
|
||||
upload_url: "${{ needs.release.outputs.upload_url }}"
|
||||
asset_path: "build/installers/softether-vpnclient-${{ env.VERSION }}.${{ env.BUILD_NUMBER }}.${{ matrix.platform.ARCHITECTURE }}.exe"
|
||||
asset_name: "softether-vpnclient-${{ env.VERSION }}.${{ env.BUILD_NUMBER }}.${{ matrix.platform.ARCHITECTURE }}.exe"
|
||||
asset_content_type: "application/octet-stream"
|
||||
- name: "Upload softether-vpnserver_vpnbridge"
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: "${{ github.token }}"
|
||||
with:
|
||||
upload_url: "${{ needs.release.outputs.upload_url }}"
|
||||
asset_path: "build/installers/softether-vpnserver_vpnbridge-${{ env.VERSION }}.${{ env.BUILD_NUMBER }}.${{ matrix.platform.ARCHITECTURE }}.exe"
|
||||
asset_name: "softether-vpnserver_vpnbridge-${{ env.VERSION }}.${{ env.BUILD_NUMBER }}.${{ matrix.platform.ARCHITECTURE }}.exe"
|
||||
asset_content_type: "application/octet-stream"
|
||||
|
17
.gitignore
vendored
17
.gitignore
vendored
@ -2,8 +2,12 @@
|
||||
.cproject
|
||||
.project
|
||||
.settings/
|
||||
.vs/
|
||||
Makefile
|
||||
bin/
|
||||
/src/bin/*
|
||||
!/src/bin/hamcore/
|
||||
/src/bin/hamcore/*
|
||||
!/src/bin/hamcore/wwwroot/
|
||||
build/
|
||||
cmake-build-debug/
|
||||
src/bin/hamcore/authors.txt
|
||||
@ -15,8 +19,18 @@ CMakeFiles/
|
||||
output/
|
||||
Win32_Release
|
||||
x64_Release
|
||||
Win32_Debug
|
||||
x64_Debug
|
||||
/src/DebugFiles
|
||||
/src/BuildUtil/obj/
|
||||
/src/vpnweb/vpnweb.h
|
||||
/src/vpnweb/vpnweb_i.c
|
||||
/src/vpnweb/vpnweb_p.c
|
||||
*.user
|
||||
*.ncb
|
||||
*.opt
|
||||
*.suo
|
||||
!/src/BuildFiles/**/*
|
||||
|
||||
# Applied for 'developer_tools/stbchecker/'
|
||||
# Copied from by https://www.gitignore.io/api/visualstudio
|
||||
@ -195,3 +209,4 @@ developer_tools/stbchecker/**/ASALocalRun/
|
||||
developer_tools/stbchecker/**/*.binlog
|
||||
developer_tools/stbchecker/**/*.nvuser
|
||||
developer_tools/stbchecker/**/.mfractor/
|
||||
/vcpkg_installed
|
||||
|
@ -1,33 +1,11 @@
|
||||
.ubuntu: &ubuntu_def
|
||||
variables:
|
||||
CMAKE_VERSION: 3.12.1
|
||||
before_script:
|
||||
- REPOSITORY="$PWD" && cd ..
|
||||
- apt-get update && apt-get install -y dpkg-dev wget g++ gcc libncurses5-dev libreadline-dev libssl-dev make zlib1g-dev git file
|
||||
- wget https://cmake.org/files/v${CMAKE_VERSION%.*}/cmake-${CMAKE_VERSION}.tar.gz && tar -xzf cmake-${CMAKE_VERSION}.tar.gz
|
||||
- cd cmake-${CMAKE_VERSION} && ./bootstrap && make install
|
||||
- cd "$REPOSITORY" && git submodule update --init --recursive
|
||||
# illumos gitlab-runner maintained by @hww3
|
||||
build_illumos:
|
||||
only:
|
||||
- master@SoftEther/SoftEtherVPN
|
||||
tags:
|
||||
- illumos
|
||||
script:
|
||||
- ./configure
|
||||
- make package -C tmp
|
||||
|
||||
bionic:
|
||||
<<: *ubuntu_def
|
||||
image: ubuntu:bionic
|
||||
|
||||
xenial:
|
||||
<<: *ubuntu_def
|
||||
image: ubuntu:xenial
|
||||
|
||||
trusty:
|
||||
<<: *ubuntu_def
|
||||
image: ubuntu:trusty
|
||||
|
||||
#
|
||||
# there's no cmake3 for 12.04
|
||||
# maybe, there's ppa ?
|
||||
#
|
||||
#precise:
|
||||
# <<: *ubuntu_def
|
||||
# image: ubuntu:precise
|
||||
- git submodule init && git submodule update
|
||||
- CMAKE_FLAGS="-DCMAKE_PREFIX_PATH=/opt/local -DCMAKE_CXX_FLAGS=-m64 -DCMAKE_C_FLAGS=-m64" ./configure
|
||||
- gmake -C build
|
||||
|
||||
|
19
.gitmodules
vendored
19
.gitmodules
vendored
@ -1,3 +1,18 @@
|
||||
[submodule "src/Mayaqua/cpu_features"]
|
||||
path = src/Mayaqua/cpu_features
|
||||
[submodule "src/Mayaqua/3rdparty/cpu_features"]
|
||||
path = src/Mayaqua/3rdparty/cpu_features
|
||||
url = https://github.com/google/cpu_features.git
|
||||
[submodule "3rdparty/tinydir"]
|
||||
path = 3rdparty/tinydir
|
||||
url = https://github.com/cxong/tinydir.git
|
||||
[submodule "3rdparty/BLAKE2"]
|
||||
path = 3rdparty/BLAKE2
|
||||
url = https://github.com/BLAKE2/BLAKE2.git
|
||||
[submodule "src/libhamcore"]
|
||||
path = src/libhamcore
|
||||
url = https://github.com/SoftEtherVPN/libhamcore.git
|
||||
[submodule "src/Mayaqua/3rdparty/oqs-provider"]
|
||||
path = src/Mayaqua/3rdparty/oqs-provider
|
||||
url = https://github.com/open-quantum-safe/oqs-provider.git
|
||||
[submodule "src/Mayaqua/3rdparty/liboqs"]
|
||||
path = src/Mayaqua/3rdparty/liboqs
|
||||
url = https://github.com/open-quantum-safe/liboqs.git
|
||||
|
86
.travis.yml
86
.travis.yml
@ -1,4 +1,5 @@
|
||||
sudo: required
|
||||
dist: bionic
|
||||
|
||||
language: c
|
||||
|
||||
@ -6,64 +7,37 @@ env:
|
||||
global:
|
||||
- OPENSSL_INSTALL_DIR="${HOME}/opt"
|
||||
|
||||
addons:
|
||||
sonarcloud:
|
||||
organization: "softethervpn"
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- env: OPENSSL_VERSION="1.0.2o" BUILD_DEB="1"
|
||||
- env: OPENSSL_VERSION="1.0.2s" BUILD_DEB="1"
|
||||
os: linux
|
||||
compiler: gcc
|
||||
- env: OPENSSL_VERSION="1.1.0f"
|
||||
- env: RUN_SONARCLOUD=1 OPENSSL_VERSION="1.1.1c"
|
||||
os: linux
|
||||
compiler: gcc
|
||||
- env: OPENSSL_VERSION="1.0.2o" RUN_COVERITY="1"
|
||||
- env: OPENSSL_VERSION="1.1.1c" LABEL="linux-ppc64le" CMAKE_VERSION="3.9.6"
|
||||
arch: ppc64le
|
||||
os: linux
|
||||
compiler: gcc
|
||||
install:
|
||||
- wget https://cmake.org/files/v${CMAKE_VERSION%.*}/cmake-${CMAKE_VERSION}.tar.gz && tar -xzf cmake-${CMAKE_VERSION}.tar.gz
|
||||
- cd cmake-${CMAKE_VERSION}
|
||||
- ./bootstrap > build-deps.log 2>&1 || (cat build-deps.log && exit 1)
|
||||
- sudo make install > build-deps.log 2>&1 || (cat build-deps.log && exit 1)
|
||||
- cd ..
|
||||
- env: OPENSSL_VERSION="1.1.1c"
|
||||
os: linux
|
||||
compiler: clang
|
||||
- env: OPENSSL_VERSION="1.1.0f"
|
||||
- env: LIBRESSL_VERSION="2.9.2"
|
||||
os: linux
|
||||
compiler: clang
|
||||
- env: LABEL="check stb files"
|
||||
os: linux
|
||||
language: csharp
|
||||
mono: none
|
||||
dotnet: 2.1.300
|
||||
compiler: gcc
|
||||
before_install:
|
||||
- true
|
||||
before_script:
|
||||
- true
|
||||
script:
|
||||
- cd developer_tools/stbchecker
|
||||
- dotnet run ../../src/bin/hamcore
|
||||
- env: LABEL="create release from tag"
|
||||
os: linux
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: ${GITHUB_OAUTH_TOKEN}
|
||||
file: se.tar.gz
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
repo: SoftEtherVPN/SoftEtherVPN
|
||||
before_install:
|
||||
- true
|
||||
before_script:
|
||||
- if [ -z "$TRAVIS_TAG" ]; then exit 0; fi
|
||||
script:
|
||||
- true
|
||||
- os: osx
|
||||
compiler: clang
|
||||
cache:
|
||||
directories:
|
||||
- ${HOME}/Library/Caches/Homebrew
|
||||
before_install:
|
||||
- brew update && brew upgrade
|
||||
script:
|
||||
- ./configure
|
||||
- make -C tmp
|
||||
- otool -L build/vpnserver/vpnserver
|
||||
- sudo make -C tmp install
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages: [ debhelper, devscripts, fakeroot, cmake3, dh-exec ]
|
||||
- sudo apt-get -y install libsodium-dev
|
||||
- bash .ci/build-libressl.sh > build-deps.log 2>&1 || (cat build-deps.log && exit 1)
|
||||
|
||||
cache:
|
||||
directories:
|
||||
@ -71,18 +45,16 @@ cache:
|
||||
- ${HOME}/opt
|
||||
|
||||
before_install:
|
||||
- sudo apt-get -y install libsodium-dev
|
||||
- bash .ci/build-openssl.sh > build-deps.log 2>&1 || (cat build-deps.log && exit 1)
|
||||
|
||||
before_script:
|
||||
- .ci/coverity.sh
|
||||
|
||||
script:
|
||||
- export OPENSSL_ROOT_DIR=${OPENSSL_INSTALL_DIR}
|
||||
- export LD_LIBRARY_PATH="${HOME}/opt/lib:${LD_LIBRARY_PATH:-}"
|
||||
- export CFLAGS="-I${HOME}/opt/include"
|
||||
- export LDFLAGS="-L${HOME}/opt/lib"
|
||||
- export LDFLAGS="-L${HOME}/opt/lib -Wl,-rpath,${HOME}/opt/lib"
|
||||
- .ci/sonarcloud.sh
|
||||
- ./configure
|
||||
- make -C tmp
|
||||
- ldd build/vpnserver/vpnserver
|
||||
- sudo LD_LIBRARY_PATH="${HOME}/opt/lib:${LD_LIBRARY_PATH:-}" make -C tmp install
|
||||
- if [ "${BUILD_DEB}" = "1" ]; then make package -C tmp; fi
|
||||
- make -j $(nproc || sysctl -n hw.ncpu || echo 4) -C build
|
||||
- ldd build/vpnserver
|
||||
- if [ "${BUILD_DEB}" = "1" ]; then make package -C build; fi
|
||||
- .ci/memory-leak-test.sh
|
||||
|
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"cmake.configureOnOpen": false
|
||||
}
|
1
3rdparty/BLAKE2
vendored
Submodule
1
3rdparty/BLAKE2
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit b52178a376ca85a8ffe50492263c2a5bc0fa4f46
|
1
3rdparty/tinydir
vendored
Submodule
1
3rdparty/tinydir
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit ec6bff2043eaac3ad25423705e63a781762a0dfd
|
@ -1,5 +1,5 @@
|
||||
SoftEther VPN is developed by SoftEther VPN Project at University of Tsukuba.
|
||||
http://www.softether.org/
|
||||
https://www.softether.org/
|
||||
|
||||
AUTHORS OF SOFTETHER VPN
|
||||
------------------------
|
||||
@ -52,6 +52,8 @@ DEVELOPMENT BOARD MEMBERS:
|
||||
- Ilya Shipitsin
|
||||
https://github.com/chipitsine
|
||||
|
||||
- Yihong Wu
|
||||
https://github.com/domosekai
|
||||
|
||||
SPECIAL CONTRIBUTORS:
|
||||
|
||||
@ -89,6 +91,7 @@ CONTRIBUTORS:
|
||||
- Johan de Vries <devries@wivion.nl>
|
||||
- Josh Soref <https://github.com/jsoref>
|
||||
- Joshua Perry <josh@6bit.com>
|
||||
- Koichiro Iwao <meta@FreeBSD.org>
|
||||
- Luiz Eduardo Gava <luiz.gava@procempa.com.br>
|
||||
- macvk <tutumbul@gmail.com>
|
||||
- Maks Naumov <maksqwe1@ukr.net>
|
||||
@ -111,6 +114,7 @@ CONTRIBUTORS:
|
||||
- NV <nvsofts@gmail.com>
|
||||
- Olimjon <olim98@bk.ru>
|
||||
- parly <https://github.com/parly>
|
||||
- PeTeeR <tom2pet@gmail.com>
|
||||
- Quantum <quantum2048@gmail.com>
|
||||
- Quintin <quintin@last.za.net>
|
||||
- Raymond Tau <raymondtau@gmail.com>
|
||||
@ -134,5 +138,5 @@ JOIN THE SOFTETHER VPN DEVELOPMENT
|
||||
Want to become a contributor? Please send us a patch.
|
||||
|
||||
See also: SoftEther VPN Patch Acceptance Policy
|
||||
http://www.softether.org/5-download/src/9.patch
|
||||
https://www.softether.org/5-download/src/9.patch
|
||||
|
||||
|
139
CMakeLists.txt
139
CMakeLists.txt
@ -1,57 +1,118 @@
|
||||
cmake_minimum_required(VERSION 3.7)
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
project(SoftEtherVPN
|
||||
VERSION 5.01.9658
|
||||
set(BUILD_NUMBER CACHE STRING "The number of the current build.")
|
||||
|
||||
if ("${BUILD_NUMBER}" STREQUAL "")
|
||||
set(BUILD_NUMBER "5187")
|
||||
endif()
|
||||
|
||||
if (BUILD_NUMBER LESS 5180)
|
||||
message(WARNING
|
||||
"Setting BUILD_NUMBER to a value less than 5180 will break compatibility with client binaries distributed by SoftEther Corporation. "
|
||||
"Set to a value greater than or equal to 5180 if you want such clients to work properly.\n"
|
||||
"For detailed info: https://github.com/SoftEtherVPN/SoftEtherVPN/issues/1392#issuecomment-867348281")
|
||||
endif()
|
||||
|
||||
#
|
||||
# Link MSVC runtime statically
|
||||
# this should be revisited after installer migration to MSI
|
||||
#
|
||||
cmake_policy(SET CMP0091 NEW)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
||||
|
||||
project("SoftEther VPN"
|
||||
VERSION "5.02.${BUILD_NUMBER}"
|
||||
LANGUAGES C
|
||||
)
|
||||
|
||||
set(default_build_type "Release")
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
||||
set(TOP_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||
set(BUILD_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||
|
||||
# We define a dedicated variable because CMAKE_BUILD_TYPE can have different
|
||||
# configurations than "Debug" and "Release", such as "RelWithDebInfo".
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(BUILD_TYPE "Debug")
|
||||
else()
|
||||
set(BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
# Check that submodules are present only if source was downloaded with git
|
||||
if(EXISTS "${SoftEtherVPN_SOURCE_DIR}/.git" AND NOT EXISTS "${SoftEtherVPN_SOURCE_DIR}/src/Mayaqua/cpu_features/CMakeLists.txt")
|
||||
if(EXISTS "${TOP_DIRECTORY}/.git" AND NOT EXISTS "${TOP_DIRECTORY}/src/libhamcore/CMakeLists.txt")
|
||||
message (FATAL_ERROR "Submodules are not initialized. Run\n\tgit submodule update --init --recursive")
|
||||
endif()
|
||||
|
||||
# Compare ${PROJECT_VERSION} and src/CurrentBuild.txt
|
||||
file(READ ${SoftEtherVPN_SOURCE_DIR}/src/CurrentBuild.txt CurrentBuild)
|
||||
|
||||
string(REGEX MATCH "VERSION_MAJOR ([0-9]+)" temp ${CurrentBuild})
|
||||
string(REGEX REPLACE "VERSION_MAJOR ([0-9]+)" "\\1" CurrentBuild_MAJOR ${temp})
|
||||
string(REGEX MATCH "VERSION_MINOR ([0-9]+)" temp ${CurrentBuild})
|
||||
string(REGEX REPLACE "VERSION_MINOR ([0-9]+)" "\\1" CurrentBuild_MINOR ${temp})
|
||||
string(REGEX MATCH "VERSION_BUILD ([0-9]+)" temp ${CurrentBuild})
|
||||
string(REGEX REPLACE "VERSION_BUILD ([0-9]+)" "\\1" CurrentBuild_BUILD ${temp})
|
||||
|
||||
if (NOT ${PROJECT_VERSION} VERSION_EQUAL "${CurrentBuild_MAJOR}.${CurrentBuild_MINOR}.${CurrentBuild_BUILD}")
|
||||
message (FATAL_ERROR "PROJECT_VERSION does not match to src/CurrentBuild.txt")
|
||||
if(WIN32 AND VCPKG_TARGET_TRIPLET AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
message (FATAL_ERROR "vcpkg not installed or integrated with Visual Studio. Install it and run\n\tvcpkg integrate install")
|
||||
endif()
|
||||
|
||||
configure_file("${SoftEtherVPN_SOURCE_DIR}/AUTHORS.TXT" "${SoftEtherVPN_SOURCE_DIR}/src/bin/hamcore/authors.txt" COPYONLY)
|
||||
if(UNIX)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
set(BUILD_DIRECTORY ${SoftEtherVPN_SOURCE_DIR}/build)
|
||||
#
|
||||
# use rpath for locating installed libraries
|
||||
#
|
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}")
|
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
|
||||
include(CheckIncludeFile)
|
||||
Check_Include_File(sys/auxv.h HAVE_SYS_AUXV)
|
||||
if(EXISTS "/lib/systemd/system")
|
||||
set(CMAKE_INSTALL_SYSTEMD_UNITDIR "/lib/systemd/system" CACHE STRING "Where to install systemd unit files")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
configure_file("${TOP_DIRECTORY}/AUTHORS.TXT" "${TOP_DIRECTORY}/src/bin/hamcore/authors.txt" COPYONLY)
|
||||
|
||||
# Date and time
|
||||
string(TIMESTAMP DATE_DAY "%d" UTC)
|
||||
string(TIMESTAMP DATE_MONTH "%m" UTC)
|
||||
string(TIMESTAMP DATE_YEAR "%Y" UTC)
|
||||
string(TIMESTAMP TIME_HOUR "%H" UTC)
|
||||
string(TIMESTAMP TIME_MINUTE "%M" UTC)
|
||||
string(TIMESTAMP TIME_SECOND "%S" UTC)
|
||||
|
||||
message(STATUS "Build date: ${DATE_DAY}/${DATE_MONTH}/${DATE_YEAR}")
|
||||
message(STATUS "Build time: ${TIME_HOUR}:${TIME_MINUTE}:${TIME_SECOND}")
|
||||
|
||||
add_subdirectory(src)
|
||||
|
||||
# Packaging
|
||||
set(CPACK_COMPONENTS_ALL vpnserver vpnclient vpnbridge vpncmd)
|
||||
set(CPACK_PACKAGE_DIRECTORY ${BUILD_DIRECTORY})
|
||||
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
||||
set(CPACK_PACKAGE_VENDOR "SoftEther")
|
||||
set(CPACK_PACKAGE_NAME "softether")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${SoftEtherVPN_SOURCE_DIR}/description")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SoftEther VPN is an open-source cross-platform multi-protocol VPN program, created as an academic project in the University of Tsukuba.")
|
||||
if(UNIX)
|
||||
# Packaging
|
||||
set(CPACK_COMPONENTS_ALL common vpnserver vpnclient vpnbridge vpncmd)
|
||||
set(CPACK_PACKAGE_DIRECTORY ${BUILD_DIRECTORY})
|
||||
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
||||
set(CPACK_PACKAGE_VENDOR "SoftEther")
|
||||
set(CPACK_PACKAGE_NAME "softether")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_FILE "${TOP_DIRECTORY}/description")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SoftEther VPN is an open-source cross-platform multi-protocol VPN program, created as an academic project in the University of Tsukuba.")
|
||||
|
||||
# DEB
|
||||
set(CPACK_DEB_COMPONENT_INSTALL ON)
|
||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
|
||||
set(CPACK_DEBIAN_PACKAGE_SECTION "net")
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Unknown")
|
||||
# DEB
|
||||
if(BUILD_TYPE STREQUAL "Debug")
|
||||
set(CPACK_DEBIAN_PACKAGE_DEBUG ON)
|
||||
endif()
|
||||
|
||||
# RPM
|
||||
set(CPACK_RPM_COMPONENT_INSTALL ON)
|
||||
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
|
||||
set(CPACK_RPM_PACKAGE_GROUP "Applications/Internet")
|
||||
set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
|
||||
set(CPACK_DEB_COMPONENT_INSTALL ON)
|
||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
|
||||
set(CPACK_DEBIAN_PACKAGE_SECTION "net")
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Unknown")
|
||||
|
||||
include(CPack)
|
||||
# RPM
|
||||
set(CPACK_RPM_COMPONENT_INSTALL ON)
|
||||
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
|
||||
set(CPACK_RPM_PACKAGE_GROUP "Applications/Internet")
|
||||
set(CPACK_RPM_PACKAGE_LICENSE "ASL 2.0")
|
||||
|
||||
# Exclude system directories
|
||||
if(CPACK_GENERATOR STREQUAL "RPM")
|
||||
execute_process(
|
||||
COMMAND rpm -ql filesystem
|
||||
COMMAND tr \n \;
|
||||
OUTPUT_VARIABLE CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
|
||||
ERROR_QUIET)
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
endif()
|
||||
|
141
CMakeSettings.json
Normal file
141
CMakeSettings.json
Normal file
@ -0,0 +1,141 @@
|
||||
{
|
||||
"environments": [ { "BuildNumber": "5187" } ],
|
||||
"configurations": [
|
||||
{
|
||||
"name": "x64-native",
|
||||
"description": "Target x64 with 64-bit compiler",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"inheritEnvironments": [ "clang_cl_x64_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"variables": [
|
||||
{
|
||||
"name": "BUILD_NUMBER",
|
||||
"value": "${env.BuildNumber}",
|
||||
"type": "STRING"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_C_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/x64/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_CXX_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/x64/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "VCPKG_TARGET_TRIPLET",
|
||||
"value": "x64-windows-static",
|
||||
"type": "STRING"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "x86-on-x64",
|
||||
"description": "Target x86 with 64-bit compiler",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"inheritEnvironments": [ "clang_cl_x86_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"variables": [
|
||||
{
|
||||
"name": "BUILD_NUMBER",
|
||||
"value": "${env.BuildNumber}",
|
||||
"type": "STRING"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_C_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/x64/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_CXX_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/x64/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "VCPKG_TARGET_TRIPLET",
|
||||
"value": "x86-windows-static",
|
||||
"type": "STRING"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "x64-on-x86",
|
||||
"description": "Target x64 with 32-bit compiler",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"inheritEnvironments": [ "clang_cl_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"variables": [
|
||||
{
|
||||
"name": "BUILD_NUMBER",
|
||||
"value": "${env.BuildNumber}",
|
||||
"type": "STRING"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_C_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_CXX_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "VCPKG_TARGET_TRIPLET",
|
||||
"value": "x64-windows-static",
|
||||
"type": "STRING"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "x86-native",
|
||||
"description": "Target x86 with 32-bit compiler",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"inheritEnvironments": [ "clang_cl_x86" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"variables": [
|
||||
{
|
||||
"name": "BUILD_NUMBER",
|
||||
"value": "${env.BuildNumber}",
|
||||
"type": "STRING"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_C_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "CMAKE_CXX_COMPILER",
|
||||
"value": "${env.VCINSTALLDIR}Tools/Llvm/bin/clang-cl.exe",
|
||||
"type": "FILEPATH"
|
||||
},
|
||||
{
|
||||
"name": "VCPKG_TARGET_TRIPLET",
|
||||
"value": "x86-windows-static",
|
||||
"type": "STRING"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
5
CODE_OF_CONDUCT.md
Normal file
5
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Contributor Code of Conduct
|
||||
|
||||
This project adheres to No Code of Conduct. We are all adults. We accept anyone's contributions. Nothing else matters.
|
||||
|
||||
For more information please visit the [No Code of Conduct](https://nocodeofconduct.com) homepage.
|
372
ChangeLog
372
ChangeLog
@ -1,372 +0,0 @@
|
||||
SoftEther VPN 5.1 (February 14, 2018)
|
||||
Use the new agreed versioning pattern, where we use 5.x for the unstable version and slowely drop the incremental number
|
||||
Add the Alternative subject name field on the new X.509 certificate creation. PR #421
|
||||
Fix a bug in the Win32EnumDirExW() function. PR #420
|
||||
remove unused functions (identified by cppcheck). PR #440
|
||||
Allow specifying cipher suites instead of single ciphers. PR #343
|
||||
Add parameter "ListenIP" to server configuration (vpn_server.config). PR #202
|
||||
cppcheck findings. PR #275
|
||||
Add DhParamBits configuration to set Diffie-Hellman parameters. PR #129
|
||||
Fix log msg for IKE with aggressive exchange mode. PR #425
|
||||
Fixes 11 vulnerabilities found by Max Planck Institute for Molecular Genetics and Mr. Guido Vranken. PR #419
|
||||
Fixed the bug which occurs the L2TP/IPsec connection error with Android Oreo, etc. PR #405
|
||||
build documentation refactoring. PR #395
|
||||
initial travis-ci support feature. PR #348
|
||||
Reformat README. Add compile requirements. PR #379
|
||||
Fix: vpncmd thinks that "hamcore.se2" is missing or broken. PR #339
|
||||
fix aarch64 build. PR #281
|
||||
Initial Commit of gitignore. PR #380
|
||||
|
||||
SoftEther VPN 4.23 Build 9647 Beta (October 18, 2017)
|
||||
Upgraded OpenSSL to 1.0.2l.
|
||||
Source code is now compatible with OpenSSL 1.1.x. Supports DHE-RSA-CHACHA 20-POLY 1305 and ECDHE-RSA-CHACHA 20-POLY 1305, which are new encryption methods of TLS 1.2. (In order to use this new function, you need to recompile yourself using OpenSSL 1.1.x.)
|
||||
TrafficServer / TrafficClient function (The traffic throughput measurement function) is now multithreaded and compatible with about 10 Gbps using NIC with the RSS feature.
|
||||
Changed the default algorithm for SSL from RC4-MD5 to AES128-SHA.
|
||||
Fixed a bug that occur wrong checksum recalculation in special case of the TCP-MSS clamp processing.
|
||||
Fixed the calculation interval of update interval of DHCP client packet issued by kernel mode virtual NAT function of SecureNAT function.
|
||||
Driver upgrade and DLL name change with Crypto ID support of USB security token.
|
||||
Fixed a problem that CPU sleep processing was not performed when the wait time of the Select () function was INFINITE on Mac OS X.
|
||||
Added the StrictSyslogDatetimeFormat flag onto the ServerConfiguration section on the VPN Server configuration file, which sets Syslog date format to RFC3164.
|
||||
Fixed wrong English in the UI.
|
||||
Using client parameter in function CtConnect
|
||||
Remove blank line at the start from init file (Debian)
|
||||
Stop Radius Delay from counting to next_resend
|
||||
Add DH groups 2048,3072,4096 to IPSec_IKE
|
||||
Add HMAC SHA2-256, HMAC SHA2-384, HMAC SHA2-512 support
|
||||
Openvpn extend ciphers
|
||||
Fixed RSA key bits wrong calculation for certain x509 certificate
|
||||
Added support for RuToken USB key PKCS#11
|
||||
OpenSSL 1.1 Port
|
||||
|
||||
SoftEther VPN 4.22 Build 9634 Beta (November 27, 2016)
|
||||
Added the support for TLS 1.2. Added TLS 1.2-based cipher sets: AES128-GCM-SHA256, AES128-SHA256, AES256-GCM-SHA384, AES256-SHA256, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES128-SHA256, DHE-RSA-AES256-GCM-SHA384, DHE-RSA-AES256-SHA256, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES128-SHA256, ECDHE-RSA-AES256-GCM-SHA384 and ECDHE-RSA-AES256-SHA384.
|
||||
Added the function to allow to configure specific TLS versions to accept / deny. In the VPN Server configuration file you can set Tls_Disable1_0, Tls_Disable1_1 and Tls_Disable1_2 flags to true to disable these TLS versions individually.
|
||||
Added the support for TLS 1.2 on the OpenVPN protocol.
|
||||
Updated the version of OpenSSL to 1.0.2j.
|
||||
Added the support for Windows Server 2016.
|
||||
Fixed the 2038-year problem.
|
||||
Added the support for recording HTTPS destination hostnames, using SNI attributes, on the packet logging function.
|
||||
Added the function to append the name of Virtual Hub into the "Called-Station-ID (30)" attribute value in the RADIUS authentication request packet.
|
||||
Improved the behavior of Virtual Layer-3 switches. The interval of ARP request is set to 1 second.
|
||||
Fixed the problem of the slow startup of VPN Server in Windows 10.
|
||||
Added the support for 4096 bits RSA authentication with smart cards.
|
||||
Added the support for the CryptoID USB token.
|
||||
Fixed the UI string resource in English.
|
||||
Fix that ParseTcpOption doesn't work correctly
|
||||
Add LSB header
|
||||
Support Debian package build on aarch64 architecture
|
||||
Support Debian package build on ARMv7l architecture
|
||||
cppcheck issues
|
||||
Default to TLS connections only
|
||||
Allow specific SSL/TLS versions to be disabled
|
||||
Adding Radius AVP Called-Station-Id
|
||||
Fixed typo
|
||||
Update CentOS makefiles and spec file
|
||||
Systemd service configuration files for SoftEther
|
||||
Fix set initialization, set.OnlyCapsuleModeIsInvalid could be garbage
|
||||
Fixed OSX CPU utilization by replacing broken kevent () with select ()
|
||||
Add the possibility to send the Virtual Hub Name to an external DHCP server
|
||||
Added armv5tel for debian/rules and made pushed routes work correct with OpenVPN
|
||||
fix LogFileGet won't save to SAVEPATH
|
||||
Fix for Debian Package
|
||||
Try to autodetect OS and CPU instead of requiring user input
|
||||
Support For Radius Realm
|
||||
|
||||
SoftEther VPN 4.21 Build 9613 Beta (April 24, 2016)
|
||||
Added SoftEther VPN Server Manager for Mac OS X.
|
||||
Now you can manage your SoftEther VPN Server, running remotely, from your Mac in local.
|
||||
|
||||
SoftEther VPN 4.20 Build 9608 RTM (April 18, 2016)
|
||||
All cumulative updates below are included.
|
||||
Fixed a minor English typo.
|
||||
|
||||
SoftEther VPN 4.19 Build 9605 Beta (March 3, 2016)
|
||||
The version of OpenSSL is updated to 1.0.2g to fix the vulnerability which was published in March 2016. SSLv2 is now disabled completely.
|
||||
Fixed a multi-byte character problem in the certificate generating tool.
|
||||
Enable the cache of the destination IP address of the additional TCP connection for a VPN session.
|
||||
|
||||
SoftEther VPN 4.19 Build 9599 Beta (October 19, 2015)
|
||||
Fixed the problem that an unnecessary "Insert disk" dialog box appears when installing VPN Server or VPN Bridge on Windows 10.
|
||||
Added the "/NOHUP" parameter in the "TrafficServer" command of vpncmd.
|
||||
Added the "/REDIRECTURL" parameter in some access list commands of vpncmd.
|
||||
Added the virtual address check routines in kernel-mode drivers to prevent blue screen or invalid memory access. Previous versions of kernel-mode drivers did not check the virtual addresses from the user-mode. (NOTE: All kernel-mode drivers are protected by ACL to avoid privilege escalation in all previous versions. Only users with Administrator privileges were able to cause blue screen or invalid memory access by passing invalid addresses from the user-mode. Therefore this was not a security flaw.) Appreciate Meysam Firozi's contribution to report the similar problem in the Win10Pcap driver.
|
||||
|
||||
SoftEther VPN 4.19 Build 9582 Beta (October 6, 2015)
|
||||
Dramatically improvement of the performance of the Virtual NAT function of SecureNAT in Linux. In the previous versions of SoftEther VPN, the SecureNAT performance was very slow in the specific situation that the Linux Virtual Machine (VM) is running with virtual Ethernet interfaces which are prohibited to enable the promiscuous mode (this problem has been frequently appeared on cloud servers such like Amazon EC2/AWS or Windows Azure). In such a situation, SecureNAT must use the user-mode TCP/IP stack simulation and it was very slow and had high latency. This version of SoftEther VPN Server adds the new "RAW IP Mode" in the SecureNAT function. The RAW IP Mode is enabled by default, and is effective only if the VPN Server process is running in the root privileges. In the RAW IP Mode, the SecureNAT function realizes to transmit and receive TCP, UDP and ICMP packets which headers are modified. This behavior realizes drastically improved performance than legacy user-mode SecureNAT in the previous versions. In order to avoid the misunderstanding of receiving packets which are towards to the Virtual NAT function, some packet filter rules are automatically added to the iptables chain list. You can disable the RAW IP Mode by setting the "DisableIpRawModeSecureNAT" value to "1" on the Virtual Hub Extending Options.
|
||||
|
||||
Improved the performance of the Kernel-mode SecureNAT.
|
||||
|
||||
Improved the stability of the L2TP VPN sessions on the network with heavy packet-losses.
|
||||
|
||||
Added the compatibility with Cisco 800 series routers (e.g. Cisco 841M) on the L2TPv3 over IPsec protocol. These new Cisco routers have modified L2TPv3 header interpreter. Therefore SoftEther VPN Server needed to add new codes to support these new Cisco routers.
|
||||
|
||||
Added the support the compatibility to YAMAHA RTX series routers on the L2TPv3 over IPsec protocol.
|
||||
|
||||
Added the support for EAP and PEAP. SoftEther VPN Server can now speak RFC3579 (EAP) or Protected EAP (PEAP) to request user authentications to the RADIUS server with the MS-CHAPv2 mechanism. If this function is enabled, all requests from L2TP VPN clients which contain MS-CHAPv2 authentication data will be converted automatically to EAP or PEAP when it is transferred to the RADIUS server. You must enable this function manually for each of Virtual Hubs. To enable the function converting from MS-CHAPv2 to EAP, set the "RadiusConvertAllMsChapv2AuthRequestToEap" value to "true" in the vpn_server.config. To enable the function converting from MS-CHAPv2 to PEAP, set both "RadiusConvertAllMsChapv2AuthRequestToEap" and "RadiusUsePeapInsteadOfEap" options to "true".
|
||||
|
||||
SoftEther VPN 4.19 Build 9578 Beta (September 15, 2015)
|
||||
Solved the problem that kernel mode drivers do not pass the general tests of "Driver Verifier Manager" in Windows 10.
|
||||
|
||||
SoftEther VPN 4.18 Build 9570 RTM (July 26, 2015)
|
||||
Compatible with Windows 10.
|
||||
Solved the problem that the customized language setting on the "lang.config" file.
|
||||
config sometimes corrupts in the rare condition.
|
||||
|
||||
SoftEther VPN 4.17 Build 9566 Beta (July 16, 2015)
|
||||
Improved stability with Windows 10 Beta.
|
||||
Updated the OpenSSL library to 1.0.2d.
|
||||
|
||||
SoftEther VPN 4.17 Build 9562 Beta (May 30, 2015)
|
||||
Added supports for Windows 10 Technical Preview Build 10130.
|
||||
Increased the maximum Ethernet frame size from 1560 bytes to 1600 bytes.
|
||||
Fixed the compiler error while building the source code of SoftEther VPN on Windows.
|
||||
Added memory tags on the memory allocation function calls in kernel-mode device drivers.
|
||||
Fixed the freeze problem of the VPN Client that the computer enters to suspend or hibernation state while the VPN Client is connected to the VPN Server.
|
||||
Windows-version executable and driver files are now signed by the SHA-256 digital code-sign certificate.
|
||||
|
||||
SoftEther VPN 4.15 Build 9546 Beta (April 5, 2015)
|
||||
Fixed the problem that the Local Bridge function does not work correctly on Windows 10 Technical Preview Build 10049.
|
||||
|
||||
SoftEther VPN 4.15 Build 9539 Beta (April 4, 2015)
|
||||
Add the code to instruct the VPN Client to disconnect the VPN session automatically when Windows is being suspending or hibernating.
|
||||
|
||||
SoftEther VPN 4.15 Build 9538 Beta (March 27, 2015)
|
||||
Fixed the dialog-box size problem on Windows 10 Technical Preview Build 10041.
|
||||
|
||||
SoftEther VPN 4.15 Build 9537 Beta (March 26, 2015)
|
||||
Upgraded built-in OpenSSL from 0.9.8za to 1.0.2a. Please note that this change has not been well-tested. This upgrading of OpenSSL might cause problems. In that case, please post the bug report.
|
||||
|
||||
SoftEther VPN 4.14 Build 9529 Beta (February 2, 2015)
|
||||
We are very sorry. The previous version 4.13 (beta) has a problem to accept L2TP connections due to the session-state quota-limitation code by the minor change between Build 9514 and 9524. The problem is fixed on this build. Please update to this build if you are facing to the L2TP problem on version 4.13.
|
||||
Added the function to record underlying source IP addresses of VPN clients on every packet log lines. This function can be disabled by set the "NoPhysicalIPOnPacketLog" flag in the Virtual Hub Extended Option to "1".
|
||||
|
||||
SoftEther VPN 4.13 Build 9524 Beta (January 31, 2015)
|
||||
Modified the behavior of the Local Bridge function in the VPN Server on Linux. In the previous versions, if several Local Bridge creation operations will be made, then the operations to disable the offloading function on the target Ethernet devices will be conducted as many as same. After this version, the operation to disable the offloading function will be called only once for each device if several Local Bridge creation operations will be made on the same Ethernet device.
|
||||
Added the "SecureNAT_RandomizeAssignIp" Virtual Hub Extended Option. If you set this option to non-zero value, then the Virtual DHCP Server of the SecureNAT function will choose an unused IP address randomly from the DHCP pool while the default behavior is to choose the first unused IP address.
|
||||
Added the "DetectDormantSessionInterval" Virtual Hub Extended Option. If you set this option to non-zero value, then the Virtual Hub will treat the VPN sessions, which have transmitted no packets for the last specified intervals (in seconds), as Dormant Sessions. The Virtual Hub will not flood packets, which should be flood, to any Dormant Sessions.
|
||||
Added the implementation of the SHA () function in the source code. This made the building process easier on the low-memory embedded hardware which has its OpenSSL implementation without the SHA () function.
|
||||
Improved the behavior on Windows 10 Technical Preview to show the OS version information correctly.
|
||||
|
||||
SoftEther VPN 4.12 Build 9514 Beta (November 17, 2014)
|
||||
Added the VLAN ID dynamic assignment function by RADIUS. It is very useful when the layer-2 Ethernet segment with aggregated IEEE802.1Q tagged VLANs is bridged to your Virtual Hub. Each VPN session will be assigned its own VLAN ID by the RADIUS attribute value when the user is authenticated by the external RADIUS server unless the user object has a VLAN ID security policy. The RADIUS attribute with the name "Tunnel-Pvt-Group-ID" (ID = 81) will be used as the VLAN ID. The data type must be STRING. This function is disabled by default. You have to set the "AssignVLanIdByRadiusAttribute" value to "1" in the Virtual Hub Extended Options in advance.
|
||||
Added the OpenVPNDefaultClientOption option in the vpn_server.config. The specified option string will be used alternatively when the connecting OpenVPN Client does not provide the connection string. Some incomplete OpenVPN Clients with the --enable-small compiling option always forget to specify this connection string. This option can make VPN Server allow such OpenVPN Clients.
|
||||
Improved the DHCP option parser to allow the external DHCP server pushes the classless routing table which exceeds 255 bytes.
|
||||
Added the support for "hair-pin connection" on the NAT Traversal function.
|
||||
Fixed the performance problem when the server computer has the wrong resolv.conf setting file on Linux.
|
||||
Fixed the VPN Client configuration backup folder name which the setup wizard automatically creates.
|
||||
Fixed the UDP checksum value of the beacon packets which are sent by the Virtual Layer 3 Switch function.
|
||||
|
||||
SoftEther VPN 4.11 Build 9506 Beta (October 22, 2014)
|
||||
As a response to the SSLv3 POODLE problem we added the "AcceptOnlyTls" configuration flag on the vpn_server.config for SoftEther VPN Server. Please set this flag is you want to completely disable the SSLv3 function in SoftEther VPN Server.
|
||||
Added the perfect forward security (PFS) support on SSL/TLS. SoftEther VPN Server can now accept connections with DHE-RSA-AES128-SHA or DHE-RSA-AES256-SHA ciphers.
|
||||
|
||||
SoftEther VPN 4.10 Build 9505 Beta (October 3, 2014)
|
||||
Implemented the hash table algorithm for the MAC address database of Virtual Hubs. It improves the performance when there are a large number of MAC addresses registered on the database.
|
||||
Improved the performance on slow-CPU hardware (e.g. embedded Linux boxes).
|
||||
Added the DoNotDisableOffloading flag on Local Bridge settings. This flag will disable the automated disabling operation for hardware offloading on the specified Ethernet interface on Linux.
|
||||
Supports the kernel-supported IEEE802.1Q tagged VLAN on Windows and Linux. It will enable tagged-VLAN support on the Local Bridge function with some specific network interface drivers.
|
||||
Added the FloodingSendQueueBufferQuota option.
|
||||
Sets the lower priority value on the oom_adj process parameter for Linux.
|
||||
Randomized the reconnection interval in Cascade Connection.
|
||||
Increased the memory usage limit on 64-bit systems.
|
||||
Modified the behavior of the ConfigGet command and the /CSV option in vpncmd for Windows to work around for the Windows console API bug.
|
||||
Added the DisableSessionReconnect option on VPN Server and VPN Bridge. It makes Cascade Connection client sessions to disconnect immediately from the destination VPN Server when the based TCP connection is disconnected.
|
||||
Makes it enable to use the PrivacyFilterMode security policy on Cascade server VPN sessions.
|
||||
Added the GlobalParams configuration option on VPN Server and VPN Bridge. It allows administrators to modify and optimize the performance parameters of VPN Server and VPN Bridge.
|
||||
Reduced the processor time of looking up the ACL entries when storing and forwarding packets across a Virtual Hub.
|
||||
Reduced the usage of the memory on embedded Linux environments.
|
||||
Fixed a minor bug on the GUI setting screen of the SecureNAT routing table pushing option.
|
||||
Added the ServerLogSwitchType and the LoggerMaxLogSize option on VPN Server and VPN Bridge. They can change the logging behavior of VPN Server and VPN Bridge.
|
||||
Implemented the config template file. The template filename is "vpn_server_template.config" for VPN Server, and "vpn_server_template.config" for VPN Bridge. The VPN Server and VPN Bridge loads the template file as the initial configuration state when the configuration file does not exists.
|
||||
|
||||
SoftEther VPN 4.10 Build 9473 Beta (July 12, 2014)
|
||||
Added the "SuppressClientUpdateNotification" option in the Virtual Hub Extended Option list. This option will push the flag to the VPN Client to suppress the update notification screen on the VPN Client manager. To push this flag, set "1" to the "SuppressClientUpdateNotification" option in your Virtual Hub.
|
||||
Added the warning message when the background service process is run by a non-root user (only in UNIX).
|
||||
Fixed the deadlock bug when UNIX versions of SoftEther VPN Server process is shutting down.
|
||||
Added supports for third-party PKCS#11 DLLs: ePass 1000 ND / ePass 2000 / ePass 2003 / ePass 3000.
|
||||
Fixed typo.
|
||||
The expression of the disclaimer statement for exporting / importing has been modified.
|
||||
Fixed the VPN Azure connection problem on Version 4.09 Build 9451 Beta.
|
||||
Fixed the problem that VPN Server Manager and VPN Client Manager sometimes become slow when the update check server is unreachable from the computer.
|
||||
Removed space characters in every URLs of all download files on the SoftEther VPN Download Center web site to avoid the downloading problem in some HTTP clients.
|
||||
A github patch which was posted by a contributor has been applied: "update debian packaging, install init script".
|
||||
|
||||
SoftEther VPN 4.09 Build 9451 Beta (June 9, 2014)
|
||||
Improves User-mode SecureNAT performance by modifying the processing of TCP_FIN packets. It should improve the performance of the FTP protocol.
|
||||
|
||||
SoftEther VPN 4.08 Build 9449 (June 8, 2014)
|
||||
Add a new command to generate a RSA 2048 bit certificate.
|
||||
The vpncmd command-line utility has MakeCert command to generate a 1024 bit self-signed RSA certificate. However, in recent years it is recommended to use 2048 bit RSA certificates. Therefore, on this version a new command MakeCert2048 has been added. Use this command to generate a 2048 bit self-signed RSA certificate.
|
||||
|
||||
Workaround for the NAT traversal problem.
|
||||
Adjusted the priority between TCP/IP Direct Connection and UDP-based NAT-Traversal. On this version (Ver 4.08), NAT-Traversal will always be used if the client program detects that the specified TCP destination port on the destination server is occupied by non-SoftEther VPN Server. Anyone who faces to the connection problem on the VPN Server which is behind the NAT-box should install this update.
|
||||
|
||||
In the previous version (Ver 4.07), when the VPN Client attempts to connect to the VPN Server, the client firstly establish the connection via the TCP/IP direct protocol. If the TCP connection establishes successfully (in the layer-3) but the TCP port returns non-VPN protocol data (in the layer-7), the protocol error occurs immediately even if the NAT-Traversal connection attempt is still pending. This phenomenon often occurs when the VPN Server is behind the NAT-box, and the NAT-box has a listening TCP-443 port by itself. In that condition, the VPN Client attempts to connect to that TCP-443 port firstly, and the protocol error occurs immediately NAT-box returns non-VPN protocol (e.g. HTML-based administration page).
|
||||
|
||||
In order to work around that, this version (Ver 4.08) of VPN Client changed the behavior. On this version, if the VPN Client detects that the destination TCP Port is occupied by a non-VPN program, then the client will always use NAT-Traversal socket. This minor change will fix the connection problem to VPN servers behind the NATs.
|
||||
|
||||
Note: The built-in NAT-Traversal function on SoftEther VPN is for temporary use only. It is not recommended to keep using UDP-based NAT-Traversal connection to beyond the NAT-box when the VPN Server is behind the NAT-box, for long-term use. It is reported that some cheap NAT-boxes disconnect UDP session in regular period (a few minutes) after NAT-Traversal connection has been made. The strongly recommended method to run VPN Server behind the NAT is to make a TCP port mapping on the NAT-box to transfer incoming VPN connection packets (e.g. TCP port 443) to the private IP address of the VPN Server.
|
||||
|
||||
SoftEther VPN 4.07 Build 9448 (June 6, 2014)
|
||||
We updated the internal OpenSSL to 0.9.8za.
|
||||
This fixes the latest OpenSSL vulnerability which has unfold on June 05.
|
||||
This vulnerability does not affect on SoftEther VPN. However, we updated the SoftEther VPN build with OpenSSL 0.9.8za. The new build also includes additional improvements.
|
||||
More details about this OpenVPN vulnerability is described at http://www.openssl.org/news/secadv_20140605.txt.
|
||||
|
||||
Other updates on this build are as followings:
|
||||
The problem with OpenVPN Connect for Android 1.1.14 has been fixed. In the previous versions, OpenVPN Connect for Android 1.1.14 reports "PolarSSL Error" when it connects to the SoftEther VPN Server, if the server SSL certificate is self-signed root certificate. This X.509 certificate parsing problem is OpenVPN Connect's bug, however we performed work around for this OpenVPN Connect's bug. Please mind that you need to regenerate your self-signed root certificate in order to comply with OpenVPN Connect at once after upgrading the VPN Server to this version. To regenerate the certificate, use the GUI tool on VPN Server Manager, or execute the "ServerCertRegenerate" command on vpncmd.
|
||||
|
||||
The automated root certificate and intermediate certificates downloading function has been implemented. It is very helpful when you use a commercial certificate which has been issued by a commercial CA (Certificate Authority), including VeriSign, GlobalSign or RapidSSL. In previous versions, you had to install the root certificate and intermediate certificates manually into the "chain_certs" directory. On this version, you do not need any longer to do such a manual installation of chained certs.
|
||||
|
||||
The OpenVPN configuration file generating function identifies the root certificate correctly, in order to embed it as the "<ca>" inline directive in the auto-generated OpenVPN configuration file. It is very helpful if you are using a commercial certificate which has been issued by a commercial CA (Certificate Authority), including VeriSign, GlobalSign or RapidSSL. (In previous versions, you had to perform the editing task for the OpenVPN configuration file manually.)
|
||||
|
||||
UI typos have been fixed, and some minor bugs have been fixed.
|
||||
|
||||
SoftEther VPN 4.06 Build 9435 (Beta) (March 26, 2014)
|
||||
Previous versions of VPN Client have a port-confliction problem of the TCP port (TCP 9930) for RPC (Remote Procedure Call) on the VPN Client service for Windows, if the same port is occupied by another service. This version has solved the confliction problem.
|
||||
|
||||
SoftEther VPN 4.06 Build 9433 (Beta) (March 21, 2014)
|
||||
Fixed a crashing bug on NAT-Traversal connections.
|
||||
We sincerely apologize that the SoftEther VPN Server of the last build (Build 9432) has a serious crashing bug if a VPN client connects to the VPN Server in the NAT Traversal mode, in UNIX system. This serious bug was caused by the problem of the processing of Unicode string (which is used by a warning message for NAT Traversal connections). We fixed the serious bug by this Build 9433. If you are using SoftEther VPN Server Build 9430 or 9432 in UNIX, please update it to Build 9433 as soon as possible.
|
||||
|
||||
SoftEther VPN 4.06 Build 9432 (Beta) (March 20, 2014)
|
||||
We apologize that the previous build (Build 9430) has a problem that the RSA certificate authentication doesn't work.
|
||||
This build has been fixed the problem. Please use Build 9432 if you are intending to use the RSA certificate authentication function.
|
||||
|
||||
SoftEther VPN 4.06 Build 9430 (Beta) (March 20, 2014)
|
||||
Thank you for waiting!
|
||||
Added the following five advanced functions into SoftEther VPN Server (experimental) :
|
||||
- RADIUS / NT Domain user authentication function
|
||||
- RSA certificate user authentication function
|
||||
- Deep-inspect packet logging function
|
||||
- Source IP address control list function
|
||||
- syslog transfer function
|
||||
|
||||
Added the split-tunneling function (experimental) :
|
||||
- Split tunneling is the function for enterprises to allow users communicate only to the specified IPv4 subnets through a VPN tunnel.
|
||||
- You can set up either SecureNAT Virtual DHCP Server or any external DHCP server to push static routing tables to all VPN clients.
|
||||
- The Virtual DHCP Server function in SecureNAT now supports classless static routing table pushing option (RFC 3442).
|
||||
- All types of VPN clients (SoftEther VPN Client, OpenVPN Client, L2TP/IPsec client and MS-SSTP client) can receive the static routing table pushed.
|
||||
|
||||
Added the function which allows the VPN server administrator to obtain the DDNS private key on the DDNS setup dialog-box.
|
||||
Improved the behavior of the Privacy Filter Mode security policy. In the previous versions, a VPN session which is enabled the Privacy Filter Mode option cannot transmit any packets toward other Privacy Filter Mode enabled VPN sessions, except broadcast packets and ARP packets. On or after this version, both broadcast packets and ARP packets will also be blocked by the Privacy Filter Mode policy to eliminate the broadcast traffics. For the backward compatibility, this behavior can be changed by the "DropBroadcastsInPrivacyFilterMode" and "DropArpInPrivacyFilterMode" bool options on the Virtual Hub Extended Options.
|
||||
Added the generating function of X.509 v3 certificates with the SHA-2 (SHA-256) hashing algorithm to improve the security.
|
||||
According to the users reports, on very minor Linux environment, the "vpnserver stop" shutdown operation sometimes hangs up. The SoftEther VPN Project hasn't reproduce the issue yet. However, we added the fail-safe code to run "killall -KILL vpnserver" after the process shutdown operation times out (90 seconds).
|
||||
Added the option to disable the NAT Traversal tunneling function on the connection settings screen in VPN Client and Cascade Connection.
|
||||
Added Several Fixes for OS X.
|
||||
Added Improved Simplified Chinese UI resources.
|
||||
Added Workaround for when vpnserver hangs on stop on minor Linux environments.
|
||||
On VPN Servers in People's Republic of China, the above five functions are currently disabled by default, under the orders from Beijing. Although Chinese users can enable these functions manually, Enterprise users in People's Republic of China are recommended to use these enterprise functions with PacketiX VPN Server 4.0 Chinese Edition.
|
||||
|
||||
SoftEther VPN 4.05 Build 9423 (Beta) (February 18, 2014)
|
||||
Added Files for building CentOS/RHEL RPM.
|
||||
Set the "VPN over DNS" and "VPN over ICMP" functions disabled by default on VPN Server / VPN Bridge.
|
||||
|
||||
SoftEther VPN 4.05 Build 9422 (Beta) (February 17, 2014)
|
||||
Added the supporting of /hostname and /password command-line arguments on VPN Client.
|
||||
Added the NSDI 6.x Lightweight Helper Kernel-mode Module for the local-bridge function. This kernel-mode driver runs only on Windows 8.1 / Windows Server 2012 R2 or later.
|
||||
|
||||
SoftEther VPN 4.05 Build 9416 (Beta) (February 6, 2014)
|
||||
Added the support for OpenBSD on the source code.
|
||||
Added the debian packaging on the source code.
|
||||
Added the adminip.txt CIDR support.
|
||||
Added the supporting VLAN for Mac OS X using TunTapOSX.
|
||||
Added the .zip package with vpnsmgr.exe and vpncmd.exe for system administrators.
|
||||
|
||||
SoftEther VPN 4.04 Build 9412 (January 15, 2014)
|
||||
Whole English UI texts are checked and corrected by a native speaker of English. Fixed typos.
|
||||
|
||||
SoftEther VPN 4.03 Build 9411 (January 7, 2014)
|
||||
Modified the source-code tree. In the build 9408, some C# build-utility source codes were missing. In this build, full set of all source codes including the BuildUtil program are appended. No functional differences between this build and the last build.
|
||||
|
||||
SoftEther VPN 4.03 Build 9408 (January 4, 2014)
|
||||
SoftEther VPN became open source software from this build. More details on this page. Note that the major version 3.xx was skipped for internal reason of our project. So this open-sourced new version starts with major version 4.xx.
|
||||
|
||||
SoftEther VPN 2.00 Build 9387 (September 16, 2013)
|
||||
This build realizes the compatibility with Microsoft Windows 8.1 and Windows Server 2012 R2 (RTM). This build supports Windows 8.1 and Windows Server 2012 R2 officially. This build fixes the former problem when the user upgrades from Windows 8 to Windows 8.1 by upgrade installation.
|
||||
The major version number of SoftEther VPN was incremented on this build.
|
||||
|
||||
SoftEther VPN 1.01 Build 9379 RTM (August 18, 2013)
|
||||
This security update is to strengthen the security of SoftEther VPN 1.0 (Server and Bridge).
|
||||
There is a remote administration function on SoftEther VPN 1.0. The function is to allow administrators to connect to the VPN server remotely to manage the server. In older versions, a third person can login to the VPN Server in the Virtual Hub Administration Mode if the administrator has forgot to set the administrator's password on a Virtual Hub. Older versions are also safe if any strong password is set on the Virtual Hub. However we suppose that there are some administrators who have forgot to set passwords for Virtual Hubs. In order to protect such potential vulnerable servers, this security update strengthens the VPN server program to deny all empty (not set) passwords on the Virtual Hub Administration Mode. Your VPN server has been safe also in older versions if you set any passwords for Virtual Hubs. However, we strongly recommend to apply this update program to all VPN server administrators who might have potential empty passwords on Virtual Hubs.
|
||||
|
||||
SoftEther VPN 1.00 Build 9376, 9377 RTM (August 3, 2013)
|
||||
This is a minor fix.
|
||||
Improvement Stability of NAT Traversal.
|
||||
Add HTTP User-Agent Indication Behavior when using VPN Gate Client.
|
||||
|
||||
SoftEther VPN 1.00 Build 9371 RTM (July 25, 2013)
|
||||
This is the RTM version of SoftEther VPN 1.0. It is not a BETA version.
|
||||
We have fixed a lot of bugs in former builds. This RTM build is a stable build for everyone.
|
||||
We will continue to improve features and performances on SoftEther VPN hereafter.
|
||||
|
||||
SoftEther VPN 1.00 Build 9367 RC4 (July 21, 2013)
|
||||
This should be the final beta release before the RTM version of SoftEther VPN 1.0.
|
||||
|
||||
SoftEther VPN 1.00 Build 9091 RC3 (May 19, 2013)
|
||||
We released RC3 with the following improvements. RC3 should be the final release candidate before the GA (Generally Available) build.
|
||||
- Fixed a crush bug which might occurred during the shutdown of vpnserver process with using L2TPv3 or EtherIP over IPsec.
|
||||
- The statistics of cumulative transferred-bytes and packets-counter are appended on the list of Visual Hubs and on the list of User Objects on each Virtual Hub, on VPN Server Manager and vpncmd.
|
||||
- On the list of User Objects enumeration in both VPN Server Manager and vpncmd, the expire-date of each User Object are appended on the displayed list.
|
||||
- Improvements of stability of Dynamic DNS Function and NAT-Traversal Function.
|
||||
|
||||
SoftEther VPN 1.00 Build 9079 RC2 Fix17 (May 5, 2013)
|
||||
Fixed a typo. Fixed a wrong bitmap image on the installer.
|
||||
|
||||
SoftEther VPN 1.00 Build 9078 RC2 Fix16 (April 28, 2013)
|
||||
A security fix. The previous versions have ignored the "deny_empty_password" option in the Virtual Hub Administration Options List. This build fixed this security bug.
|
||||
Fixed some minor bugs.
|
||||
Improvement of the respond-time on IPv6 DNS name resolver.
|
||||
|
||||
SoftEther VPN 1.00 Build 9074 RC2 Fix15 (April 24, 2013)
|
||||
Minor improvement around the Dynamic DNS Client function.
|
||||
|
||||
SoftEther VPN 1.00 Build 9071 RC2 Fix14 (April 20, 2013)
|
||||
Fixed a minor timeout bug.
|
||||
|
||||
SoftEther VPN 1.00 Build 9070 RC2 Fix13 (April 18, 2013)
|
||||
Enabled advanced security check routines for butter overflow (Win32 binaries only.)
|
||||
File sizes have been increased a little, but the performance wasn't affected.
|
||||
|
||||
SoftEther VPN 1.00 Build 9069 RC2 Fix12 (April 17, 2013)
|
||||
Fixed a minor bug on SSL packet processing.
|
||||
Fixed a miror bug on TCP listener. (very rare crash)
|
||||
|
||||
SoftEther VPN 1.00 Build 9053 RC2 Fix11 (April 8, 2013)
|
||||
Fixed a minor bug on UDP packet processing.
|
||||
Added a new feature: IKE and OpenVPN (in UDP packets) Packet Logging Function.
|
||||
|
||||
SoftEther VPN 1.00 Build 9045 RC2 Fix10 (April 2, 2013)
|
||||
Fixed a minor bug, and improved the stability.
|
||||
|
||||
SoftEther VPN 1.00 Build 9043 RC2 Fix9 (April 1, 2013)
|
||||
Fixed a critical bug was in the HTTP packet parser.
|
||||
Improvement of the stability of UDP-based communication.
|
||||
Fixed a problem: SecureNAT's connectivity polling packet interval was too short.
|
||||
|
||||
SoftEther VPN 1.00 Build 9035 RC2 Fix8 (March 26, 2013)
|
||||
Fixed a crash bug: While you are changing the X.509 server certificate, if a new SSL-VPN connection is being made, the new connection attempt will cause the crash because lack of critical section locking. However this bug was very rare. We found it in the heavy stress test.
|
||||
|
||||
SoftEther VPN 1.00 Build 9033 RC2 Fix7 (March 22, 2013)
|
||||
Fixed a minor bug.
|
||||
|
||||
SoftEther VPN 1.00 Build 9030 RC2 Fix6 (March 21, 2013)
|
||||
Fixed a bug: A logged error message around the L2TP/SSTP/OpenVPN user-authentication was incorrect.
|
||||
|
||||
SoftEther VPN 1.00 Build 9029 RC2 Fix5 (March 17, 2013)
|
||||
Fixed a minor bug and typo.
|
||||
|
||||
SoftEther VPN 1.00 Build 9027 RC2 Fix4 (March 12, 2013)
|
||||
Fixed a minor bug.
|
||||
|
||||
SoftEther VPN 1.00 Build 9026 RC2 Fix3 (March 10, 2013)
|
||||
Fixed a bug: the timeout to the DDNS server was too small.
|
||||
|
||||
SoftEther VPN 1.00 Build 9024 RC2 Fix2 (March 09, 2013)
|
||||
Fixed a bug: On Windows, VPN over DNS could not be enabled.
|
||||
|
||||
SoftEther VPN 1.00 Build 9023 RC2 Fix1 (March 08, 2013)
|
||||
Fixed a minor bug.
|
||||
|
||||
SoftEther VPN 1.00 Build 9022 RC2 (March 08, 2013)
|
||||
The initial release.
|
104
ContainerREADME.md
Normal file
104
ContainerREADME.md
Normal file
@ -0,0 +1,104 @@
|
||||
# SoftetherVPN Container images
|
||||
|
||||
This container is designed to be as small as possible and host a SoftEther VPN Server, Bridge or Client.
|
||||
It´s based on Alpine so resulting Image is kept as small as 15MB!
|
||||
|
||||
## Not working
|
||||
|
||||
* bridging to a physical Ethernet adapter
|
||||
|
||||
## working
|
||||
|
||||
* OpenVPN
|
||||
* L2tp
|
||||
* SSL
|
||||
* SecureNAT
|
||||
* Wireguard (not with the "stable" tag)
|
||||
|
||||
|
||||
|
||||
## Available Tags
|
||||
|
||||
|
||||
|Image|Description|
|
||||
|---|---|
|
||||
|softethervpn/vpnserver:stable|Latest stable release from https://github.com/SoftEtherVPN/SoftEtherVPN_Stable|
|
||||
|softethervpn/vpnserver:v4.39-9772-beta|Tagged build|
|
||||
|softethervpn/vpnserver:latest|Latest commits from https://github.com/SoftEtherVPN/SoftEtherVPN|
|
||||
|
||||
|
||||
You should always specify your wanted version like `softethervpn/vpnserver:5.02.5180`
|
||||
|
||||
## Usage docker run
|
||||
|
||||
This will keep your config and Logfiles in the docker volume `softetherdata`
|
||||
|
||||
`docker run -d --rm --name softether-vpn-server -v softetherdata:/var/lib/softether -v softetherlogs:/var/log/softether -p 443:443/tcp -p 992:992/tcp -p 1194:1194/udp -p 5555:5555/tcp -p 500:500/udp -p 4500:4500/udp -p 1701:1701/udp --cap-add NET_ADMIN softethervpn/vpnserver:stable`
|
||||
|
||||
## Port requirements
|
||||
|
||||
As there are different operating modes for SoftetherVPN there is a variety of ports that might or might not be needed.
|
||||
For operation with Softether Clients at least 443, 992 or 5555 is needed.
|
||||
See https://www.softether.org/4-docs/1-manual/1/1.6 for reference on the Softether ports.
|
||||
Others are commented out in the docker-compose example.
|
||||
|
||||
## Usage docker-compose
|
||||
|
||||
The same command can be achieved by docker-compose, the docker compose file is in the repository.
|
||||
You can specify the respective docker-compose.yaml like so:
|
||||
|
||||
`docker-compose -f docker-compose.vpnclient.yaml up -d`
|
||||
|
||||
By default the docker-compose.yaml is used:
|
||||
|
||||
```
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
softether:
|
||||
image: softethervpn/vpnserver:latest
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
restart: always
|
||||
ports:
|
||||
#- 53:53 #DNS tunneling
|
||||
- 443:443 #Management and HTTPS tunneling
|
||||
#- 992:992 #HTTPS tunneling
|
||||
#- 1194:1194/udp #OpenVPN
|
||||
#- 5555:5555 #HTTPS tunneling
|
||||
#- 500:500/udp #IPsec/L2TP
|
||||
#- 4500:4500/udp #IPsec/L2TP
|
||||
#- 1701:1701/udp #IPsec/L2TP
|
||||
volumes:
|
||||
- "/etc/localtime:/etc/localtime:ro"
|
||||
- "/etc/timezone:/etc/timezone:ro"
|
||||
- "./softether_data:/var/lib/softether"
|
||||
- "./softether_log:/var/log/softether"
|
||||
# - "./adminip.txt:/var/lib/softether/adminip.txt:ro"
|
||||
```
|
||||
|
||||
### Use vpncmd
|
||||
|
||||
With newer releases vpncmd is directly in the container so you can use it to configure vpn. You can can run it once the container is running :
|
||||
|
||||
`docker exec -it softether-vpn-server vpncmd localhost`
|
||||
example to configure a vpnclient
|
||||
|
||||
```
|
||||
docker exec -it softether-vpn-server vpncmd localhost /client
|
||||
|
||||
VPN Client> AccountSet homevpn /SERVER:192.168.1.1:443 /HUB:VPN
|
||||
VPN Client> AccountPasswordSet homevpn /PASSWORD:verysecurepassword /TYPE:standard
|
||||
VPN Client> AccountConnect homevpn
|
||||
|
||||
#Automatically connect once container starts
|
||||
VPN Client> AccountStartupSet homevpn
|
||||
|
||||
#Checking State
|
||||
VPN Client> AccountStatusGet homevpn
|
||||
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
` docker build --target vpnclient -t softethevpn:latest .`
|
BIN
Declaration_Switch_License_from_GPL_to_Apache.pdf
Normal file
BIN
Declaration_Switch_License_from_GPL_to_Apache.pdf
Normal file
Binary file not shown.
51
Dockerfile
Normal file
51
Dockerfile
Normal file
@ -0,0 +1,51 @@
|
||||
FROM alpine AS builder
|
||||
RUN mkdir /usr/local/src && apk add binutils --no-cache\
|
||||
linux-headers \
|
||||
build-base \
|
||||
readline-dev \
|
||||
openssl-dev \
|
||||
ncurses-dev \
|
||||
git \
|
||||
cmake \
|
||||
zlib-dev \
|
||||
libsodium-dev \
|
||||
gnu-libiconv
|
||||
|
||||
ENV LD_PRELOAD=/usr/lib/preloadable_libiconv.so
|
||||
ADD ./ /usr/local/src/SoftEtherVPN/
|
||||
WORKDIR /usr/local/src
|
||||
ENV USE_MUSL=YES
|
||||
ENV CMAKE_FLAGS="-DSE_PIDDIR=/run/softether -DSE_LOGDIR=/var/log/softether -DSE_DBDIR=/var/lib/softether"
|
||||
RUN cd SoftEtherVPN &&\
|
||||
./configure &&\
|
||||
make -j $(getconf _NPROCESSORS_ONLN) -C build
|
||||
|
||||
FROM alpine AS base
|
||||
RUN apk add --no-cache readline \
|
||||
openssl \
|
||||
libsodium \
|
||||
gnu-libiconv \
|
||||
iptables
|
||||
ENV LD_PRELOAD=/usr/lib/preloadable_libiconv.so
|
||||
WORKDIR /usr/local/bin
|
||||
VOLUME /var/log/softether
|
||||
VOLUME /var/lib/softether
|
||||
VOLUME /run/softether
|
||||
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpncmd /usr/local/src/SoftEtherVPN/build/hamcore.se2 ./
|
||||
COPY --from=builder /usr/local/src/SoftEtherVPN/build/libcedar.so /usr/local/src/SoftEtherVPN/build/libmayaqua.so /usr/local/lib/
|
||||
|
||||
|
||||
FROM base AS vpnserver
|
||||
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnserver ./
|
||||
EXPOSE 443/tcp 992/tcp 1194/tcp 1194/udp 5555/tcp 500/udp 4500/udp
|
||||
CMD ["/usr/local/bin/vpnserver", "execsvc"]
|
||||
|
||||
|
||||
FROM base AS vpnclient
|
||||
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnclient ./
|
||||
CMD ["/usr/local/bin/vpnclient", "execsvc"]
|
||||
|
||||
|
||||
FROM base AS vpnbridge
|
||||
COPY --from=builder /usr/local/src/SoftEtherVPN/build/vpnbridge ./
|
||||
CMD ["/usr/local/bin/vpnbridge", "execsvc"]
|
1
FUNDING.yml
Normal file
1
FUNDING.yml
Normal file
@ -0,0 +1 @@
|
||||
liberapay: softether
|
487
LICENSE
487
LICENSE
@ -1,31 +1,200 @@
|
||||
SoftEther VPN Server, Client and Bridge are free software, and released as
|
||||
open-source. You can redistribute them and/or modify them under the terms of
|
||||
the GNU General Public License version 2 as published by the Free Software
|
||||
Foundation.
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
Copyright (c) Daiyuu Nobori.
|
||||
Copyright (c) SoftEther Project at University of Tsukuba, Japan.
|
||||
Copyright (c) SoftEther Corporation.
|
||||
All Rights Reserved.
|
||||
http://www.softether.org/
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License version 2 as published by the Free
|
||||
Software Foundation.
|
||||
1. Definitions.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
You should have received a copy of the GNU General Public License version 2
|
||||
along with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
Neither the name of SoftEther nor the names of its contributors may be used to
|
||||
endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
Copyright (c) all contributors on SoftEther VPN project in GitHub.
|
||||
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
|
||||
|
||||
DISCLAIMER
|
||||
==========
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
@ -67,278 +236,6 @@ LIABLE TO RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
|
||||
RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT JUST A
|
||||
STATEMENT FOR WARNING AND DISCLAIMER.
|
||||
|
||||
THE FOLLOWING GPLV2 CONDITIONS APPLY ON ALL SOFTETHER VPN PROGRAMS WHICH ARE
|
||||
DEVELOPED BY SOFTETHER VPN PROJECT.
|
||||
|
||||
READ AND UNDERSTAND THE 'src/WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
|
||||
SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
|
||||
LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'src/THIRD_PARTY.TXT' FILE.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your freedom to
|
||||
share and change it. By contrast, the GNU General Public License is intended
|
||||
to guarantee your freedom to share and change free software--to make sure the
|
||||
software is free for all its users. This General Public License applies to
|
||||
most of the Free Software Foundation's software and to any other program whose
|
||||
authors commit to using it. (Some other Free Software Foundation software is
|
||||
covered by the GNU Lesser General Public License instead.) You can apply it
|
||||
to your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not price. Our
|
||||
General Public Licenses are designed to make sure that you have the freedom to
|
||||
distribute copies of free software (and charge for this service if you wish),
|
||||
that you receive source code or can get it if you want it, that you can change
|
||||
the software or use pieces of it in new free programs; and that you know you
|
||||
can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the rights. These
|
||||
restrictions translate to certain responsibilities for you if you distribute
|
||||
copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether gratis or
|
||||
for a fee, you must give the recipients all the rights that you have. You
|
||||
must make sure that they, too, receive or can get the source code. And you
|
||||
must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and (2)
|
||||
offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain that
|
||||
everyone understands that there is no warranty for this free software. If the
|
||||
software is modified by someone else and passed on, we want its recipients to
|
||||
know that what they have is not the original, so that any problems introduced
|
||||
by others will not reflect on the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that redistributors of a free program will
|
||||
individually obtain patent licenses, in effect making the program proprietary.
|
||||
To prevent this, we have made it clear that any patent must be licensed for
|
||||
everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and modification
|
||||
follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains a notice
|
||||
placed by the copyright holder saying it may be distributed under the terms of
|
||||
this General Public License. The "Program", below, refers to any such program
|
||||
or work, and a "work based on the Program" means either the Program or any
|
||||
derivative work under copyright law: that is to say, a work containing the
|
||||
Program or a portion of it, either verbatim or with modifications and/or
|
||||
translated into another language. (Hereinafter, translation is included
|
||||
without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not covered
|
||||
by this License; they are outside its scope. The act of running the Program
|
||||
is not restricted, and the output from the Program is covered only if its
|
||||
contents constitute a work based on the Program (independent of having been
|
||||
made by running the Program). Whether that is true depends on what the Program
|
||||
does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's source code
|
||||
as you receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice and
|
||||
disclaimer of warranty; keep intact all the notices that refer to this License
|
||||
and to the absence of any warranty; and give any other recipients of the
|
||||
Program a copy of this License along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and you may
|
||||
at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion of it,
|
||||
thus forming a work based on the Program, and copy and distribute such
|
||||
modifications or work under the terms of Section 1 above, provided that you
|
||||
also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices stating
|
||||
that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in whole
|
||||
or in part contains or is derived from the Program or any part thereof, to be
|
||||
licensed as a whole at no charge to all third parties under the terms of this
|
||||
License.
|
||||
|
||||
c) If the modified program normally reads commands interactively when run,
|
||||
you must cause it, when started running for such interactive use in the most
|
||||
ordinary way, to print or display an announcement including an appropriate
|
||||
copyright notice and a notice that there is no warranty (or else, saying that
|
||||
you provide a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this License.
|
||||
(Exception: if the Program itself is interactive but does not normally print
|
||||
such an announcement, your work based on the Program is not required to print
|
||||
an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If identifiable
|
||||
sections of that work are not derived from the Program, and can be reasonably
|
||||
considered independent and separate works in themselves, then this License,
|
||||
and its terms, do not apply to those sections when you distribute them as
|
||||
separate works. But when you distribute the same sections as part of a whole
|
||||
which is a work based on the Program, the distribution of the whole must be on
|
||||
the terms of this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest your
|
||||
rights to work written entirely by you; rather, the intent is to exercise the
|
||||
right to control the distribution of derivative or collective works based on
|
||||
the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program with
|
||||
the Program (or with a work based on the Program) on a volume of a storage or
|
||||
distribution medium does not bring the other work under the scope of this
|
||||
License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, under
|
||||
Section 2) in object code or executable form under the terms of Sections 1 and
|
||||
2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable source
|
||||
code, which must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three years, to
|
||||
give any third party, for a charge no more than your cost of physically
|
||||
performing source distribution, a complete machine-readable copy of the
|
||||
corresponding source code, to be distributed under the terms of Sections 1 and
|
||||
2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer to
|
||||
distribute corresponding source code. (This alternative is allowed only for
|
||||
noncommercial distribution and only if you received the program in object code
|
||||
or executable form with such an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for making
|
||||
modifications to it. For an executable work, complete source code means all
|
||||
the source code for all modules it contains, plus any associated interface
|
||||
definition files, plus the scripts used to control compilation and
|
||||
installation of the executable. However, as a special exception, the source
|
||||
code distributed need not include anything that is normally distributed (in
|
||||
either source or binary form) with the major components (compiler, kernel, and
|
||||
so on) of the operating system on which the executable runs, unless that
|
||||
component itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering access to
|
||||
copy from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place counts as distribution of the source code,
|
||||
even though third parties are not compelled to copy the source along with the
|
||||
object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program except as
|
||||
expressly provided under this License. Any attempt otherwise to copy, modify,
|
||||
sublicense or distribute the Program is void, and will automatically terminate
|
||||
your rights under this License. However, parties who have received copies, or
|
||||
rights, from you under this License will not have their licenses terminated so
|
||||
long as such parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not signed
|
||||
it. However, nothing else grants you permission to modify or distribute the
|
||||
Program or its derivative works. These actions are prohibited by law if you
|
||||
do not accept this License. Therefore, by modifying or distributing the
|
||||
Program (or any work based on the Program), you indicate your acceptance of
|
||||
this License to do so, and all its terms and conditions for copying,
|
||||
distributing or modifying the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the original
|
||||
licensor to copy, distribute or modify the Program subject to these terms and
|
||||
conditions. You may not impose any further restrictions on the recipients'
|
||||
exercise of the rights granted herein. You are not responsible for enforcing
|
||||
compliance by third parties to this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or otherwise)
|
||||
that contradict the conditions of this License, they do not excuse you from
|
||||
the conditions of this License. If you cannot distribute so as to satisfy
|
||||
simultaneously your obligations under this License and any other pertinent
|
||||
obligations, then as a consequence you may not distribute the Program at all.
|
||||
For example, if a patent license would not permit royalty-free redistribution
|
||||
of the Program by all those who receive copies directly or indirectly through
|
||||
you, then the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply and
|
||||
the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any patents or
|
||||
other property right claims or to contest validity of any such claims; this
|
||||
section has the sole purpose of protecting the integrity of the free software
|
||||
distribution system, which is implemented by public license practices. Many
|
||||
people have made generous contributions to the wide range of software
|
||||
distributed through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing to
|
||||
distribute software through any other system and a licensee cannot impose that
|
||||
choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to be a
|
||||
consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in certain
|
||||
countries either by patents or by copyrighted interfaces, the original
|
||||
copyright holder who places the Program under this License may add an explicit
|
||||
geographical distribution limitation excluding those countries, so that
|
||||
distribution is permitted only in or among countries not thus excluded. In
|
||||
such case, this License incorporates the limitation as if written in the body
|
||||
of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions of
|
||||
the General Public License from time to time. Such new versions will be
|
||||
similar in spirit to the present version, but may differ in detail to address
|
||||
new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any later
|
||||
version", you have the option of following the terms and conditions either of
|
||||
that version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of this License,
|
||||
you may choose any version ever published by the Free Software Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free programs
|
||||
whose distribution conditions are different, write to the author to ask for
|
||||
permission. For software which is copyrighted by the Free Software
|
||||
Foundation, write to the Free Software Foundation; we sometimes make
|
||||
exceptions for this. Our decision will be guided by the two goals of
|
||||
preserving the free status of all derivatives of our free software and of
|
||||
promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
|
||||
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
|
||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
|
||||
PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
|
||||
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
|
||||
PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
|
||||
YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
|
||||
LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
|
||||
THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
READ AND UNDERSTAND THE 'src/WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
|
||||
SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
|
||||
LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'src/THIRD_PARTY.TXT' FILE.
|
||||
|
181
README.md
181
README.md
@ -1,21 +1,29 @@
|
||||
# SoftEther VPN
|
||||
|
||||
[](https://ci.appveyor.com/project/softethervpn/softethervpn) [](https://travis-ci.org/SoftEtherVPN/SoftEtherVPN) [](https://scan.coverity.com/projects/softethervpn-softethervpn)
|
||||
||Badges|
|
||||
|---|---|
|
||||
|GitLab CI|[](https://gitlab.com/SoftEther/SoftEtherVPN/pipelines)|
|
||||
|Coverity Scan|[](https://scan.coverity.com/projects/softethervpn-softethervpn)|
|
||||
|Cirrus CI|[](https://cirrus-ci.com/github/SoftEtherVPN/SoftEtherVPN)|
|
||||
|
||||
- [SoftEther VPN](#softether-vpn)
|
||||
- [BOARD MEMBERS OF THIS REPOSITORY](#board-members-of-this-repository)
|
||||
- [SOFTETHER VPN ADVANTAGES](#softether-vpn-advantages)
|
||||
- [Installation](#installation)
|
||||
* [For Ubuntu](#for-ubuntu)
|
||||
* [From binary installers:](#from-binary-installers)
|
||||
* [For FreeBSD](#for-freebsd)
|
||||
* [For Windows](#for-windows)
|
||||
* [From binary installers (stable channel)](#from-binary-installers-stable-channel)
|
||||
* [Build from Source code](#build-from-source-code)
|
||||
- [About HTML5-based Modern Admin Console and JSON-RPC API Suite](#about-html5-based-modern-admin-console-and-json-rpc-api-suite)
|
||||
* [Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console](#built-in-softether-vpn-server-html5-ajax-based-web-administration-console)
|
||||
* [Built-in SoftEther Server VPN JSON-RPC API Suite](#built-in-softether-server-vpn-json-rpc-api-suite)
|
||||
- [TO CIRCUMVENT YOUR GOVERNMENT'S FIREWALL RESTRICTION](#to-circumvent-your-governments-firewall-restriction)
|
||||
- [SOURCE CODE CONTRIBUTION](#source-code-contribution)
|
||||
- [DEAR SECURITY EXPERTS](#dear-security-experts)
|
||||
|
||||
SoftEther VPN (Developer Edition Master Repository)
|
||||
- An Open-Source Cross-platform Multi-protocol VPN Program
|
||||
http://www.softether.org/
|
||||
https://www.softether.org/
|
||||
|
||||
|
||||
This repository has experimental codes. Pull requests are welcome.
|
||||
@ -24,13 +32,15 @@ Stable Edition is available on
|
||||
https://github.com/SoftEtherVPN/SoftEtherVPN_Stable
|
||||
which the non-developer user can stable use.
|
||||
|
||||
Please note that [some features](#comparison-with-stable-edition) are not available in Stable Edition.
|
||||
|
||||
Source code packages (.zip and .tar.gz) and binary files of Stable Edition are also available:
|
||||
http://www.softether-download.com/
|
||||
https://www.softether-download.com/
|
||||
|
||||
We accept your patches by the acceptance policy:
|
||||
http://www.softether.org/5-download/src/9.patch
|
||||
Copyright (c) all contributors on SoftEther VPN project in GitHub.
|
||||
Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
|
||||
|
||||
Copyright (c) SoftEther Project at University of Tsukuba, Japan.
|
||||
---
|
||||
|
||||
The development of SoftEther VPN was supported by the MITOH Project,
|
||||
a research and development project by Japanese Government,
|
||||
@ -38,10 +48,23 @@ subsidized by Ministry of Economy, Trade and Industry of Japan,
|
||||
administrated by Information Promotion Agency.
|
||||
https://www.ipa.go.jp/english/humandev/
|
||||
|
||||
---
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2
|
||||
as published by the Free Software Foundation.
|
||||

|
||||
|
||||
[Icons8](https://icons8.com) kindly supported the project by gifting a license which allows to edit and redistribute their icons.
|
||||
|
||||
Please note that you are not allowed to redistribute those icons outside of this repository.
|
||||
|
||||
The developers of SoftEther VPN love Icons8's work and kindly ask the users to support them as much as possible.
|
||||
|
||||
---
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
SoftEther VPN ("SoftEther" means "Software Ethernet") is one of the
|
||||
world's most powerful and easy-to-use multi-protocol VPN software.
|
||||
@ -49,10 +72,10 @@ world's most powerful and easy-to-use multi-protocol VPN software.
|
||||
SoftEther VPN runs on Windows, Linux, Mac, FreeBSD and Solaris.
|
||||
|
||||
SoftEther VPN supports most of widely-used VPN protocols
|
||||
including SSL-VPN, OpenVPN, IPsec, L2TP, MS-SSTP, L2TPv3 and EtherIP
|
||||
including SSL-VPN, WireGuard, OpenVPN, IPsec, L2TP, MS-SSTP, L2TPv3 and EtherIP
|
||||
by the single SoftEther VPN Server program.
|
||||
|
||||
More details on http://www.softether.org/.
|
||||
More details on https://www.softether.org/.
|
||||
|
||||
|
||||
# BOARD MEMBERS OF THIS REPOSITORY
|
||||
@ -82,6 +105,7 @@ https://github.com/chipitsine
|
||||
|
||||
- Supporting all popular VPN protocols by the single VPN server:
|
||||
SSL-VPN (HTTPS)
|
||||
WireGuard
|
||||
OpenVPN
|
||||
IPsec
|
||||
L2TP
|
||||
@ -114,20 +138,83 @@ https://github.com/chipitsine
|
||||
- No memory leaks. High quality stable codes, intended for long-term runs.
|
||||
We always verify that there are no memory or resource leaks before
|
||||
releasing the build.
|
||||
- More details at http://www.softether.org/.
|
||||
- More details at https://www.softether.org/.
|
||||
|
||||
# Comparison with Stable Edition
|
||||
|
||||
| Protocol | Stable Edition (SE) | Developer Edition (DE) | Comment |
|
||||
| --- | --- | --- | --- |
|
||||
| SSL-VPN | ✅ | ✅ | |
|
||||
| OpenVPN | ✅ | ✅ | AEAD mode is supported in DE only. |
|
||||
| IPsec | ✅ | ✅ | |
|
||||
| L2TP | ✅ | ✅ | |
|
||||
| MS-SSTP | ✅ | ✅ | |
|
||||
| L2TPv3 | ✅ | ✅ | |
|
||||
| EtherIP | ✅ | ✅ | |
|
||||
| WireGuard | ❌ | ✅ | |
|
||||
| IKEv2 | ❌ | ❌ | |
|
||||
|
||||
| Feature | Stable Edition (SE) | Developer Edition (DE) | Comment |
|
||||
| --- | --- | --- | --- |
|
||||
| Password Authentication | ✅ | ✅ | |
|
||||
| RADIUS / NT Authentication | ✅ | ✅ | |
|
||||
| Certificate Authentication | ⚠️ | ✅ | SE supports the feature in SSL-VPN only. |
|
||||
| IPv6-capable VPN Tunnel | ⚠️ | ✅ | SE supports IPv6 in L2 VPN tunnels only. |
|
||||
| IPv4 Route Management | ✅ | ✅ | Windows clients only |
|
||||
| IPv6 Route Management | ❌ | ✅ | Windows clients only |
|
||||
| TLS Server Verification | ⚠️ | ✅ | In SE you need to specify the exact certificate or CA to verify. DE can perform standard TLS verification and use the system CA store. |
|
||||
| Dual-stack Name Resolution | ⚠️ | ✅ | SE attempts in IPv6 only after IPv4 has failed. |
|
||||
| ECDSA Certificates Import | ❌ | ✅ | |
|
||||
| Runs on Windows XP and Earlier | ✅ | ❌ | |
|
||||
| Compatible with SoftEther VPN 1.0 | ✅ | ❌ | |
|
||||
| AES-NI Hardware Acceleration | ⚠️ | ✅ | SE requires [intel_aes_lib](https://software.intel.com/sites/default/files/article/181731/intel-aesni-sample-library-v1.2.zip) to enable AES-NI, so x86 only. In DE, enabled by default as long as processor supports it (at least x86 and ARM). |
|
||||
|
||||
# Installation
|
||||
|
||||
## For Ubuntu
|
||||
## For FreeBSD
|
||||
|
||||
[Launchpad PPA](https://launchpad.net/~paskal-07/+archive/ubuntu/softethervpn/+packages) maintained by [Dmitry Verkhoturov](https://github.com/paskal)
|
||||
SoftEther VPN in FreeBSD Ports Collection is maintained by
|
||||
[Koichiro Iwao](https://people.FreeBSD.org/~meta/) ([@metalefty](https://github.com/metalefty)).
|
||||
|
||||
## From binary installers:
|
||||
Binary package can be installed by pkg:
|
||||
```
|
||||
pkg install softether5
|
||||
```
|
||||
|
||||
Those can be found under http://www.softether-download.com/
|
||||
Alternatively, it can be built & installed by ports:
|
||||
```
|
||||
make install -C /usr/ports/security/softether5
|
||||
```
|
||||
|
||||
To run SoftEther VPN Server:
|
||||
```
|
||||
service softether_server start
|
||||
```
|
||||
|
||||
To configure SoftEther VPN Server startup on boot:
|
||||
```
|
||||
sysrc softether_server_enable=yes
|
||||
```
|
||||
|
||||
Also SoftEther VPN [Stable Edition](https://www.freshports.org/security/softether-devel/) and
|
||||
[RTM version](https://www.freshports.org/security/softether/) are available on FreeBSD.
|
||||
|
||||
## For Windows
|
||||
|
||||
[Releases](https://github.com/SoftEtherVPN/SoftEtherVPN/releases)
|
||||
|
||||
[Nightly builds](https://github.com/SoftEtherVPN/SoftEtherVPN/actions/workflows/windows.yml)
|
||||
(choose appropriate platform, then find binaries or installers as artifacts)
|
||||
|
||||
## From binary installers (stable channel)
|
||||
|
||||
Those can be found under https://www.softether-download.com/
|
||||
There you can also find SoftEtherVPN source code in zip and tar formats.
|
||||
|
||||
## Docker Container Image
|
||||
|
||||
Please look at the [ContainerREADME.md](ContainerREADME.md)
|
||||
|
||||
## Build from Source code
|
||||
|
||||
see [BUILD_UNIX](src/BUILD_UNIX.md) or [BUILD_WINDOWS](src/BUILD_WINDOWS.md)
|
||||
@ -137,6 +224,39 @@ There are two flavours of SoftEtherVPN source code:
|
||||
1. Unstable. Found under https://github.com/SoftEtherVPN/SoftEtherVPN
|
||||
2. Stable. Found under https://github.com/SoftEtherVPN/SoftEtherVPN_Stable
|
||||
|
||||
|
||||
# About HTML5-based Modern Admin Console and JSON-RPC API Suite
|
||||
|
||||
## Built-in SoftEther VPN Server HTML5 Ajax-based Web Administration Console
|
||||
We are developing the HTML5 Ajax-based Web Administration Console (currently very limited, under construction) in the embedded HTTPS server on the SoftEther VPN Server.
|
||||
|
||||
Access to the following URL from your favorite web browser.
|
||||
|
||||
```
|
||||
https://<vpn_server_hostname>:<port>/admin/
|
||||
```
|
||||
|
||||
For example if your VPN Server is running as the port 5555 on the host at 192.168.0.1, you can access to the web console by:
|
||||
|
||||
```
|
||||
https://192.168.0.1:5555/admin/
|
||||
```
|
||||
|
||||
Note: Your HTML5 development contribution is very appreciated. The current HTML5 pages are written by Daiyuu Nobori (the core developer of SoftEther VPN). He is obviously lack of HTML5 development ability. Please kindly consider to contribute for SoftEther VPN's development on GitHub. Your code will help every people running SoftEther VPN Server.
|
||||
|
||||
|
||||
## Built-in SoftEther Server VPN JSON-RPC API Suite
|
||||
The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions).
|
||||
|
||||
You can access to the [latest SoftEther VPN Server JSON-RPC Document on GitHub.](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/)
|
||||
|
||||
- Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API.
|
||||
You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)
|
||||
- If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server.
|
||||
- No need to use any specific API client library since all APIs are provided on the JSON-RPC 2.0 Specification. You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment.
|
||||
- Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. The Node.js Client Library for VPN Server RPC (vpnrpc) package is also available.
|
||||
|
||||
|
||||
# TO CIRCUMVENT YOUR GOVERNMENT'S FIREWALL RESTRICTION
|
||||
|
||||
Because SoftEther VPN is overly strong tool to build a VPN tunnel,
|
||||
@ -144,22 +264,23 @@ some censorship governments want to block your access to the source code
|
||||
of SoftEther VPN, by abusing their censorship firewalls.
|
||||
|
||||
To circumvent your censor's unjust restriction,
|
||||
SoftEther VPN Project distributes the up-to-date source-code
|
||||
SoftEther VPN Project distributes the up-to-date source code
|
||||
on all the following open-source repositories:
|
||||
|
||||
- GitHub
|
||||
https://github.com/SoftEtherVPN/SoftEtherVPN/
|
||||
https://github.com/SoftEtherVPN/SoftEtherVPN
|
||||
|
||||
```
|
||||
$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git
|
||||
```
|
||||
$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN.git
|
||||
|
||||
- GitLab (mirrored from GitHub)
|
||||
https://gitlab.com/SoftEther/SoftEtherVPN/
|
||||
https://gitlab.com/SoftEther/VPN
|
||||
|
||||
```
|
||||
$ git clone https://gitlab.com/SoftEther/SoftEtherVPN.git
|
||||
```
|
||||
$ git clone https://gitlab.com/SoftEther/VPN.git
|
||||
|
||||
- OneDev (mirrored from GitHub)
|
||||
https://code.onedev.io/SoftEther/VPN
|
||||
|
||||
$ git clone https://code.onedev.io/SoftEther/VPN.git
|
||||
|
||||
We hope that you can reach one of the above URLs at least!
|
||||
|
||||
@ -168,13 +289,11 @@ We hope that you can reach one of the above URLs at least!
|
||||
|
||||
Your contribution to SoftEther VPN Project is much appreciated.
|
||||
Please send patches to us through GitHub.
|
||||
Read the SoftEther VPN Patch Acceptance Policy in advance:
|
||||
http://www.softether.org/5-download/src/9.patch
|
||||
|
||||
|
||||
# DEAR SECURITY EXPERTS
|
||||
|
||||
If you find a bug or a security vulnerability please kindly inform us
|
||||
If you find a bug or a security vulnerability please [kindly inform](https://github.com/SoftEtherVPN/SoftEtherVPN/security/advisories/new) us
|
||||
about the problem immediately so that we can fix the security problem
|
||||
to protect a lot of users around the world as soon as possible.
|
||||
|
||||
@ -183,4 +302,4 @@ Our e-mail address for security reports is:
|
||||
|
||||
Please note that the above e-mail address is not a technical support
|
||||
inquiry address. If you need technical assistance, please visit
|
||||
http://www.softether.org/ and ask your question on the users forum.
|
||||
https://www.softether.org/ and ask your question on the users forum.
|
||||
|
15
SECURITY.md
Normal file
15
SECURITY.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 5.x | :white_check_mark: |
|
||||
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please use [github security reporting](https://github.com/SoftEtherVPN/SoftEtherVPN/security/advisories/new)
|
@ -0,0 +1,118 @@
|
||||
import Foundation
|
||||
import Network
|
||||
import Security
|
||||
|
||||
/// SecureConnection handles the TLS connection with the SoftEther VPN server
|
||||
class SecureConnection {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
private var connection: NWConnection?
|
||||
private let host: String
|
||||
private let port: UInt16
|
||||
private let queue = DispatchQueue(label: "com.softether.connection", qos: .userInitiated)
|
||||
|
||||
// MARK: - Initialization
|
||||
|
||||
/// Initialize a secure connection
|
||||
/// - Parameters:
|
||||
/// - host: Server hostname or IP address
|
||||
/// - port: Server port number
|
||||
init(host: String, port: UInt16) {
|
||||
self.host = host
|
||||
self.port = port
|
||||
}
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Connect to the server using TLS
|
||||
/// - Parameter completion: Callback with connection result
|
||||
func connect(completion: @escaping (Bool, Error?) -> Void) {
|
||||
let hostEndpoint = NWEndpoint.Host(host)
|
||||
let portEndpoint = NWEndpoint.Port(rawValue: port)!
|
||||
|
||||
// Create TLS parameters
|
||||
let tlsOptions = NWProtocolTLS.Options()
|
||||
|
||||
// Configure TLS for maximum compatibility with SoftEther
|
||||
let securityOptions = tlsOptions.securityProtocolOptions
|
||||
sec_protocol_options_set_tls_min_version(securityOptions, .TLSv12)
|
||||
sec_protocol_options_set_tls_max_version(securityOptions, .TLSv13)
|
||||
|
||||
// Allow all cipher suites for compatibility
|
||||
sec_protocol_options_set_cipher_suites(securityOptions, nil, 0)
|
||||
|
||||
// Disable certificate validation for initial development (ENABLE IN PRODUCTION)
|
||||
sec_protocol_options_set_verify_block(securityOptions, { (_, _, trustResult, _) in
|
||||
return true // Accept all certificates for testing
|
||||
}, queue)
|
||||
|
||||
// Create TCP options with TLS
|
||||
let tcpOptions = NWProtocolTCP.Options()
|
||||
tcpOptions.enableKeepalive = true
|
||||
tcpOptions.keepaliveIdle = 30
|
||||
|
||||
// Create connection parameters
|
||||
let parameters = NWParameters(tls: tlsOptions, tcp: tcpOptions)
|
||||
|
||||
// Create the connection
|
||||
connection = NWConnection(host: hostEndpoint, port: portEndpoint, using: parameters)
|
||||
|
||||
// Set up state handling
|
||||
connection?.stateUpdateHandler = { [weak self] state in
|
||||
switch state {
|
||||
case .ready:
|
||||
completion(true, nil)
|
||||
case .failed(let error):
|
||||
self?.disconnect()
|
||||
completion(false, error)
|
||||
case .cancelled:
|
||||
completion(false, NSError(domain: "SoftEtherError", code: 1000, userInfo: [NSLocalizedDescriptionKey: "Connection cancelled"]))
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// Start the connection
|
||||
connection?.start(queue: queue)
|
||||
}
|
||||
|
||||
/// Disconnect from the server
|
||||
func disconnect() {
|
||||
connection?.cancel()
|
||||
connection = nil
|
||||
}
|
||||
|
||||
/// Send data to the server
|
||||
/// - Parameters:
|
||||
/// - data: Data to send
|
||||
/// - completion: Callback with error if any
|
||||
func send(data: Data, completion: @escaping (Error?) -> Void) {
|
||||
guard let connection = connection, connection.state == .ready else {
|
||||
completion(NSError(domain: "SoftEtherError", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Connection not ready"]))
|
||||
return
|
||||
}
|
||||
|
||||
connection.send(content: data, completion: .contentProcessed { error in
|
||||
completion(error)
|
||||
})
|
||||
}
|
||||
|
||||
/// Receive data from the server
|
||||
/// - Parameter completion: Callback with received data and error if any
|
||||
func receive(completion: @escaping (Data?, Error?) -> Void) {
|
||||
guard let connection = connection, connection.state == .ready else {
|
||||
completion(nil, NSError(domain: "SoftEtherError", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Connection not ready"]))
|
||||
return
|
||||
}
|
||||
|
||||
connection.receive(minimumIncompleteLength: 1, maximumLength: 65536) { data, _, isComplete, error in
|
||||
completion(data, error)
|
||||
|
||||
if isComplete {
|
||||
// Connection was closed by the peer
|
||||
self.disconnect()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
import Foundation
|
||||
|
||||
/// Handles the specific client signature format that SoftEther expects
|
||||
class SoftEtherClientSignature {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
private enum Constants {
|
||||
static let clientBuildNumber: UInt32 = 5187
|
||||
static let clientVersion: UInt32 = 5_02_0000 + clientBuildNumber
|
||||
static let clientString = "SoftEther VPN Client"
|
||||
static let softEtherMagic: [UInt8] = [0x5E, 0x68] // 'Se' in hex
|
||||
|
||||
// Protocol identification constants from SoftEther source
|
||||
static let cedar = "CEDAR"
|
||||
static let sessionKey = "sessionkey"
|
||||
static let protocol1 = "PROTOCOL"
|
||||
static let protocol2 = "PROTOCOL2"
|
||||
}
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Generate the client signature packet that identifies this client as a legitimate SoftEther VPN client
|
||||
/// - Returns: Data containing the formatted client signature
|
||||
static func generateSignature() -> Data {
|
||||
var data = Data()
|
||||
|
||||
// 1. Add SoftEther magic bytes
|
||||
data.append(contentsOf: Constants.softEtherMagic)
|
||||
|
||||
// 2. Add client version in network byte order (big endian)
|
||||
data.appendUInt32(Constants.clientVersion)
|
||||
|
||||
// 3. Add client build number in network byte order
|
||||
data.appendUInt32(Constants.clientBuildNumber)
|
||||
|
||||
// 4. Add cedar protocol identifier
|
||||
if let cedarData = Constants.cedar.data(using: .ascii) {
|
||||
data.append(cedarData)
|
||||
data.append(0) // null terminator
|
||||
}
|
||||
|
||||
// 5. Add client string with null terminator
|
||||
if let clientString = (Constants.clientString + "\0").data(using: .ascii) {
|
||||
data.append(clientString)
|
||||
}
|
||||
|
||||
// 6. Add protocol identifiers
|
||||
if let protocolData = (Constants.protocol1 + "\0").data(using: .ascii) {
|
||||
data.append(protocolData)
|
||||
}
|
||||
|
||||
if let protocol2Data = (Constants.protocol2 + "\0").data(using: .ascii) {
|
||||
data.append(protocol2Data)
|
||||
}
|
||||
|
||||
// 7. Add session key marker
|
||||
if let sessionKeyData = (Constants.sessionKey + "\0").data(using: .ascii) {
|
||||
data.append(sessionKeyData)
|
||||
}
|
||||
|
||||
// 8. Add random data for session key (typically 20 bytes)
|
||||
let randomSessionKey = SoftEtherCrypto.randomBytes(count: 20)
|
||||
data.append(randomSessionKey)
|
||||
|
||||
// 9. Calculate and append SHA-1 hash of the entire data for integrity verification
|
||||
let hash = SoftEtherCrypto.sha1(data)
|
||||
data.append(hash)
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
/// Verify a server response to the client signature
|
||||
/// - Parameter data: Response data from server
|
||||
/// - Returns: True if valid response, false otherwise
|
||||
static func verifyServerResponse(_ data: Data) -> Bool {
|
||||
// Basic validation - a real implementation would parse and validate the server response format
|
||||
// This is a minimal check to see if we have enough data and it starts with the magic bytes
|
||||
guard data.count >= 8 else {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check if response starts with SoftEther magic bytes
|
||||
if data[0] == Constants.softEtherMagic[0] && data[1] == Constants.softEtherMagic[1] {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
import Foundation
|
||||
import CryptoKit
|
||||
|
||||
/// Handles encryption operations for SoftEther protocol
|
||||
class SoftEtherCrypto {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
private enum Constants {
|
||||
static let sha1Size = 20
|
||||
static let md5Size = 16
|
||||
}
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Generate secure random bytes
|
||||
/// - Parameter count: Number of random bytes to generate
|
||||
/// - Returns: Data containing random bytes
|
||||
static func randomBytes(count: Int) -> Data {
|
||||
var data = Data(count: count)
|
||||
_ = data.withUnsafeMutableBytes {
|
||||
SecRandomCopyBytes(kSecRandomDefault, count, $0.baseAddress!)
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
/// Calculate SHA-1 hash
|
||||
/// - Parameter data: Input data
|
||||
/// - Returns: SHA-1 hash of the input data
|
||||
static func sha1(_ data: Data) -> Data {
|
||||
let digest = SHA1.hash(data: data)
|
||||
return Data(digest)
|
||||
}
|
||||
|
||||
/// Calculate MD5 hash
|
||||
/// - Parameter data: Input data
|
||||
/// - Returns: MD5 hash of the input data
|
||||
static func md5(_ data: Data) -> Data {
|
||||
let digest = Insecure.MD5.hash(data: data)
|
||||
return Data(digest)
|
||||
}
|
||||
|
||||
/// Encrypt data using RC4 algorithm (for SoftEther compatibility)
|
||||
/// - Parameters:
|
||||
/// - data: Data to encrypt
|
||||
/// - key: Encryption key
|
||||
/// - Returns: Encrypted data
|
||||
static func rc4Encrypt(data: Data, key: Data) -> Data {
|
||||
let rc4 = RC4(key: key)
|
||||
return rc4.process(data)
|
||||
}
|
||||
|
||||
/// Decrypt data using RC4 algorithm (for SoftEther compatibility)
|
||||
/// - Parameters:
|
||||
/// - data: Data to decrypt
|
||||
/// - key: Decryption key
|
||||
/// - Returns: Decrypted data
|
||||
static func rc4Decrypt(data: Data, key: Data) -> Data {
|
||||
// RC4 is symmetric, so encryption and decryption are the same operation
|
||||
return rc4Encrypt(data: data, key: key)
|
||||
}
|
||||
}
|
||||
|
||||
/// Simple RC4 implementation for SoftEther compatibility
|
||||
/// Note: RC4 is considered insecure, but SoftEther uses it in parts of its protocol
|
||||
private class RC4 {
|
||||
private var state: [UInt8]
|
||||
|
||||
init(key: Data) {
|
||||
state = Array(0...255)
|
||||
var j: Int = 0
|
||||
|
||||
// Key scheduling algorithm
|
||||
for i in 0..<256 {
|
||||
let keyByte = key[i % key.count]
|
||||
j = (j + Int(state[i]) + Int(keyByte)) & 0xFF
|
||||
state.swapAt(i, j)
|
||||
}
|
||||
}
|
||||
|
||||
func process(_ data: Data) -> Data {
|
||||
var result = Data(count: data.count)
|
||||
var i: Int = 0
|
||||
var j: Int = 0
|
||||
|
||||
// Generate keystream and XOR with plaintext
|
||||
for k in 0..<data.count {
|
||||
i = (i + 1) & 0xFF
|
||||
j = (j + Int(state[i])) & 0xFF
|
||||
state.swapAt(i, j)
|
||||
let keyStreamByte = state[(Int(state[i]) + Int(state[j])) & 0xFF]
|
||||
result[k] = data[k] ^ keyStreamByte
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
123
SoftEtherVPN-iOS/SoftEtherVPN-iOS/Protocol/SoftEtherPacket.swift
Normal file
123
SoftEtherVPN-iOS/SoftEtherVPN-iOS/Protocol/SoftEtherPacket.swift
Normal file
@ -0,0 +1,123 @@
|
||||
import Foundation
|
||||
|
||||
/// Handles the SoftEther packet structure for communication
|
||||
class SoftEtherPacket {
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
private enum PacketType: UInt32 {
|
||||
case clientSignature = 0x01
|
||||
case serverResponse = 0x02
|
||||
case sessionRequest = 0x03
|
||||
case sessionResponse = 0x04
|
||||
case data = 0x05
|
||||
case keepAlive = 0x06
|
||||
}
|
||||
|
||||
private enum Constants {
|
||||
static let headerSize: UInt32 = 16
|
||||
static let maxPacketSize: UInt32 = 1024 * 1024 // 1MB
|
||||
}
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
private var packetType: PacketType
|
||||
private var packetId: UInt32
|
||||
private var packetData: Data
|
||||
|
||||
// MARK: - Initialization
|
||||
|
||||
/// Initialize a packet with type, ID and data
|
||||
/// - Parameters:
|
||||
/// - type: Packet type
|
||||
/// - id: Packet ID
|
||||
/// - data: Packet payload
|
||||
init(type: UInt32, id: UInt32, data: Data) {
|
||||
self.packetType = PacketType(rawValue: type) ?? .data
|
||||
self.packetId = id
|
||||
self.packetData = data
|
||||
}
|
||||
|
||||
/// Initialize a packet from raw data
|
||||
/// - Parameter data: Raw packet data
|
||||
init?(fromData data: Data) {
|
||||
guard data.count >= Int(Constants.headerSize) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Parse header
|
||||
let typeValue = data.readUInt32(at: 0)
|
||||
self.packetId = data.readUInt32(at: 4)
|
||||
let dataSize = data.readUInt32(at: 8)
|
||||
|
||||
// Validate packet
|
||||
guard let type = PacketType(rawValue: typeValue),
|
||||
dataSize <= Constants.maxPacketSize,
|
||||
data.count >= Int(Constants.headerSize + dataSize) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
self.packetType = type
|
||||
|
||||
// Extract payload
|
||||
let startIndex = Int(Constants.headerSize)
|
||||
let endIndex = startIndex + Int(dataSize)
|
||||
self.packetData = data.subdata(in: startIndex..<endIndex)
|
||||
}
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Serialize the packet to binary data format
|
||||
/// - Returns: Serialized packet data
|
||||
func serialize() -> Data {
|
||||
var result = Data(capacity: Int(Constants.headerSize) + packetData.count)
|
||||
|
||||
// Write header
|
||||
result.appendUInt32(packetType.rawValue)
|
||||
result.appendUInt32(packetId)
|
||||
result.appendUInt32(UInt32(packetData.count))
|
||||
result.appendUInt32(0) // Reserved
|
||||
|
||||
// Write payload
|
||||
result.append(packetData)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/// Get the packet type
|
||||
/// - Returns: Packet type
|
||||
func getType() -> UInt32 {
|
||||
return packetType.rawValue
|
||||
}
|
||||
|
||||
/// Get the packet ID
|
||||
/// - Returns: Packet ID
|
||||
func getId() -> UInt32 {
|
||||
return packetId
|
||||
}
|
||||
|
||||
/// Get the packet payload
|
||||
/// - Returns: Packet payload data
|
||||
func getData() -> Data {
|
||||
return packetData
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Extensions
|
||||
|
||||
extension Data {
|
||||
/// Read a UInt32 value from the data at specified offset
|
||||
/// - Parameter offset: Offset to read from
|
||||
/// - Returns: UInt32 value in big-endian order
|
||||
func readUInt32(at offset: Int) -> UInt32 {
|
||||
let slice = self.subdata(in: offset..<(offset + 4))
|
||||
return slice.withUnsafeBytes { $0.load(as: UInt32.self).bigEndian }
|
||||
}
|
||||
|
||||
/// Append a UInt32 value to the data in big-endian order
|
||||
/// - Parameter value: UInt32 value to append
|
||||
mutating func appendUInt32(_ value: UInt32) {
|
||||
var bigEndian = value.bigEndian
|
||||
append(UnsafeBufferPointer(start: &bigEndian, count: 1))
|
||||
}
|
||||
}
|
@ -0,0 +1,184 @@
|
||||
import Foundation
|
||||
import Network
|
||||
import Security
|
||||
import CryptoKit
|
||||
|
||||
/// SoftEtherProtocol manages the communication between iOS client and SoftEther VPN server
|
||||
class SoftEtherProtocol {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
private var secureConnection: SecureConnection?
|
||||
private var isConnected = false
|
||||
private var host: String = ""
|
||||
private var port: UInt16 = 443
|
||||
private var nextPacketId: UInt32 = 1
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Connect to a SoftEther VPN server
|
||||
/// - Parameters:
|
||||
/// - host: The server hostname or IP address
|
||||
/// - port: The server port (default: 443)
|
||||
/// - completion: Callback with connection result
|
||||
public func connect(to host: String, port: UInt16 = 443, completion: @escaping (Bool, Error?) -> Void) {
|
||||
self.host = host
|
||||
self.port = port
|
||||
|
||||
// Create a secure connection
|
||||
secureConnection = SecureConnection(host: host, port: port)
|
||||
|
||||
// Connect using TLS
|
||||
secureConnection?.connect { [weak self] success, error in
|
||||
guard let self = self, success else {
|
||||
completion(false, error ?? NSError(domain: "SoftEtherError", code: 1, userInfo: [NSLocalizedDescriptionKey: "TLS connection failed"]))
|
||||
return
|
||||
}
|
||||
|
||||
// After successful TLS connection, send the client signature
|
||||
self.sendClientSignature { success, error in
|
||||
if success {
|
||||
self.isConnected = true
|
||||
}
|
||||
completion(success, error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Disconnect from the server
|
||||
public func disconnect() {
|
||||
secureConnection?.disconnect()
|
||||
isConnected = false
|
||||
}
|
||||
|
||||
// MARK: - Private Methods
|
||||
|
||||
/// Send the SoftEther client signature to identify as a legitimate client
|
||||
/// - Parameter completion: Callback with result
|
||||
private func sendClientSignature(completion: @escaping (Bool, Error?) -> Void) {
|
||||
// Generate client signature using our specialized class
|
||||
let signatureData = SoftEtherClientSignature.generateSignature()
|
||||
|
||||
// Create a packet with the signature data
|
||||
let packetId = self.nextPacketId
|
||||
self.nextPacketId += 1
|
||||
|
||||
let packet = SoftEtherPacket(type: 0x01, id: packetId, data: signatureData)
|
||||
let packetData = packet.serialize()
|
||||
|
||||
print("Sending client signature packet: \(packetData.count) bytes")
|
||||
|
||||
// Send the packet
|
||||
secureConnection?.send(data: packetData) { [weak self] error in
|
||||
guard let self = self else { return }
|
||||
|
||||
if let error = error {
|
||||
print("Error sending client signature: \(error)")
|
||||
completion(false, error)
|
||||
return
|
||||
}
|
||||
|
||||
// After sending signature, wait for server response
|
||||
self.receiveServerResponse { success, error in
|
||||
completion(success, error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Receive and process server response after sending signature
|
||||
/// - Parameter completion: Callback with result
|
||||
private func receiveServerResponse(completion: @escaping (Bool, Error?) -> Void) {
|
||||
secureConnection?.receive { data, error in
|
||||
if let error = error {
|
||||
print("Error receiving server response: \(error)")
|
||||
completion(false, error)
|
||||
return
|
||||
}
|
||||
|
||||
guard let data = data, data.count > 4 else {
|
||||
let error = NSError(domain: "SoftEtherError", code: 2, userInfo: [NSLocalizedDescriptionKey: "Invalid server response"])
|
||||
print("Invalid server response: insufficient data")
|
||||
completion(false, error)
|
||||
return
|
||||
}
|
||||
|
||||
print("Received server response: \(data.count) bytes")
|
||||
|
||||
// Parse the response packet
|
||||
guard let packet = SoftEtherPacket(fromData: data) else {
|
||||
let error = NSError(domain: "SoftEtherError", code: 3, userInfo: [NSLocalizedDescriptionKey: "Invalid packet format"])
|
||||
print("Could not parse server response packet")
|
||||
completion(false, error)
|
||||
return
|
||||
}
|
||||
|
||||
// Verify the response
|
||||
let packetData = packet.getData()
|
||||
let isValid = SoftEtherClientSignature.verifyServerResponse(packetData)
|
||||
|
||||
if isValid {
|
||||
print("Server accepted our client signature")
|
||||
completion(true, nil)
|
||||
} else {
|
||||
print("Server rejected our client signature")
|
||||
let error = NSError(domain: "SoftEtherError", code: 4, userInfo: [NSLocalizedDescriptionKey: "Server rejected client signature"])
|
||||
completion(false, error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Send a data packet to the server
|
||||
/// - Parameters:
|
||||
/// - data: Data to send
|
||||
/// - completion: Callback with result
|
||||
func sendData(data: Data, completion: @escaping (Bool, Error?) -> Void) {
|
||||
guard isConnected else {
|
||||
completion(false, NSError(domain: "SoftEtherError", code: 5, userInfo: [NSLocalizedDescriptionKey: "Not connected to server"]))
|
||||
return
|
||||
}
|
||||
|
||||
let packetId = self.nextPacketId
|
||||
self.nextPacketId += 1
|
||||
|
||||
let packet = SoftEtherPacket(type: 0x05, id: packetId, data: data)
|
||||
let packetData = packet.serialize()
|
||||
|
||||
secureConnection?.send(data: packetData) { error in
|
||||
if let error = error {
|
||||
completion(false, error)
|
||||
return
|
||||
}
|
||||
|
||||
completion(true, nil)
|
||||
}
|
||||
}
|
||||
|
||||
/// Receive data from the server
|
||||
/// - Parameter completion: Callback with received data and result
|
||||
func receiveData(completion: @escaping (Data?, Bool, Error?) -> Void) {
|
||||
guard isConnected else {
|
||||
completion(nil, false, NSError(domain: "SoftEtherError", code: 5, userInfo: [NSLocalizedDescriptionKey: "Not connected to server"]))
|
||||
return
|
||||
}
|
||||
|
||||
secureConnection?.receive { data, error in
|
||||
if let error = error {
|
||||
completion(nil, false, error)
|
||||
return
|
||||
}
|
||||
|
||||
guard let data = data, data.count > 4 else {
|
||||
completion(nil, false, NSError(domain: "SoftEtherError", code: 2, userInfo: [NSLocalizedDescriptionKey: "Invalid server response"]))
|
||||
return
|
||||
}
|
||||
|
||||
// Parse the packet
|
||||
guard let packet = SoftEtherPacket(fromData: data) else {
|
||||
completion(nil, false, NSError(domain: "SoftEtherError", code: 3, userInfo: [NSLocalizedDescriptionKey: "Invalid packet format"]))
|
||||
return
|
||||
}
|
||||
|
||||
completion(packet.getData(), true, nil)
|
||||
}
|
||||
}
|
||||
}
|
149
SoftEtherVPN-iOS/SoftEtherVPN-iOS/SoftEtherVPNClient.swift
Normal file
149
SoftEtherVPN-iOS/SoftEtherVPN-iOS/SoftEtherVPNClient.swift
Normal file
@ -0,0 +1,149 @@
|
||||
import Foundation
|
||||
import UIKit
|
||||
|
||||
/// SoftEtherVPNClient provides a simple interface for connecting to SoftEther VPN servers
|
||||
public class SoftEtherVPNClient {
|
||||
|
||||
// MARK: - Properties
|
||||
|
||||
private let protocol: SoftEtherProtocol
|
||||
private var connectionState: ConnectionState = .disconnected
|
||||
|
||||
// MARK: - Public Types
|
||||
|
||||
/// Connection states for the VPN client
|
||||
public enum ConnectionState {
|
||||
case disconnected
|
||||
case connecting
|
||||
case connected
|
||||
case disconnecting
|
||||
case error(Error)
|
||||
}
|
||||
|
||||
/// Connection delegate to receive state updates
|
||||
public protocol ConnectionDelegate: AnyObject {
|
||||
func connectionStateDidChange(_ state: ConnectionState)
|
||||
}
|
||||
|
||||
/// Weak reference to the delegate
|
||||
public weak var delegate: ConnectionDelegate?
|
||||
|
||||
// MARK: - Initialization
|
||||
|
||||
public init() {
|
||||
self.protocol = SoftEtherProtocol()
|
||||
}
|
||||
|
||||
// MARK: - Public Methods
|
||||
|
||||
/// Connect to a SoftEther VPN server
|
||||
/// - Parameters:
|
||||
/// - host: Server hostname or IP address
|
||||
/// - port: Server port (default: 443)
|
||||
/// - completion: Optional completion handler
|
||||
public func connect(to host: String, port: UInt16 = 443, completion: ((Bool, Error?) -> Void)? = nil) {
|
||||
// Update state
|
||||
connectionState = .connecting
|
||||
delegate?.connectionStateDidChange(connectionState)
|
||||
|
||||
// Connect using the protocol implementation
|
||||
protocol.connect(to: host, port: port) { [weak self] success, error in
|
||||
guard let self = self else { return }
|
||||
|
||||
if success {
|
||||
self.connectionState = .connected
|
||||
} else if let error = error {
|
||||
self.connectionState = .error(error)
|
||||
} else {
|
||||
self.connectionState = .disconnected
|
||||
}
|
||||
|
||||
self.delegate?.connectionStateDidChange(self.connectionState)
|
||||
completion?(success, error)
|
||||
}
|
||||
}
|
||||
|
||||
/// Disconnect from the server
|
||||
/// - Parameter completion: Optional completion handler
|
||||
public func disconnect(completion: (() -> Void)? = nil) {
|
||||
// Update state
|
||||
connectionState = .disconnecting
|
||||
delegate?.connectionStateDidChange(connectionState)
|
||||
|
||||
// Disconnect
|
||||
protocol.disconnect()
|
||||
|
||||
// Update state again
|
||||
connectionState = .disconnected
|
||||
delegate?.connectionStateDidChange(connectionState)
|
||||
|
||||
completion?()
|
||||
}
|
||||
|
||||
/// Get the current connection state
|
||||
/// - Returns: Current ConnectionState
|
||||
public func getConnectionState() -> ConnectionState {
|
||||
return connectionState
|
||||
}
|
||||
|
||||
/// Check if currently connected
|
||||
/// - Returns: True if connected, false otherwise
|
||||
public func isConnected() -> Bool {
|
||||
if case .connected = connectionState {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// MARK: - Example Usage
|
||||
|
||||
/// Example showing how to use this class in a view controller
|
||||
public static func exampleUsage() -> String {
|
||||
return """
|
||||
// In your view controller:
|
||||
|
||||
private let vpnClient = SoftEtherVPNClient()
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
// Set delegate
|
||||
vpnClient.delegate = self
|
||||
}
|
||||
|
||||
@IBAction func connectButtonTapped(_ sender: UIButton) {
|
||||
if vpnClient.isConnected() {
|
||||
vpnClient.disconnect()
|
||||
} else {
|
||||
vpnClient.connect(to: "vpn.example.com") { success, error in
|
||||
if !success {
|
||||
print("Failed to connect: \\(error?.localizedDescription ?? "Unknown error")")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - ConnectionDelegate
|
||||
|
||||
extension YourViewController: SoftEtherVPNClient.ConnectionDelegate {
|
||||
func connectionStateDidChange(_ state: SoftEtherVPNClient.ConnectionState) {
|
||||
switch state {
|
||||
case .connected:
|
||||
connectButton.setTitle("Disconnect", for: .normal)
|
||||
statusLabel.text = "Connected"
|
||||
case .connecting:
|
||||
statusLabel.text = "Connecting..."
|
||||
case .disconnecting:
|
||||
statusLabel.text = "Disconnecting..."
|
||||
case .disconnected:
|
||||
connectButton.setTitle("Connect", for: .normal)
|
||||
statusLabel.text = "Disconnected"
|
||||
case .error(let error):
|
||||
statusLabel.text = "Error: \\(error.localizedDescription)"
|
||||
connectButton.setTitle("Connect", for: .normal)
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
}
|
||||
}
|
29
configure
vendored
29
configure
vendored
@ -5,26 +5,28 @@ set -e
|
||||
echo '---------------------------------------------------------------------'
|
||||
echo 'SoftEther VPN for Unix'
|
||||
echo
|
||||
echo 'Copyright (c) SoftEther VPN Project at University of Tsukuba, Japan.'
|
||||
echo 'Copyright (c) Daiyuu Nobori. All Rights Reserved.'
|
||||
echo 'Copyright (c) all contributors on SoftEther VPN project in GitHub.'
|
||||
echo 'Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.'
|
||||
echo
|
||||
echo 'This program is free software; you can redistribute it and/or'
|
||||
echo 'modify it under the terms of the GNU General Public License'
|
||||
echo 'version 2 as published by the Free Software Foundation.'
|
||||
echo 'Licensed under the Apache License, Version 2.0 (the License).'
|
||||
echo
|
||||
echo 'Read and understand README.TXT, LICENSE.TXT and WARNING.TXT before use.'
|
||||
echo 'Read and understand README, LICENSE and WARNING before use.'
|
||||
echo '---------------------------------------------------------------------'
|
||||
echo
|
||||
|
||||
echo 'Welcome to the corner-cutting configure script !'
|
||||
echo
|
||||
|
||||
if [ ! -d "tmp" ]; then
|
||||
mkdir tmp
|
||||
if [ ! -d "build" ]; then
|
||||
mkdir build
|
||||
fi
|
||||
|
||||
if [ ! -z ${CMAKE_FLAGS+x} ]; then
|
||||
CMAKE_FLAGS="${CMAKE_FLAGS}"
|
||||
fi
|
||||
|
||||
if [ ! -z ${CMAKE_INSTALL_PREFIX+x} ]; then
|
||||
CMAKE_FLAGS="-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
|
||||
CMAKE_FLAGS="-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} ${CMAKE_FLAGS}"
|
||||
fi
|
||||
|
||||
if [ -z ${OPENSSL_ROOT_DIR} ]; then
|
||||
@ -35,7 +37,10 @@ if [ -z ${OPENSSL_ROOT_DIR} ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -x "$(command -v rpm)" ]; then
|
||||
if [ ! -z ${CPACK_GENERATOR+x} ]; then
|
||||
echo "CPACK_GENERATOR is set, CPack will generate ${CPACK_GENERATOR} packages."
|
||||
CMAKE_FLAGS="-DCPACK_GENERATOR=${CPACK_GENERATOR} ${CMAKE_FLAGS}"
|
||||
elif [ -x "$(command -v rpm)" ]; then
|
||||
echo "'rpm' executable found, CPack will generate RPM packages."
|
||||
CMAKE_FLAGS="-DCPACK_GENERATOR='RPM' ${CMAKE_FLAGS}"
|
||||
else
|
||||
@ -45,9 +50,9 @@ fi
|
||||
|
||||
echo ""
|
||||
|
||||
(cd tmp && cmake ${CMAKE_FLAGS} .. || exit 1)
|
||||
(cd build && cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${CMAKE_FLAGS} .. || exit 1)
|
||||
|
||||
|
||||
echo ""
|
||||
|
||||
echo "The Makefile is generated. Run 'make -C tmp' to build SoftEther VPN."
|
||||
echo "The Makefile is generated. Run 'make -C build' to build SoftEther VPN."
|
||||
|
30
configure.cmd
Normal file
30
configure.cmd
Normal file
@ -0,0 +1,30 @@
|
||||
@echo off
|
||||
|
||||
echo ---------------------------------------------------------------------
|
||||
echo SoftEther VPN for Windows
|
||||
echo.
|
||||
echo Copyright (c) all contributors on SoftEther VPN project in GitHub.
|
||||
echo Copyright (c) Daiyuu Nobori, SoftEther Project at University of Tsukuba, and SoftEther Corporation.
|
||||
echo.
|
||||
echo Read and understand README, LICENSE and WARNING before use.
|
||||
echo ---------------------------------------------------------------------
|
||||
echo.
|
||||
|
||||
echo Welcome to the corner-cutting configure script !
|
||||
echo.
|
||||
|
||||
if not exist "build" (
|
||||
mkdir build
|
||||
)
|
||||
|
||||
cd build
|
||||
|
||||
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -G "NMake Makefiles" ..
|
||||
|
||||
if %errorlevel% == 0 (
|
||||
echo.
|
||||
echo The Makefile is generated. Run 'nmake' to build SoftEther VPN.
|
||||
) else (
|
||||
cd ..
|
||||
exit /b 1
|
||||
)
|
@ -2,4 +2,4 @@ SoftEther VPN ("SoftEther" means "Software Ethernet") is an open-source cross-pl
|
||||
Its protocol is very fast and it can be used in very restricted environments, as it's able to transfer packets over DNS and ICMP.
|
||||
The server includes a free Dynamic DNS service, which can be used to access the server even if the public IP address changes.
|
||||
A NAT-Traversal function is also available, very useful in case the required ports cannot be opened on the firewall.
|
||||
The supported third party protocols are OpenVPN, L2TP/IPSec and SSTP.
|
||||
The supported third party protocols are OpenVPN, L2TP/IPSec, SSTP and WireGuard.
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
350
developer_tools/vpnserver-jsonrpc-clients/.gitignore
vendored
Normal file
350
developer_tools/vpnserver-jsonrpc-clients/.gitignore
vendored
Normal file
@ -0,0 +1,350 @@
|
||||
# Created by https://www.gitignore.io/api/visualstudio
|
||||
# Edit at https://www.gitignore.io/?templates=visualstudio
|
||||
|
||||
### VisualStudio ###
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- Backup*.rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# End of https://www.gitignore.io/api/visualstudio
|
14648
developer_tools/vpnserver-jsonrpc-clients/README.html
Normal file
14648
developer_tools/vpnserver-jsonrpc-clients/README.html
Normal file
File diff suppressed because it is too large
Load Diff
8735
developer_tools/vpnserver-jsonrpc-clients/README.md
Normal file
8735
developer_tools/vpnserver-jsonrpc-clients/README.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,282 @@
|
||||
// SoftEther VPN Server JSON-RPC Stub code for C#
|
||||
//
|
||||
// JsonRpc.cs - JSON-RPC Client Utility Functions
|
||||
//
|
||||
// Automatically generated at 2023-05-10 14:43:37 by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-2023 SoftEther VPN Project
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Security;
|
||||
using System.Net.Http;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace SoftEther.JsonRpc
|
||||
{
|
||||
/// <summary>
|
||||
/// Internal utility class
|
||||
/// </summary>
|
||||
static class ClientUtil
|
||||
{
|
||||
public const int DefaultMaxDepth = 8;
|
||||
|
||||
public static string NonNull(this string s) { if (s == null) return ""; else return s; }
|
||||
public static bool IsEmpty(this string str)
|
||||
{
|
||||
if (str == null || str.Trim().Length == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
public static bool IsFilled(this string str) => !IsEmpty(str);
|
||||
|
||||
public static string ObjectToJson(this object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) => ClientUtil.Serialize(obj, include_null, escape_html, max_depth, compact, reference_handling);
|
||||
public static T JsonToObject<T>(this string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize<T>(str, include_null, max_depth);
|
||||
public static object JsonToObject(this string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, type, include_null, max_depth);
|
||||
|
||||
public static string Serialize(object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false)
|
||||
{
|
||||
JsonSerializerSettings setting = new JsonSerializerSettings()
|
||||
{
|
||||
MaxDepth = max_depth,
|
||||
NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore,
|
||||
ReferenceLoopHandling = ReferenceLoopHandling.Error,
|
||||
PreserveReferencesHandling = reference_handling ? PreserveReferencesHandling.All : PreserveReferencesHandling.None,
|
||||
StringEscapeHandling = escape_html ? StringEscapeHandling.EscapeHtml : StringEscapeHandling.Default,
|
||||
};
|
||||
return JsonConvert.SerializeObject(obj, compact ? Formatting.None : Formatting.Indented, setting);
|
||||
}
|
||||
|
||||
public static T Deserialize<T>(string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth)
|
||||
=> (T)Deserialize(str, typeof(T), include_null, max_depth);
|
||||
|
||||
public static object Deserialize(string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth)
|
||||
{
|
||||
JsonSerializerSettings setting = new JsonSerializerSettings()
|
||||
{
|
||||
MaxDepth = max_depth,
|
||||
NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore,
|
||||
ObjectCreationHandling = ObjectCreationHandling.Replace,
|
||||
ReferenceLoopHandling = ReferenceLoopHandling.Error,
|
||||
};
|
||||
return JsonConvert.DeserializeObject(str, type, setting);
|
||||
}
|
||||
|
||||
public static void Print(this object o)
|
||||
{
|
||||
string str = o.ObjectToJson();
|
||||
|
||||
if (o is string) str = (string)o;
|
||||
|
||||
Console.WriteLine(str);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC exception class
|
||||
/// </summary>
|
||||
class JsonRpcException : Exception
|
||||
{
|
||||
public JsonRpcError RpcError { get; }
|
||||
public JsonRpcException(JsonRpcError err)
|
||||
: base($"Code={err.Code}, Message={err.Message.NonNull()}" +
|
||||
(err == null || err.Data == null ? "" : $", Data={err.Data.ObjectToJson(compact: true)}"))
|
||||
{
|
||||
this.RpcError = err;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC request class. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcRequest
|
||||
{
|
||||
[JsonProperty("jsonrpc", Order = 1)]
|
||||
public string Version { get; set; } = "2.0";
|
||||
|
||||
[JsonProperty("id", Order = 2)]
|
||||
public string Id { get; set; } = null;
|
||||
|
||||
[JsonProperty("method", Order = 3)]
|
||||
public string Method { get; set; } = "";
|
||||
|
||||
[JsonProperty("params", Order = 4)]
|
||||
public object Params { get; set; } = null;
|
||||
|
||||
public JsonRpcRequest() { }
|
||||
|
||||
public JsonRpcRequest(string method, object param, string id)
|
||||
{
|
||||
this.Method = method;
|
||||
this.Params = param;
|
||||
this.Id = id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC response class with generics
|
||||
/// </summary>
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
class JsonRpcResponse<TResult>
|
||||
{
|
||||
[JsonProperty("jsonrpc", Order = 1)]
|
||||
public virtual string Version { get; set; } = "2.0";
|
||||
|
||||
[JsonProperty("id", NullValueHandling = NullValueHandling.Include, Order = 2)]
|
||||
public virtual string Id { get; set; } = null;
|
||||
|
||||
[JsonProperty("result", Order = 3)]
|
||||
public virtual TResult Result { get; set; } = default(TResult);
|
||||
|
||||
[JsonProperty("error", Order = 4)]
|
||||
public virtual JsonRpcError Error { get; set; } = null;
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual bool IsError => this.Error != null;
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual bool IsOk => !IsError;
|
||||
|
||||
public virtual void ThrowIfError()
|
||||
{
|
||||
if (this.IsError) throw new JsonRpcException(this.Error);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.ObjectToJson(compact: true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC error class. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcError
|
||||
{
|
||||
public JsonRpcError() { }
|
||||
public JsonRpcError(int code, string message, object data = null)
|
||||
{
|
||||
this.Code = code;
|
||||
this.Message = message.NonNull();
|
||||
if (this.Message.IsEmpty()) this.Message = $"JSON-RPC Error {code}";
|
||||
this.Data = data;
|
||||
}
|
||||
|
||||
[JsonProperty("code")]
|
||||
public int Code { get; set; } = 0;
|
||||
|
||||
[JsonProperty("message")]
|
||||
public string Message { get; set; } = null;
|
||||
|
||||
[JsonProperty("data")]
|
||||
public object Data { get; set; } = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC client. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcClient
|
||||
{
|
||||
HttpClientHandler client_handler;
|
||||
HttpClient client;
|
||||
public const int DefaultTimeoutMsecs = 60 * 1000;
|
||||
public int TimeoutMsecs { get => (int)client.Timeout.TotalMilliseconds; set => client.Timeout = new TimeSpan(0, 0, 0, 0, value); }
|
||||
public Dictionary<string, string> HttpHeaders { get; } = new Dictionary<string, string>();
|
||||
|
||||
string base_url;
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC client class constructor
|
||||
/// </summary>
|
||||
/// <param name="url">The URL</param>
|
||||
/// <param name="cert_check_proc">The SSL certificate validation callback</param>
|
||||
public JsonRpcClient(string url, Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> cert_check_proc = null)
|
||||
{
|
||||
if (cert_check_proc == null) cert_check_proc = (message, cert, chain, errors) => true;
|
||||
client_handler = new HttpClientHandler();
|
||||
|
||||
this.client_handler.AllowAutoRedirect = true;
|
||||
this.client_handler.MaxAutomaticRedirections = 10;
|
||||
|
||||
client_handler.ServerCertificateCustomValidationCallback = cert_check_proc;
|
||||
|
||||
client = new HttpClient(client_handler, true);
|
||||
//Console.WriteLine("new HttpClient(client_handler, true);");
|
||||
|
||||
this.base_url = url;
|
||||
|
||||
this.TimeoutMsecs = DefaultTimeoutMsecs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call a single RPC call (without error check). You can wait for the response with Task<string> or await statement.
|
||||
/// </summary>
|
||||
/// <param name="method_name">The name of RPC method</param>
|
||||
/// <param name="param">The parameters</param>
|
||||
public async Task<string> CallInternalAsync(string method_name, object param)
|
||||
{
|
||||
string id = DateTime.Now.Ticks.ToString();
|
||||
|
||||
JsonRpcRequest req = new JsonRpcRequest(method_name, param, id);
|
||||
|
||||
string req_string = req.ObjectToJson();
|
||||
|
||||
//Console.WriteLine($"req: {req_string}");
|
||||
|
||||
HttpContent content = new StringContent(req_string, Encoding.UTF8, "application/json");
|
||||
|
||||
foreach (string key in this.HttpHeaders.Keys)
|
||||
{
|
||||
string value = this.HttpHeaders[key];
|
||||
|
||||
content.Headers.Add(key, value);
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await this.client.PostAsync(base_url, content);
|
||||
|
||||
Stream responseStream = await response.Content.ReadAsStreamAsync();
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
using (StreamReader streamReader = new StreamReader(responseStream))
|
||||
{
|
||||
throw new Exception($"Error: {response.StatusCode}: {await streamReader.ReadToEndAsync()}");
|
||||
}
|
||||
}
|
||||
|
||||
string ret_string;
|
||||
|
||||
using (StreamReader streamReader = new StreamReader(responseStream))
|
||||
{
|
||||
ret_string = await streamReader.ReadToEndAsync();
|
||||
}
|
||||
|
||||
//Console.WriteLine($"ret: {ret_string}");
|
||||
|
||||
return ret_string;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call a single RPC call (with error check). You can wait for the response with Promise<TResult> or await statement. In the case of error, it will be thrown.
|
||||
/// </summary>
|
||||
/// <param name="method_name">The name of RPC method</param>
|
||||
/// <param name="param">The parameters</param>
|
||||
public async Task<TResult> CallAsync<TResult>(string method_name, object param)
|
||||
{
|
||||
string ret_string = await CallInternalAsync(method_name, param);
|
||||
|
||||
JsonRpcResponse <TResult> ret = ret_string.JsonToObject<JsonRpcResponse<TResult>>();
|
||||
|
||||
ret.ThrowIfError();
|
||||
|
||||
return ret.Result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@
|
||||
// SoftEther VPN Server JSON-RPC Stub code for C#
|
||||
//
|
||||
// Program.cs - The Main() entry point
|
||||
//
|
||||
// Automatically generated at 2023-05-10 14:43:37 by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-2023 SoftEther VPN Project
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
VPNRPCTest test = new VPNRPCTest();
|
||||
test.Test_All();
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<RootNamespace>SoftEther.VPNServerRpc</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28010.2041
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-client-csharp", "vpnserver-jsonrpc-client-csharp.csproj", "{81CA3EC4-026E-4D37-9889-828186BBB8C0}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {D87E5CF1-9A10-431C-AC42-F1041470AEE8}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
88
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/.gitignore
vendored
Normal file
88
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/.gitignore
vendored
Normal file
@ -0,0 +1,88 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
|
||||
# next.js build output
|
||||
.next
|
||||
|
||||
# nuxt.js build output
|
||||
.nuxt
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
@ -0,0 +1,5 @@
|
||||
npm install
|
||||
|
||||
npm run build
|
||||
|
||||
npm publish
|
@ -0,0 +1,2 @@
|
||||
export {};
|
||||
//# sourceMappingURL=sample.d.ts.map
|
@ -0,0 +1 @@
|
||||
{"version":3,"file":"sample.d.ts","sourceRoot":"","sources":["../src/sample.ts"],"names":[],"mappings":""}
|
4146
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js
vendored
Normal file
4146
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/sample.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2721
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts
vendored
Normal file
2721
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
3825
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js
vendored
Normal file
3825
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/dist/vpnrpc.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
479
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json
generated
Normal file
479
developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-nodejs-package/package-lock.json
generated
Normal file
@ -0,0 +1,479 @@
|
||||
{
|
||||
"name": "vpnrpc",
|
||||
"version": "1.0.1",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
|
||||
"integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/highlight": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
|
||||
"integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "^2.0.0",
|
||||
"esutils": "^2.0.2",
|
||||
"js-tokens": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "12.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz",
|
||||
"integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
||||
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-convert": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"argparse": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"fill-range": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"builtin-modules": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
|
||||
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
|
||||
"dev": true
|
||||
},
|
||||
"chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^3.2.1",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"supports-color": "^5.3.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
||||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-name": "1.1.3"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||
"dev": true
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
|
||||
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
|
||||
"dev": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"dev": true
|
||||
},
|
||||
"enhanced-resolve": {
|
||||
"version": "5.12.0",
|
||||
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz",
|
||||
"integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.2.4",
|
||||
"tapable": "^2.2.0"
|
||||
}
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"dev": true
|
||||
},
|
||||
"esprima": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
|
||||
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
|
||||
"dev": true
|
||||
},
|
||||
"esutils": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
|
||||
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
|
||||
"dev": true
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||
"dev": true
|
||||
},
|
||||
"glob": {
|
||||
"version": "7.1.4",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
|
||||
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.0.4",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"graceful-fs": {
|
||||
"version": "4.2.10",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
|
||||
"integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
|
||||
"dev": true
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
||||
"dev": true
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
},
|
||||
"is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
|
||||
"dev": true
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "3.13.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
|
||||
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
"esprima": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"yallist": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
||||
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"braces": "^3.0.2",
|
||||
"picomatch": "^2.3.1"
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.7",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
|
||||
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
|
||||
"dev": true
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.6",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
|
||||
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.6"
|
||||
}
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true
|
||||
},
|
||||
"path-parse": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||
"dev": true
|
||||
},
|
||||
"picomatch": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
|
||||
"integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.3.8",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
|
||||
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
||||
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"tapable": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||
"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"to-regex-range": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"ts-loader": {
|
||||
"version": "9.4.2",
|
||||
"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz",
|
||||
"integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "^4.1.0",
|
||||
"enhanced-resolve": "^5.0.0",
|
||||
"micromatch": "^4.0.0",
|
||||
"semver": "^7.3.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-styles": {
|
||||
"version": "4.3.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-convert": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"chalk": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^4.1.0",
|
||||
"supports-color": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-name": "~1.1.4"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^4.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
|
||||
"dev": true
|
||||
},
|
||||
"tslint": {
|
||||
"version": "5.16.0",
|
||||
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz",
|
||||
"integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.0.0",
|
||||
"builtin-modules": "^1.1.1",
|
||||
"chalk": "^2.3.0",
|
||||
"commander": "^2.12.1",
|
||||
"diff": "^3.2.0",
|
||||
"glob": "^7.1.1",
|
||||
"js-yaml": "^3.13.0",
|
||||
"minimatch": "^3.0.4",
|
||||
"mkdirp": "^0.5.1",
|
||||
"resolve": "^1.3.2",
|
||||
"semver": "^5.3.0",
|
||||
"tslib": "^1.8.0",
|
||||
"tsutils": "^2.29.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"semver": {
|
||||
"version": "5.7.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
|
||||
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"tsutils": {
|
||||
"version": "2.29.0",
|
||||
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
|
||||
"integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"tslib": "^1.8.1"
|
||||
}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
|
||||
"integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
|
||||
"dev": true
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
{
|
||||
"name": "vpnrpc",
|
||||
"version": "1.0.1",
|
||||
"description": "",
|
||||
"main": "dist/vpnrpc.js",
|
||||
"scripts": {
|
||||
"prepare": "tsc",
|
||||
"build": "tsc"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/SoftEtherVPN/SoftEtherVPN.git"
|
||||
},
|
||||
"keywords": [
|
||||
"vpn",
|
||||
"softether"
|
||||
],
|
||||
"author": "",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/SoftEtherVPN/SoftEtherVPN/issues"
|
||||
},
|
||||
"homepage": "https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/#readme",
|
||||
"devDependencies": {
|
||||
"@types/node": "^12.0.2",
|
||||
"ts-loader": "^9.4.2",
|
||||
"tslint": "^5.16.0",
|
||||
"typescript": "^3.4.5"
|
||||
}
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,72 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
/* Basic Options */
|
||||
"target": "ES3", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015.promise",
|
||||
"es5"
|
||||
], // "lib": [], /* Specify library files to be included in the compilation. */
|
||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||
// "checkJs": true, /* Report errors in .js files. */
|
||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
||||
"declaration": true, /* Generates corresponding '.d.ts' file. */
|
||||
"declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||||
"sourceMap": true, /* Generates corresponding '.map' file. */
|
||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
||||
"outDir": "./dist/", /* Redirect output structure to the directory. */
|
||||
"rootDir": "./src/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||||
// "composite": true, /* Enable project compilation */
|
||||
// "incremental": true, /* Enable incremental compilation */
|
||||
// "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||||
// "removeComments": true, /* Do not emit comments to output. */
|
||||
// "noEmit": true, /* Do not emit outputs. */
|
||||
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||||
|
||||
/* Strict Type-Checking Options */
|
||||
"strict": true, /* Enable all strict type-checking options. */
|
||||
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||||
// "strictNullChecks": true, /* Enable strict null checks. */
|
||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||||
|
||||
/* Additional Checks */
|
||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
||||
|
||||
/* Module Resolution Options */
|
||||
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
||||
// "types": [], /* Type declaration files to be included in compilation. */
|
||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||||
|
||||
/* Source Map Options */
|
||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||||
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||||
|
||||
/* Experimental Options */
|
||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||||
},
|
||||
"include": [
|
||||
"src/**/*"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
{
|
||||
"defaultSeverity": "warn",
|
||||
"extends": [
|
||||
"tslint:recommended"
|
||||
],
|
||||
"jsRules": {},
|
||||
"rules": {
|
||||
"comment-format": false,
|
||||
"no-consecutive-blank-lines": false,
|
||||
"no-trailing-whitespace": false,
|
||||
"no-console": false,
|
||||
"prefer-const": false,
|
||||
"one-line": false,
|
||||
"only-arrow-functions": false,
|
||||
"space-before-function-paren": false,
|
||||
"trailing-comma": false,
|
||||
"no-empty": false,
|
||||
},
|
||||
"rulesDirectory": []
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
350
developer_tools/vpnserver-jsonrpc-codegen/.gitignore
vendored
Normal file
350
developer_tools/vpnserver-jsonrpc-codegen/.gitignore
vendored
Normal file
@ -0,0 +1,350 @@
|
||||
# Created by https://www.gitignore.io/api/visualstudio
|
||||
# Edit at https://www.gitignore.io/?templates=visualstudio
|
||||
|
||||
### VisualStudio ###
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding add-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- Backup*.rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# End of https://www.gitignore.io/api/visualstudio
|
2067
developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs
Normal file
2067
developer_tools/vpnserver-jsonrpc-codegen/CodeGen/CodeGen.cs
Normal file
File diff suppressed because it is too large
Load Diff
37
developer_tools/vpnserver-jsonrpc-codegen/Program.cs
Normal file
37
developer_tools/vpnserver-jsonrpc-codegen/Program.cs
Normal file
@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Diagnostics;
|
||||
using Newtonsoft.Json;
|
||||
using SoftEther.VPNServerRpc;
|
||||
using System.Text;
|
||||
using SoftEther.JsonRpc;
|
||||
|
||||
|
||||
namespace VPNServer_JSONRPC_CodeGen
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
string output_dir = CodeGenUtil.OutputDir_Clients;
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(output_dir);
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
|
||||
CodeGen g = new CodeGen();
|
||||
|
||||
g.GenerateAndSaveCodes(output_dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,17 @@
|
||||
// SoftEther VPN Server JSON-RPC Stub code for C#
|
||||
//
|
||||
// Program.cs - The Main() entry point
|
||||
//
|
||||
// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-__YEAR__ SoftEther VPN Project
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
VPNRPCTest test = new VPNRPCTest();
|
||||
test.Test_All();
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<RootNamespace>SoftEther.VPNServerRpc</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28010.2041
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-client-csharp", "vpnserver-jsonrpc-client-csharp.csproj", "{81CA3EC4-026E-4D37-9889-828186BBB8C0}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{81CA3EC4-026E-4D37-9889-828186BBB8C0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {D87E5CF1-9A10-431C-AC42-F1041470AEE8}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
77
developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt
Normal file
77
developer_tools/vpnserver-jsonrpc-codegen/Templates/doc.txt
Normal file
@ -0,0 +1,77 @@
|
||||
# SoftEther VPN Server JSON-RPC API Suite Document
|
||||
This reference describes all JSON-RPC functions available on SoftEther VPN Server.
|
||||
|
||||
|
||||
You can access to the latest [SoftEther VPN Server JSON-RPC Document on GitHub](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/).
|
||||
|
||||
|
||||
## What is SoftEther VPN Server JSON-RPC API Suite?
|
||||
The API Suite allows you to easily develop your original SoftEther VPN Server management application to control the VPN Server (e.g. creating users, adding Virtual Hubs, disconnecting a specified VPN sessions).
|
||||
|
||||
- Almost all control APIs, which the VPN Server provides, are available as JSON-RPC API.
|
||||
- You can write your own VPN Server management application in your favorite languages (JavaScript, TypeScript, Java, Python, Ruby, C#, ... etc.)
|
||||
- If you are planning to develop your own VPN cloud service, the JSON-RPC API is the best choice to realize the automated operations for the VPN Server.
|
||||
- No need to use any specific API client library since all APIs are provided on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification). You can use your favorite JSON and HTTPS client library to call any of all APIs in your pure runtime environment.
|
||||
- Also, the SoftEther VPN Project provides high-quality JSON-RPC client stub libraries which define all of the API client stub codes. These libraries are written in C#, JavaScript and TypeScript. [The Node.js Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc) package is also available.
|
||||
|
||||
|
||||
## Principle
|
||||
|
||||
### Entry point
|
||||
The entry point URL of JSON-RPC is:
|
||||
```
|
||||
https://<vpn_server_hostname>:<port>/api/
|
||||
```
|
||||
|
||||
- Older versions of SoftEther VPN before June 2019 don't support JSON-RPC APIs.
|
||||
- If you want to completely disable the JSON-RPC on your VPN Server, set the `DisableJsonRpcWebApi` variable to `true` on the `vpn_server.config`.
|
||||
|
||||
|
||||
### JSON-RPC specification
|
||||
You must use HTTPS 1.1 `POST` method to call each of JSON-RPC APIs.
|
||||
All APIs are based on the [JSON-RPC 2.0 Specification](https://www.jsonrpc.org/specification).
|
||||
- JSON-RPC Notification is not supported.
|
||||
- JSON-RPC Batch is not supported.
|
||||
|
||||
|
||||
### "vpnrpc": Node.js Client Library package for VPN Server JSON-RPC
|
||||
If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [JavaScript Client Library for VPN Server RPC (vpnrpc)](https://www.npmjs.com/package/vpnrpc).
|
||||
|
||||
- You can use the `vpnrpc` library in JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
|
||||
- As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls all of available JSON-RPC APIs against the specified SoftEther VPN Server. (Note: This sample code is written in TypeScript.)
|
||||
|
||||
You can use the following command to download the `vpnrpc` library package with Node.js.
|
||||
```
|
||||
$ npm install --save-dev vpnrpc
|
||||
```
|
||||
|
||||
|
||||
|
||||
### "vpnrpc.ts": TypeScript Client Library for VPN Server JSON-RPC
|
||||
If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [TypeScript Client Library for VPN Server RPC (vpnrpc.ts)](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/).
|
||||
|
||||
- You can use the [vpnrpc.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/vpnrpc.ts) library in TypeScript / JavaScript for both web browsers (e.g. Chrome, FireFox or Edge) and Node.js.
|
||||
- As a sample code there is the [sample.ts](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-typescript/sample.ts) program in TypeScript. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
|
||||
|
||||
|
||||
### "vpnserver-jsonrpc-client-csharp": C# Client Library for VPN Server JSON-RPC
|
||||
If you are willing to develop your original JSON-RPC client for SoftEther VPN, you can use the [vpnserver-jsonrpc-client-csharp C# library](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/).
|
||||
|
||||
- The [client library codes for C#](https://github.com/SoftEtherVPN/SoftEtherVPN/tree/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/rpc-stubs/) is written in pure C# 7.3. It works on .NET Core 2.1 or later on Windows, Linux and macOS. Very comfort with Visual Studio for both Windows or macOS.
|
||||
- As a sample code there is the [VpnServerRpcTest.cs](https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/developer_tools/vpnserver-jsonrpc-clients/vpnserver-jsonrpc-client-csharp/sample/VpnServerRpcTest.cs) program in C#. This sample calls one by one all of available JSON-RPC APIs against the specified SoftEther VPN Server.
|
||||
|
||||
|
||||
|
||||
### HTTPS Authentication
|
||||
You must specify the following HTTPS custom headers for authentication on each of requests.
|
||||
|
||||
|
||||
Value | Description
|
||||
--- | ---
|
||||
`X-VPNADMIN-HUBNAME` | The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify empty string if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.
|
||||
`X-VPNADMIN-PASSWORD` | Specify the administration password.
|
||||
|
||||
|
||||
- You can omit the above HTTPS custom authentication headers if you are calling JSON-RPC APIs from the web browser which is already logged in to the VPN Server with HTTPS Basic Authentication. In such usage the credential of HTTPS Basic Authtication will be used.
|
||||
|
||||
***
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<title>SoftEther VPN Server JSON-RPC Suite Document</title>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/2.10.0/github-markdown.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/themes/prism.css">
|
||||
</head>
|
||||
<body>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/prism.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.15.0/components/prism-json.js"></script>
|
||||
<article class="markdown-body">
|
||||
__BODY__
|
||||
</article>
|
||||
</body>
|
||||
</html>
|
576
developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt
Normal file
576
developer_tools/vpnserver-jsonrpc-codegen/Templates/ts_rpc.txt
Normal file
@ -0,0 +1,576 @@
|
||||
// SoftEther VPN Server JSON-RPC Stub code for TypeScript
|
||||
//
|
||||
// vpnrpc.ts
|
||||
// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-__YEAR__ SoftEther VPN Project
|
||||
|
||||
|
||||
// Trivial utility codes
|
||||
let is_node_js = (typeof navigator === "undefined") || navigator.userAgent.indexOf("Node.js") !== -1 || navigator.userAgent.indexOf("jsdom") !== -1;
|
||||
function is_null(obj: any)
|
||||
{
|
||||
return (typeof obj === "undefined") || (obj === null);
|
||||
}
|
||||
let debug_mode: boolean = false;
|
||||
|
||||
/** VPN Server RPC Stubs */
|
||||
export class VpnServerRpc
|
||||
{
|
||||
/** Determine if this JavaScript environment is on the Node.js or not. */
|
||||
public static IsNodeJS(): boolean
|
||||
{
|
||||
return is_node_js;
|
||||
}
|
||||
|
||||
/** Set the debug mode flag */
|
||||
public static SetDebugMode(flag: boolean): void
|
||||
{
|
||||
debug_mode = flag;
|
||||
}
|
||||
|
||||
private rpc_url: string;
|
||||
private rpc_client: JsonRpcClient;
|
||||
|
||||
/**
|
||||
* Constructor of the VpnServerRpc class
|
||||
* @param vpnserver_hostname The hostname or IP address of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself.
|
||||
* @param vpnserver_port The port number of the destination VPN Server. In the web browser you can specify null if you want to connect to the server itself.
|
||||
* @param hubname The name of the Virtual Hub if you want to connect to the VPN Server as a Virtual Hub Admin Mode. Specify null if you want to connect to the VPN Server as the Entire VPN Server Admin Mode.
|
||||
* @param password Specify the administration password. This value is valid only if vpnserver_hostname is sepcified.
|
||||
* @param nodejs_https_client_reject_untrusted_server_cert In Node.js set this true to check the SSL server certificate on the destination VPN Server. Set this false to ignore the SSL server certification.
|
||||
*/
|
||||
constructor(vpnserver_hostname?: string, vpnserver_port?: number, hubname?: string, password?: string, nodejs_https_client_reject_untrusted_server_cert?: boolean)
|
||||
{
|
||||
let headers: { [name: string]: string } = {};
|
||||
let send_credentials: boolean = false;
|
||||
|
||||
nodejs_https_client_reject_untrusted_server_cert = is_null(nodejs_https_client_reject_untrusted_server_cert) ? false : nodejs_https_client_reject_untrusted_server_cert!;
|
||||
|
||||
if (is_null(vpnserver_hostname))
|
||||
{
|
||||
this.rpc_url = "/api/";
|
||||
send_credentials = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (is_null(vpnserver_port)) vpnserver_port = 443;
|
||||
this.rpc_url = `https://${vpnserver_hostname}:${vpnserver_port}/api/`;
|
||||
|
||||
|
||||
headers["X-VPNADMIN-HUBNAME"] = is_null(hubname) ? "" : hubname!;
|
||||
headers["X-VPNADMIN-PASSWORD"] = is_null(password) ? "" : password!;
|
||||
}
|
||||
|
||||
if (is_null(nodejs_https_client_reject_untrusted_server_cert)) nodejs_https_client_reject_untrusted_server_cert = false;
|
||||
|
||||
this.rpc_client = new JsonRpcClient(this.rpc_url, headers, send_credentials, nodejs_https_client_reject_untrusted_server_cert);
|
||||
}
|
||||
|
||||
// --- Stubs ---
|
||||
__STUBS__
|
||||
|
||||
// -- Utility functions --
|
||||
/** Call a RPC procedure */
|
||||
public async CallAsync<T>(method_name: string, request: T): Promise<T>
|
||||
{
|
||||
let response: T = await this.rpc_client.CallAsync<T>(method_name, request);
|
||||
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// --- Types ---
|
||||
__TYPES__
|
||||
|
||||
|
||||
|
||||
// --- Utility codes ---
|
||||
|
||||
/** JSON-RPC request class. See https://www.jsonrpc.org/specification */
|
||||
export class JsonRpcRequest
|
||||
{
|
||||
public jsonrpc: string = "2.0";
|
||||
public method: string;
|
||||
public params: any;
|
||||
public id: string;
|
||||
|
||||
constructor(method: string = "", param: any = null, id: string = "")
|
||||
{
|
||||
this.method = method;
|
||||
this.params = param;
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
/** JSON-RPC error class. See https://www.jsonrpc.org/specification */
|
||||
export class JsonRpcError
|
||||
{
|
||||
public code: number;
|
||||
public message: string;
|
||||
public data: any;
|
||||
|
||||
constructor(code: number = 0, message: string = "", data: any = null)
|
||||
{
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
this.data = data;
|
||||
}
|
||||
}
|
||||
|
||||
/** JSON-RPC response class with generics */
|
||||
export class JsonRpcResponse<TResult>
|
||||
{
|
||||
public jsonrpc: string = "2.0";
|
||||
public result: TResult = null!;
|
||||
public error: JsonRpcError = null!;
|
||||
public id: string = "";
|
||||
}
|
||||
|
||||
/** JSON-RPC client class. See https://www.jsonrpc.org/specification */
|
||||
export class JsonRpcClient
|
||||
{
|
||||
/** A utility function to convert any object to JSON string */
|
||||
public static ObjectToJson(obj: any): string
|
||||
{
|
||||
return JSON.stringify(obj,
|
||||
(key, value) =>
|
||||
{
|
||||
if (key.endsWith("_bin"))
|
||||
{
|
||||
return Util_Base64_Encode(value);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
, 4);
|
||||
}
|
||||
|
||||
/** A utility function to convert JSON string to object */
|
||||
public static JsonToObject(str: string): any
|
||||
{
|
||||
return JSON.parse(str,
|
||||
(key, value) =>
|
||||
{
|
||||
if (key.endsWith("_bin"))
|
||||
{
|
||||
return Util_Base64_Decode(value);
|
||||
}
|
||||
else if (key.endsWith("_dt"))
|
||||
{
|
||||
return new Date(value);
|
||||
}
|
||||
return value;
|
||||
});
|
||||
}
|
||||
|
||||
/** Base URL */
|
||||
public BaseUrl: string;
|
||||
|
||||
/** The instance of HTTP client */
|
||||
private client: HttpClient;
|
||||
|
||||
/** Additional HTTP headers */
|
||||
private headers: { [name: string]: string };
|
||||
|
||||
/**
|
||||
* JSON-RPC client class constructor
|
||||
* @param url The URL
|
||||
* @param headers Additional HTTP headers
|
||||
* @param send_credential Set true to use the same credential with the browsing web site. Valid only if the code is running on the web browser.
|
||||
*/
|
||||
constructor(url: string, headers: { [name: string]: string }, send_credential: boolean, nodejs_https_client_reject_untrusted_server_cert: boolean)
|
||||
{
|
||||
this.BaseUrl = url;
|
||||
this.headers = headers;
|
||||
|
||||
this.client = new HttpClient();
|
||||
this.client.SendCredential = send_credential;
|
||||
this.client.NodeJS_HTTPS_Client_Reject_Unauthorized = nodejs_https_client_reject_untrusted_server_cert;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a single RPC call (without error check). You can wait for the response with Promise<string> or await statement.
|
||||
* @param method_name The name of RPC method
|
||||
* @param param The parameters
|
||||
*/
|
||||
public async CallInternalAsync(method_name: string, param: any): Promise<string>
|
||||
{
|
||||
let id = "1";
|
||||
|
||||
let req = new JsonRpcRequest(method_name, param, id);
|
||||
|
||||
let req_string = JsonRpcClient.ObjectToJson(req);
|
||||
|
||||
if (debug_mode)
|
||||
{
|
||||
console.log("--- RPC Request Body ---");
|
||||
console.log(req_string);
|
||||
console.log("------------------------");
|
||||
}
|
||||
|
||||
let http_response = await this.client.PostAsync(this.BaseUrl, this.headers,
|
||||
req_string, "application/json");
|
||||
|
||||
let ret_string = http_response.Body;
|
||||
|
||||
if (debug_mode)
|
||||
{
|
||||
console.log("--- RPC Response Body ---");
|
||||
console.log(ret_string);
|
||||
console.log("-------------------------");
|
||||
}
|
||||
|
||||
return ret_string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a single RPC call (with error check). You can wait for the response with Promise<TResult> or await statement. In the case of error, it will be thrown.
|
||||
* @param method_name The name of RPC method
|
||||
* @param param The parameters
|
||||
*/
|
||||
public async CallAsync<TResult>(method_name: string, param: any): Promise<TResult>
|
||||
{
|
||||
let ret_string = await this.CallInternalAsync(method_name, param);
|
||||
|
||||
let ret: JsonRpcResponse<TResult> = JSON.parse(ret_string);
|
||||
|
||||
if (is_null(ret.error) === false)
|
||||
{
|
||||
throw new JsonRpcException(ret.error);
|
||||
}
|
||||
|
||||
return ret.result;
|
||||
}
|
||||
}
|
||||
|
||||
/** JSON-RPC exception class */
|
||||
export class JsonRpcException extends Error
|
||||
{
|
||||
public Error: JsonRpcError;
|
||||
|
||||
constructor(error: JsonRpcError)
|
||||
{
|
||||
super(`Code=${error.code}, Message=${error.message}`);
|
||||
this.Error = error;
|
||||
}
|
||||
}
|
||||
|
||||
/** HTTP client exception class */
|
||||
export class HttpClientException extends Error
|
||||
{
|
||||
constructor(message: string)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
||||
/** HTTP client response class */
|
||||
export class HttpClientResponse
|
||||
{
|
||||
public Body: string = "";
|
||||
}
|
||||
|
||||
/** An HTTP client which can be used in both web browsers and Node.js */
|
||||
export class HttpClient
|
||||
{
|
||||
public TimeoutMsecs: number = 60 * 5 * 1000;
|
||||
public SendCredential: boolean = true;
|
||||
public NodeJS_HTTPS_Client_Reject_Unauthorized: boolean = false;
|
||||
|
||||
/** Post method. In web browsers this function will process the request by itself. In Node.js this function will call PostAsync_NodeJS() instead. */
|
||||
public async PostAsync(url: string, headers: { [name: string]: string },
|
||||
req_body: string, req_media_type: string): Promise<HttpClientResponse>
|
||||
{
|
||||
if (is_node_js)
|
||||
{
|
||||
return this.PostAsync_NodeJS(url, headers, req_body, req_media_type);
|
||||
}
|
||||
|
||||
let fetch_header_list = new Headers();
|
||||
|
||||
for (let name of Object.keys(headers))
|
||||
{
|
||||
fetch_header_list.append(name, headers[name]);
|
||||
}
|
||||
|
||||
let fetch_init: RequestInit =
|
||||
{
|
||||
mode: "cors",
|
||||
headers: fetch_header_list,
|
||||
credentials: (this.SendCredential ? "include" : "omit"),
|
||||
method: "POST",
|
||||
cache: "no-cache",
|
||||
keepalive: true,
|
||||
redirect: "follow",
|
||||
body: req_body,
|
||||
};
|
||||
|
||||
let fetch_response = await fetch(url, fetch_init);
|
||||
|
||||
if (fetch_response.ok === false)
|
||||
{
|
||||
throw new HttpClientException("HTTP Error: " + fetch_response.status + " " + fetch_response.statusText);
|
||||
}
|
||||
|
||||
let ret = new HttpClientResponse();
|
||||
|
||||
ret.Body = await fetch_response.text();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** Post method for Node.js. */
|
||||
public PostAsync_NodeJS(url: string, headers: { [name: string]: string },
|
||||
req_body: string, req_media_type: string): Promise<HttpClientResponse>
|
||||
{
|
||||
const https = require("https");
|
||||
const keepAliveAgent = new https.Agent({ keepAlive: true });
|
||||
const urlparse = require("url");
|
||||
|
||||
const urlobj = urlparse.parse(url);
|
||||
|
||||
if (is_null(urlobj.host)) throw new Error("URL is invalid.");
|
||||
|
||||
let options =
|
||||
{
|
||||
host: urlobj.hostname,
|
||||
port: urlobj.port,
|
||||
path: urlobj.path,
|
||||
rejectUnauthorized: this.NodeJS_HTTPS_Client_Reject_Unauthorized,
|
||||
method: "POST",
|
||||
timeout: this.TimeoutMsecs,
|
||||
agent: keepAliveAgent,
|
||||
};
|
||||
|
||||
return new Promise(function (resolve, reject)
|
||||
{
|
||||
let req = https.request(options, (res: any) =>
|
||||
{
|
||||
if (res.statusCode !== 200)
|
||||
{
|
||||
reject(new HttpClientException("HTTP Error: " + res.statusCode + " " + res.statusMessage));
|
||||
}
|
||||
|
||||
let recv_str: string = "";
|
||||
|
||||
res.on("data", (body: any) =>
|
||||
{
|
||||
recv_str += body;
|
||||
});
|
||||
|
||||
res.on("end", () =>
|
||||
{
|
||||
let ret = new HttpClientResponse();
|
||||
|
||||
ret.Body = recv_str;
|
||||
|
||||
resolve(ret);
|
||||
});
|
||||
}).on("error", (err: any) =>
|
||||
{
|
||||
throw err;
|
||||
}
|
||||
);
|
||||
|
||||
for (let name of Object.keys(headers))
|
||||
{
|
||||
req.setHeader(name, !is_null(headers[name]) ? headers[name] : "");
|
||||
}
|
||||
req.setHeader("Content-Type", req_media_type);
|
||||
req.setHeader("Content-Length", Buffer.byteLength(req_body));
|
||||
req.write(req_body);
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//////// BEGIN: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js
|
||||
// The MIT License(MIT)
|
||||
// Copyright(c) 2014
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files(the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
var lookup: any = [];
|
||||
var revLookup: any = [];
|
||||
|
||||
var code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
for (var i = 0, len = code.length; i < len; ++i)
|
||||
{
|
||||
lookup[i] = code[i];
|
||||
revLookup[code.charCodeAt(i)] = i;
|
||||
}
|
||||
|
||||
// Support decoding URL-safe base64 strings, as Node.js does.
|
||||
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
||||
revLookup["-".charCodeAt(0)] = 62;
|
||||
revLookup["_".charCodeAt(0)] = 63;
|
||||
|
||||
function getLens(b64: any)
|
||||
{
|
||||
var len = b64.length;
|
||||
|
||||
if (len % 4 > 0)
|
||||
{
|
||||
throw new Error("Invalid string. Length must be a multiple of 4");
|
||||
}
|
||||
|
||||
// Trim off extra bytes after placeholder bytes are found
|
||||
// See: https://github.com/beatgammit/base64-js/issues/42
|
||||
var validLen = b64.indexOf("=");
|
||||
if (validLen === -1) validLen = len;
|
||||
|
||||
var placeHoldersLen = validLen === len
|
||||
? 0
|
||||
: 4 - (validLen % 4);
|
||||
|
||||
return [validLen, placeHoldersLen];
|
||||
}
|
||||
|
||||
// base64 is 4/3 + up to two characters of the original data
|
||||
function byteLength(b64: any)
|
||||
{
|
||||
var lens = getLens(b64);
|
||||
var validLen = lens[0];
|
||||
var placeHoldersLen = lens[1];
|
||||
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen;
|
||||
}
|
||||
|
||||
function _byteLength(b64: any, validLen: any, placeHoldersLen: any)
|
||||
{
|
||||
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen;
|
||||
}
|
||||
|
||||
export function Util_Base64_Decode(b64: any)
|
||||
{
|
||||
var tmp;
|
||||
var lens = getLens(b64);
|
||||
var validLen = lens[0];
|
||||
var placeHoldersLen = lens[1];
|
||||
|
||||
var arr = new Uint8Array(_byteLength(b64, validLen, placeHoldersLen));
|
||||
|
||||
var curByte = 0;
|
||||
|
||||
// if there are placeholders, only get up to the last complete 4 chars
|
||||
var len = placeHoldersLen > 0
|
||||
? validLen - 4
|
||||
: validLen;
|
||||
|
||||
for (var i = 0; i < len; i += 4)
|
||||
{
|
||||
tmp =
|
||||
(revLookup[b64.charCodeAt(i)] << 18) |
|
||||
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
||||
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
||||
revLookup[b64.charCodeAt(i + 3)];
|
||||
arr[curByte++] = (tmp >> 16) & 0xFF;
|
||||
arr[curByte++] = (tmp >> 8) & 0xFF;
|
||||
arr[curByte++] = tmp & 0xFF;
|
||||
}
|
||||
|
||||
if (placeHoldersLen === 2)
|
||||
{
|
||||
tmp =
|
||||
(revLookup[b64.charCodeAt(i)] << 2) |
|
||||
(revLookup[b64.charCodeAt(i + 1)] >> 4);
|
||||
arr[curByte++] = tmp & 0xFF;
|
||||
}
|
||||
|
||||
if (placeHoldersLen === 1)
|
||||
{
|
||||
tmp =
|
||||
(revLookup[b64.charCodeAt(i)] << 10) |
|
||||
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
||||
(revLookup[b64.charCodeAt(i + 2)] >> 2);
|
||||
arr[curByte++] = (tmp >> 8) & 0xFF;
|
||||
arr[curByte++] = tmp & 0xFF;
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
function tripletToBase64(num: any)
|
||||
{
|
||||
return lookup[num >> 18 & 0x3F] +
|
||||
lookup[num >> 12 & 0x3F] +
|
||||
lookup[num >> 6 & 0x3F] +
|
||||
lookup[num & 0x3F];
|
||||
}
|
||||
|
||||
function encodeChunk(uint8: any, start: any, end: any)
|
||||
{
|
||||
var tmp;
|
||||
var output = [];
|
||||
for (var i = start; i < end; i += 3)
|
||||
{
|
||||
tmp =
|
||||
((uint8[i] << 16) & 0xFF0000) +
|
||||
((uint8[i + 1] << 8) & 0xFF00) +
|
||||
(uint8[i + 2] & 0xFF);
|
||||
output.push(tripletToBase64(tmp));
|
||||
}
|
||||
return output.join("");
|
||||
}
|
||||
|
||||
export function Util_Base64_Encode(uint8: any)
|
||||
{
|
||||
var tmp;
|
||||
var len = uint8.length;
|
||||
var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
||||
var parts = [];
|
||||
var maxChunkLength = 16383; // must be multiple of 3
|
||||
|
||||
// go through the array every three bytes, we'll deal with trailing stuff later
|
||||
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength)
|
||||
{
|
||||
parts.push(encodeChunk(
|
||||
uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
|
||||
));
|
||||
}
|
||||
|
||||
// pad the end with zeros, but make sure to not forget the extra bytes
|
||||
if (extraBytes === 1)
|
||||
{
|
||||
tmp = uint8[len - 1];
|
||||
parts.push(
|
||||
lookup[tmp >> 2] +
|
||||
lookup[(tmp << 4) & 0x3F] +
|
||||
"=="
|
||||
);
|
||||
} else if (extraBytes === 2)
|
||||
{
|
||||
tmp = (uint8[len - 2] << 8) + uint8[len - 1];
|
||||
parts.push(
|
||||
lookup[tmp >> 10] +
|
||||
lookup[(tmp >> 4) & 0x3F] +
|
||||
lookup[(tmp << 2) & 0x3F] +
|
||||
"="
|
||||
);
|
||||
}
|
||||
|
||||
return parts.join("");
|
||||
}
|
||||
//////// END: Base64 encode / decode utility functions from https://github.com/beatgammit/base64-js
|
||||
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
// Test sample code for SoftEther VPN Server JSON-RPC Stub
|
||||
// Runs on both web browsers and Node.js
|
||||
//
|
||||
// sample.ts
|
||||
// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// This sample code shows how to call all available RPC functions.
|
||||
// You can copy and paste test code to write your own web browser TypeScript / JavaScript codes.
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-__YEAR__ SoftEther VPN Project
|
||||
|
||||
// On the web browser uncomment below imports as necessary to support old browsers.
|
||||
// import "core-js/es6/promise";
|
||||
// import "core-js/es6/string";
|
||||
// import "whatwg-fetch";
|
||||
|
||||
|
||||
// Import the vpnrpc.ts RPC stub.
|
||||
import * as VPN from "./vpnrpc";
|
||||
|
||||
// Output JSON-RPC request / reply strings to the debug console.
|
||||
VPN.VpnServerRpc.SetDebugMode(true);
|
||||
|
||||
let api: VPN.VpnServerRpc;
|
||||
// Creating the VpnServerRpc class instance here.
|
||||
if (VPN.VpnServerRpc.IsNodeJS() === false) // // Determine if this JavaScript environment is on the Node.js or not
|
||||
{
|
||||
// On the web browser. We do not need to specify any hostname, port or credential as the web browser already knows it.
|
||||
api = new VPN.VpnServerRpc();
|
||||
}
|
||||
else
|
||||
{
|
||||
// On the Node.js. We need to specify the target VPN Server's hostname, port and credential.
|
||||
api = new VPN.VpnServerRpc("127.0.0.1", 443, "", "PASSWORD_HERE", false);
|
||||
}
|
||||
|
||||
// A variable for test
|
||||
let hub_name = "test";
|
||||
|
||||
// Call the Test_All() function to test almost all VPN APIs.
|
||||
Test_All();
|
||||
|
||||
|
||||
|
||||
__TESTS__
|
||||
|
||||
|
@ -0,0 +1,282 @@
|
||||
// SoftEther VPN Server JSON-RPC Stub code for C#
|
||||
//
|
||||
// JsonRpc.cs - JSON-RPC Client Utility Functions
|
||||
//
|
||||
// Automatically generated at __TIMESTAMP__ by vpnserver-jsonrpc-codegen
|
||||
//
|
||||
// Licensed under the Apache License 2.0
|
||||
// Copyright (c) 2014-__YEAR__ SoftEther VPN Project
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Security;
|
||||
using System.Net.Http;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace SoftEther.JsonRpc
|
||||
{
|
||||
/// <summary>
|
||||
/// Internal utility class
|
||||
/// </summary>
|
||||
static class ClientUtil
|
||||
{
|
||||
public const int DefaultMaxDepth = 8;
|
||||
|
||||
public static string NonNull(this string s) { if (s == null) return ""; else return s; }
|
||||
public static bool IsEmpty(this string str)
|
||||
{
|
||||
if (str == null || str.Trim().Length == 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
public static bool IsFilled(this string str) => !IsEmpty(str);
|
||||
|
||||
public static string ObjectToJson(this object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false) => ClientUtil.Serialize(obj, include_null, escape_html, max_depth, compact, reference_handling);
|
||||
public static T JsonToObject<T>(this string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize<T>(str, include_null, max_depth);
|
||||
public static object JsonToObject(this string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth) => ClientUtil.Deserialize(str, type, include_null, max_depth);
|
||||
|
||||
public static string Serialize(object obj, bool include_null = false, bool escape_html = false, int? max_depth = ClientUtil.DefaultMaxDepth, bool compact = false, bool reference_handling = false)
|
||||
{
|
||||
JsonSerializerSettings setting = new JsonSerializerSettings()
|
||||
{
|
||||
MaxDepth = max_depth,
|
||||
NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore,
|
||||
ReferenceLoopHandling = ReferenceLoopHandling.Error,
|
||||
PreserveReferencesHandling = reference_handling ? PreserveReferencesHandling.All : PreserveReferencesHandling.None,
|
||||
StringEscapeHandling = escape_html ? StringEscapeHandling.EscapeHtml : StringEscapeHandling.Default,
|
||||
};
|
||||
return JsonConvert.SerializeObject(obj, compact ? Formatting.None : Formatting.Indented, setting);
|
||||
}
|
||||
|
||||
public static T Deserialize<T>(string str, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth)
|
||||
=> (T)Deserialize(str, typeof(T), include_null, max_depth);
|
||||
|
||||
public static object Deserialize(string str, Type type, bool include_null = false, int? max_depth = ClientUtil.DefaultMaxDepth)
|
||||
{
|
||||
JsonSerializerSettings setting = new JsonSerializerSettings()
|
||||
{
|
||||
MaxDepth = max_depth,
|
||||
NullValueHandling = include_null ? NullValueHandling.Include : NullValueHandling.Ignore,
|
||||
ObjectCreationHandling = ObjectCreationHandling.Replace,
|
||||
ReferenceLoopHandling = ReferenceLoopHandling.Error,
|
||||
};
|
||||
return JsonConvert.DeserializeObject(str, type, setting);
|
||||
}
|
||||
|
||||
public static void Print(this object o)
|
||||
{
|
||||
string str = o.ObjectToJson();
|
||||
|
||||
if (o is string) str = (string)o;
|
||||
|
||||
Console.WriteLine(str);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC exception class
|
||||
/// </summary>
|
||||
class JsonRpcException : Exception
|
||||
{
|
||||
public JsonRpcError RpcError { get; }
|
||||
public JsonRpcException(JsonRpcError err)
|
||||
: base($"Code={err.Code}, Message={err.Message.NonNull()}" +
|
||||
(err == null || err.Data == null ? "" : $", Data={err.Data.ObjectToJson(compact: true)}"))
|
||||
{
|
||||
this.RpcError = err;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC request class. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcRequest
|
||||
{
|
||||
[JsonProperty("jsonrpc", Order = 1)]
|
||||
public string Version { get; set; } = "2.0";
|
||||
|
||||
[JsonProperty("id", Order = 2)]
|
||||
public string Id { get; set; } = null;
|
||||
|
||||
[JsonProperty("method", Order = 3)]
|
||||
public string Method { get; set; } = "";
|
||||
|
||||
[JsonProperty("params", Order = 4)]
|
||||
public object Params { get; set; } = null;
|
||||
|
||||
public JsonRpcRequest() { }
|
||||
|
||||
public JsonRpcRequest(string method, object param, string id)
|
||||
{
|
||||
this.Method = method;
|
||||
this.Params = param;
|
||||
this.Id = id;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC response class with generics
|
||||
/// </summary>
|
||||
/// <typeparam name="TResult"></typeparam>
|
||||
class JsonRpcResponse<TResult>
|
||||
{
|
||||
[JsonProperty("jsonrpc", Order = 1)]
|
||||
public virtual string Version { get; set; } = "2.0";
|
||||
|
||||
[JsonProperty("id", NullValueHandling = NullValueHandling.Include, Order = 2)]
|
||||
public virtual string Id { get; set; } = null;
|
||||
|
||||
[JsonProperty("result", Order = 3)]
|
||||
public virtual TResult Result { get; set; } = default(TResult);
|
||||
|
||||
[JsonProperty("error", Order = 4)]
|
||||
public virtual JsonRpcError Error { get; set; } = null;
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual bool IsError => this.Error != null;
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual bool IsOk => !IsError;
|
||||
|
||||
public virtual void ThrowIfError()
|
||||
{
|
||||
if (this.IsError) throw new JsonRpcException(this.Error);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return this.ObjectToJson(compact: true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC error class. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcError
|
||||
{
|
||||
public JsonRpcError() { }
|
||||
public JsonRpcError(int code, string message, object data = null)
|
||||
{
|
||||
this.Code = code;
|
||||
this.Message = message.NonNull();
|
||||
if (this.Message.IsEmpty()) this.Message = $"JSON-RPC Error {code}";
|
||||
this.Data = data;
|
||||
}
|
||||
|
||||
[JsonProperty("code")]
|
||||
public int Code { get; set; } = 0;
|
||||
|
||||
[JsonProperty("message")]
|
||||
public string Message { get; set; } = null;
|
||||
|
||||
[JsonProperty("data")]
|
||||
public object Data { get; set; } = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC client. See https://www.jsonrpc.org/specification
|
||||
/// </summary>
|
||||
class JsonRpcClient
|
||||
{
|
||||
HttpClientHandler client_handler;
|
||||
HttpClient client;
|
||||
public const int DefaultTimeoutMsecs = 60 * 1000;
|
||||
public int TimeoutMsecs { get => (int)client.Timeout.TotalMilliseconds; set => client.Timeout = new TimeSpan(0, 0, 0, 0, value); }
|
||||
public Dictionary<string, string> HttpHeaders { get; } = new Dictionary<string, string>();
|
||||
|
||||
string base_url;
|
||||
|
||||
/// <summary>
|
||||
/// JSON-RPC client class constructor
|
||||
/// </summary>
|
||||
/// <param name="url">The URL</param>
|
||||
/// <param name="cert_check_proc">The SSL certificate validation callback</param>
|
||||
public JsonRpcClient(string url, Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> cert_check_proc = null)
|
||||
{
|
||||
if (cert_check_proc == null) cert_check_proc = (message, cert, chain, errors) => true;
|
||||
client_handler = new HttpClientHandler();
|
||||
|
||||
this.client_handler.AllowAutoRedirect = true;
|
||||
this.client_handler.MaxAutomaticRedirections = 10;
|
||||
|
||||
client_handler.ServerCertificateCustomValidationCallback = cert_check_proc;
|
||||
|
||||
client = new HttpClient(client_handler, true);
|
||||
//Console.WriteLine("new HttpClient(client_handler, true);");
|
||||
|
||||
this.base_url = url;
|
||||
|
||||
this.TimeoutMsecs = DefaultTimeoutMsecs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call a single RPC call (without error check). You can wait for the response with Task<string> or await statement.
|
||||
/// </summary>
|
||||
/// <param name="method_name">The name of RPC method</param>
|
||||
/// <param name="param">The parameters</param>
|
||||
public async Task<string> CallInternalAsync(string method_name, object param)
|
||||
{
|
||||
string id = DateTime.Now.Ticks.ToString();
|
||||
|
||||
JsonRpcRequest req = new JsonRpcRequest(method_name, param, id);
|
||||
|
||||
string req_string = req.ObjectToJson();
|
||||
|
||||
//Console.WriteLine($"req: {req_string}");
|
||||
|
||||
HttpContent content = new StringContent(req_string, Encoding.UTF8, "application/json");
|
||||
|
||||
foreach (string key in this.HttpHeaders.Keys)
|
||||
{
|
||||
string value = this.HttpHeaders[key];
|
||||
|
||||
content.Headers.Add(key, value);
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await this.client.PostAsync(base_url, content);
|
||||
|
||||
Stream responseStream = await response.Content.ReadAsStreamAsync();
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
using (StreamReader streamReader = new StreamReader(responseStream))
|
||||
{
|
||||
throw new Exception($"Error: {response.StatusCode}: {await streamReader.ReadToEndAsync()}");
|
||||
}
|
||||
}
|
||||
|
||||
string ret_string;
|
||||
|
||||
using (StreamReader streamReader = new StreamReader(responseStream))
|
||||
{
|
||||
ret_string = await streamReader.ReadToEndAsync();
|
||||
}
|
||||
|
||||
//Console.WriteLine($"ret: {ret_string}");
|
||||
|
||||
return ret_string;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Call a single RPC call (with error check). You can wait for the response with Promise<TResult> or await statement. In the case of error, it will be thrown.
|
||||
/// </summary>
|
||||
/// <param name="method_name">The name of RPC method</param>
|
||||
/// <param name="param">The parameters</param>
|
||||
public async Task<TResult> CallAsync<TResult>(string method_name, object param)
|
||||
{
|
||||
string ret_string = await CallInternalAsync(method_name, param);
|
||||
|
||||
JsonRpcResponse <TResult> ret = ret_string.JsonToObject<JsonRpcResponse<TResult>>();
|
||||
|
||||
ret.ThrowIfError();
|
||||
|
||||
return ret.Result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,35 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<RootNamespace>VPNServer_JSONRPC_CodeGen</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Templates\cs_main.txt" />
|
||||
<None Remove="Templates\cs_proj.txt" />
|
||||
<None Remove="Templates\cs_sln.txt" />
|
||||
<None Remove="Templates\doc.txt" />
|
||||
<None Remove="Templates\md_html.html" />
|
||||
<None Remove="Templates\ts_rpc.txt" />
|
||||
<None Remove="Templates\ts_test.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Templates\cs_main.txt" />
|
||||
<EmbeddedResource Include="Templates\cs_proj.txt" />
|
||||
<EmbeddedResource Include="Templates\cs_sln.txt" />
|
||||
<EmbeddedResource Include="Templates\doc.txt" />
|
||||
<EmbeddedResource Include="Templates\md_html.html" />
|
||||
<EmbeddedResource Include="Templates\ts_rpc.txt" />
|
||||
<EmbeddedResource Include="Templates\ts_test.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Markdig" Version="0.15.4" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
@ -0,0 +1,25 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.28010.2041
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vpnserver-jsonrpc-codegen", "vpnserver-jsonrpc-codegen.csproj", "{00B41CF0-7AE9-4542-9970-77B312412535}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{00B41CF0-7AE9-4542-9970-77B312412535}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{00B41CF0-7AE9-4542-9970-77B312412535}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{00B41CF0-7AE9-4542-9970-77B312412535}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{00B41CF0-7AE9-4542-9970-77B312412535}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {EBB5B5A2-21A9-42A1-B4F4-7ED92CD8BBC1}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user