vpn check don't build
This commit is contained in:
commit
d4d6ff5344
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o ./bin/win/wireguard-go.exe ./wireguard-go
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
GOOS=linux GOARCH=amd64 go build -o ./bin/linux/wireguard-go ./wireguard-go
|
||||||
|
|
||||||
|
# macOS Intel
|
||||||
|
GOOS=darwin GOARCH=amd64 go build -o ./bin/mac/wireguard-go ./wireguard-go
|
||||||
|
|
||||||
|
# macOS ARM
|
||||||
|
GOOS=darwin GOARCH=arm64 go build -o ./bin/mac/wireguard-go-arm ./wireguard-go
|
||||||
|
|
@ -85,7 +85,6 @@
|
||||||
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
|
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
"@babel/generator": "^7.28.5",
|
"@babel/generator": "^7.28.5",
|
||||||
|
|
@ -2879,7 +2878,6 @@
|
||||||
"integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==",
|
"integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==",
|
||||||
"devOptional": true,
|
"devOptional": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/prop-types": "*",
|
"@types/prop-types": "*",
|
||||||
"csstype": "^3.0.2"
|
"csstype": "^3.0.2"
|
||||||
|
|
@ -3150,7 +3148,6 @@
|
||||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-deep-equal": "^3.1.1",
|
"fast-deep-equal": "^3.1.1",
|
||||||
"fast-json-stable-stringify": "^2.0.0",
|
"fast-json-stable-stringify": "^2.0.0",
|
||||||
|
|
@ -3353,6 +3350,7 @@
|
||||||
"integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
|
"integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"archiver-utils": "^2.1.0",
|
"archiver-utils": "^2.1.0",
|
||||||
"async": "^3.2.4",
|
"async": "^3.2.4",
|
||||||
|
|
@ -3372,6 +3370,7 @@
|
||||||
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
|
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob": "^7.1.4",
|
"glob": "^7.1.4",
|
||||||
"graceful-fs": "^4.2.0",
|
"graceful-fs": "^4.2.0",
|
||||||
|
|
@ -3393,7 +3392,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/archiver-utils/node_modules/readable-stream": {
|
"node_modules/archiver-utils/node_modules/readable-stream": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.8",
|
||||||
|
|
@ -3401,6 +3401,7 @@
|
||||||
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core-util-is": "~1.0.0",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "~2.0.3",
|
"inherits": "~2.0.3",
|
||||||
|
|
@ -3416,7 +3417,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/archiver-utils/node_modules/string_decoder": {
|
"node_modules/archiver-utils/node_modules/string_decoder": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
|
|
@ -3424,6 +3426,7 @@
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "~5.1.0"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
|
|
@ -3708,7 +3711,6 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"baseline-browser-mapping": "^2.8.25",
|
"baseline-browser-mapping": "^2.8.25",
|
||||||
"caniuse-lite": "^1.0.30001754",
|
"caniuse-lite": "^1.0.30001754",
|
||||||
|
|
@ -4326,6 +4328,7 @@
|
||||||
"integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
|
"integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"buffer-crc32": "^0.2.13",
|
"buffer-crc32": "^0.2.13",
|
||||||
"crc32-stream": "^4.0.2",
|
"crc32-stream": "^4.0.2",
|
||||||
|
|
@ -4527,6 +4530,7 @@
|
||||||
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
|
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"crc32": "bin/crc32.njs"
|
"crc32": "bin/crc32.njs"
|
||||||
},
|
},
|
||||||
|
|
@ -4540,6 +4544,7 @@
|
||||||
"integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
|
"integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"crc-32": "^1.2.0",
|
"crc-32": "^1.2.0",
|
||||||
"readable-stream": "^3.4.0"
|
"readable-stream": "^3.4.0"
|
||||||
|
|
@ -5021,7 +5026,6 @@
|
||||||
"integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==",
|
"integrity": "sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"app-builder-lib": "25.1.8",
|
"app-builder-lib": "25.1.8",
|
||||||
"builder-util": "25.1.7",
|
"builder-util": "25.1.7",
|
||||||
|
|
@ -5241,6 +5245,7 @@
|
||||||
"integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==",
|
"integrity": "sha512-2ntkJ+9+0GFP6nAISiMabKt6eqBB0kX1QqHNWFWAXgi0VULKGisM46luRFpIBiU3u/TDmhZMM8tzvo2Abn3ayg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"app-builder-lib": "25.1.8",
|
"app-builder-lib": "25.1.8",
|
||||||
"archiver": "^5.3.1",
|
"archiver": "^5.3.1",
|
||||||
|
|
@ -5254,6 +5259,7 @@
|
||||||
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
|
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"graceful-fs": "^4.2.0",
|
"graceful-fs": "^4.2.0",
|
||||||
"jsonfile": "^6.0.1",
|
"jsonfile": "^6.0.1",
|
||||||
|
|
@ -5269,6 +5275,7 @@
|
||||||
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
|
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"universalify": "^2.0.0"
|
"universalify": "^2.0.0"
|
||||||
},
|
},
|
||||||
|
|
@ -5282,6 +5289,7 @@
|
||||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.0.0"
|
"node": ">= 10.0.0"
|
||||||
}
|
}
|
||||||
|
|
@ -6248,7 +6256,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
|
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/fs-extra": {
|
"node_modules/fs-extra": {
|
||||||
"version": "8.1.0",
|
"version": "8.1.0",
|
||||||
|
|
@ -7184,7 +7193,7 @@
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||||
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
||||||
"devOptional": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||||
|
|
@ -7935,6 +7944,7 @@
|
||||||
"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
|
"integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"readable-stream": "^2.0.5"
|
"readable-stream": "^2.0.5"
|
||||||
},
|
},
|
||||||
|
|
@ -7947,7 +7957,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lazystream/node_modules/readable-stream": {
|
"node_modules/lazystream/node_modules/readable-stream": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.8",
|
||||||
|
|
@ -7955,6 +7966,7 @@
|
||||||
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core-util-is": "~1.0.0",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "~2.0.3",
|
"inherits": "~2.0.3",
|
||||||
|
|
@ -7970,7 +7982,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lazystream/node_modules/string_decoder": {
|
"node_modules/lazystream/node_modules/string_decoder": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
|
|
@ -7978,6 +7991,7 @@
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "~5.1.0"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
|
|
@ -8270,21 +8284,24 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
|
||||||
"integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
|
"integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash.difference": {
|
"node_modules/lodash.difference": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
|
||||||
"integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
|
"integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash.flatten": {
|
"node_modules/lodash.flatten": {
|
||||||
"version": "4.4.0",
|
"version": "4.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
|
||||||
"integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
|
"integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash.isequal": {
|
"node_modules/lodash.isequal": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
|
|
@ -8298,14 +8315,16 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/lodash.union": {
|
"node_modules/lodash.union": {
|
||||||
"version": "4.6.0",
|
"version": "4.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
|
||||||
"integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
|
"integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/log-symbols": {
|
"node_modules/log-symbols": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
|
|
@ -9110,6 +9129,7 @@
|
||||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
|
|
@ -9795,7 +9815,8 @@
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT",
|
||||||
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/progress": {
|
"node_modules/progress": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
|
|
@ -9905,7 +9926,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
|
||||||
"integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
|
"integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-diff": "^1.3.0",
|
"fast-diff": "^1.3.0",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
|
|
@ -9939,7 +9959,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
|
||||||
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
|
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"loose-envify": "^1.1.0"
|
"loose-envify": "^1.1.0"
|
||||||
},
|
},
|
||||||
|
|
@ -9952,7 +9971,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
|
||||||
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
|
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"loose-envify": "^1.1.0",
|
"loose-envify": "^1.1.0",
|
||||||
"scheduler": "^0.23.2"
|
"scheduler": "^0.23.2"
|
||||||
|
|
@ -9987,7 +10005,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
|
||||||
"integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
|
"integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/use-sync-external-store": "^0.0.6",
|
"@types/use-sync-external-store": "^0.0.6",
|
||||||
"use-sync-external-store": "^1.4.0"
|
"use-sync-external-store": "^1.4.0"
|
||||||
|
|
@ -10134,6 +10151,7 @@
|
||||||
"integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
|
"integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"minimatch": "^5.1.0"
|
"minimatch": "^5.1.0"
|
||||||
}
|
}
|
||||||
|
|
@ -10144,6 +10162,7 @@
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0"
|
"balanced-match": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
|
@ -10154,6 +10173,7 @@
|
||||||
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
|
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^2.0.1"
|
"brace-expansion": "^2.0.1"
|
||||||
},
|
},
|
||||||
|
|
@ -10197,8 +10217,7 @@
|
||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
|
||||||
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
|
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
|
||||||
"license": "MIT",
|
"license": "MIT"
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"node_modules/redux-thunk": {
|
"node_modules/redux-thunk": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
|
|
@ -11477,6 +11496,7 @@
|
||||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bl": "^4.0.3",
|
"bl": "^4.0.3",
|
||||||
"end-of-stream": "^1.4.1",
|
"end-of-stream": "^1.4.1",
|
||||||
|
|
@ -11947,7 +11967,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
|
||||||
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
|
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.21.3",
|
"esbuild": "^0.21.3",
|
||||||
"postcss": "^8.4.43",
|
"postcss": "^8.4.43",
|
||||||
|
|
@ -12509,6 +12528,7 @@
|
||||||
"integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
|
"integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"archiver-utils": "^3.0.4",
|
"archiver-utils": "^3.0.4",
|
||||||
"compress-commons": "^4.1.2",
|
"compress-commons": "^4.1.2",
|
||||||
|
|
@ -12524,6 +12544,7 @@
|
||||||
"integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
|
"integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob": "^7.2.3",
|
"glob": "^7.2.3",
|
||||||
"graceful-fs": "^4.2.0",
|
"graceful-fs": "^4.2.0",
|
||||||
|
|
|
||||||
11
package.json
11
package.json
|
|
@ -70,6 +70,14 @@
|
||||||
{
|
{
|
||||||
"from": "src/assets",
|
"from": "src/assets",
|
||||||
"to": "assets"
|
"to": "assets"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "resources/wireguard-install",
|
||||||
|
"to": "wireguard-install"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": "resources/wireguard",
|
||||||
|
"to": "wireguard"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mac": {
|
"mac": {
|
||||||
|
|
@ -83,6 +91,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"win": {
|
"win": {
|
||||||
|
"requestedExecutionLevel": "requireAdministrator",
|
||||||
"target": [
|
"target": [
|
||||||
{
|
{
|
||||||
"target": "nsis",
|
"target": "nsis",
|
||||||
|
|
@ -126,4 +135,4 @@
|
||||||
"vite": "^5.4.7",
|
"vite": "^5.4.7",
|
||||||
"vitest": "^2.1.1"
|
"vitest": "^2.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = CEzCd25ufxbOjvRhMqLfkcdP/OziG5i6OkXCfMZrI1I=
|
||||||
|
Address = 10.0.0.2/24
|
||||||
|
DNS = 1.1.1.1
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = jG+7H5thEiNjxY1XqI1R9oyMAMTIegLwE3tZkS1Rj2U=
|
||||||
|
Endpoint = 35.95.209.161:51820
|
||||||
|
AllowedIPs = 10.0.0.0/24
|
||||||
|
PersistentKeepalive = 25
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Interface]
|
||||||
|
PrivateKey = CEzCd25ufxbOjvRhMqLfkcdP/OziG5i6OkXCfMZrI1I=
|
||||||
|
Address = 10.0.0.2/24
|
||||||
|
DNS = 1.1.1.1
|
||||||
|
|
||||||
|
[Peer]
|
||||||
|
PublicKey = jG+7H5thEiNjxY1XqI1R9oyMAMTIegLwE3tZkS1Rj2U=
|
||||||
|
Endpoint = 35.95.209.161:51820
|
||||||
|
AllowedIPs = 10.0.0.0/24
|
||||||
|
PersistentKeepalive = 25
|
||||||
|
|
@ -4,6 +4,7 @@ import { getToken } from '../utils/tokenHelper.js';
|
||||||
import chalk from "chalk";
|
import chalk from "chalk";
|
||||||
import { sendTokenExpired } from '../ipc/ipcHandler.js';
|
import { sendTokenExpired } from '../ipc/ipcHandler.js';
|
||||||
import https from 'https';
|
import https from 'https';
|
||||||
|
import { getBaseURL } from './baseURL.js';
|
||||||
|
|
||||||
const TOKEN_KEY = 'ACCESS_TOKEN';
|
const TOKEN_KEY = 'ACCESS_TOKEN';
|
||||||
|
|
||||||
|
|
@ -12,9 +13,7 @@ const httpsAgent = new https.Agent({
|
||||||
});
|
});
|
||||||
|
|
||||||
const api: AxiosInstance = axios.create({
|
const api: AxiosInstance = axios.create({
|
||||||
// https://dreadingly-unfighting-pandora.ngrok-free.dev/
|
baseURL: await getBaseURL(), // 🔁 your backend
|
||||||
// https://daniela-nonprofessed-boastfully.ngrok-free.app/
|
|
||||||
baseURL: 'https://daniela-nonprofessed-boastfully.ngrok-free.app/api/v1/va', // 🔁 your backend
|
|
||||||
httpsAgent
|
httpsAgent
|
||||||
// timeout: 10000,
|
// timeout: 10000,
|
||||||
});
|
});
|
||||||
|
|
@ -31,7 +30,7 @@ api.interceptors.request.use(
|
||||||
|
|
||||||
if (token) {
|
if (token) {
|
||||||
config.headers['token'] = token;
|
config.headers['token'] = token;
|
||||||
config.headers['ngrok-skip-browser-warning'] = 'true';
|
config.headers['ngrok-skip-browser-warning'] = 'true';
|
||||||
}
|
}
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
|
|
@ -56,7 +55,7 @@ api.interceptors.response.use(
|
||||||
(response: AxiosResponse) => response.data,
|
(response: AxiosResponse) => response.data,
|
||||||
async (error) => {
|
async (error) => {
|
||||||
|
|
||||||
console.log(error , "Line 46")
|
console.log(error, "Line 46")
|
||||||
const status = error?.response?.status;
|
const status = error?.response?.status;
|
||||||
|
|
||||||
console.error('[Axios Error]', status);
|
console.error('[Axios Error]', status);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
let CURRENT_BASE_URL = "https://portal-sf.docva.com";
|
||||||
|
|
||||||
|
export const getBaseURL = () => CURRENT_BASE_URL;
|
||||||
|
export const setBaseURL = (url: string) => {
|
||||||
|
CURRENT_BASE_URL = url;
|
||||||
|
};
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
|
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import https from "https";
|
import https from "https";
|
||||||
|
import { getBaseURL } from "./baseURL.js";
|
||||||
|
|
||||||
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
|
const httpsAgent = new https.Agent({ rejectUnauthorized: false });
|
||||||
|
|
||||||
export const checkRegion = async () => {
|
export const checkRegion = async () => {
|
||||||
const baseURL = "https://daniela-nonprofessed-boastfully.ngrok-free.app";
|
const baseURL = await getBaseURL();
|
||||||
|
|
||||||
|
console.log("checkRegion@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" ,baseURL)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
|
@ -14,6 +17,8 @@ export const checkRegion = async () => {
|
||||||
httpsAgent
|
httpsAgent
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log(res , "checkRegion")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
status: res.status,
|
status: res.status,
|
||||||
|
|
@ -21,33 +26,11 @@ export const checkRegion = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
|
console.log(error , "Line 29")
|
||||||
const status = error?.response?.status || 500;
|
const status = error?.response?.status || 500;
|
||||||
|
|
||||||
console.log("Region Check Error:", status);
|
console.log("Region Check Error:", status);
|
||||||
|
|
||||||
// 🔁 Auto retry if 403 — server blocked first try
|
|
||||||
if (status === 403) {
|
|
||||||
try {
|
|
||||||
const retry = await axios.get(`${baseURL}/api`, {
|
|
||||||
headers: { "ngrok-skip-browser-warning": "true" },
|
|
||||||
httpsAgent
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
status: retry.status,
|
|
||||||
data: retry.data,
|
|
||||||
retry: true
|
|
||||||
};
|
|
||||||
} catch (retryErr: any) {
|
|
||||||
return {
|
|
||||||
success: false,
|
|
||||||
status: retryErr?.response?.status || 500,
|
|
||||||
message: "403 Retry failed"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
status,
|
status,
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import { getActiveApp, handleLogin, takeScreenshot, startWindowPolling, getRunni
|
||||||
import api from "../api/axiosClient.js";
|
import api from "../api/axiosClient.js";
|
||||||
import { getMainWindow } from '../main.js';
|
import { getMainWindow } from '../main.js';
|
||||||
import { checkRegion } from "../api/regionCheck.js";
|
import { checkRegion } from "../api/regionCheck.js";
|
||||||
|
import { startVPN, stopVPN } from "../vpn.js";
|
||||||
|
import { getBaseURL, setBaseURL } from "../api/baseURL.js";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -11,7 +13,19 @@ import { checkRegion } from "../api/regionCheck.js";
|
||||||
export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
|
export const registerIPCHandlers = (mainWindow: BrowserWindow) => {
|
||||||
console.log("⚙️ Registering IPC Handlers...");
|
console.log("⚙️ Registering IPC Handlers...");
|
||||||
|
|
||||||
|
|
||||||
|
ipcMain.handle("GET_BASE_URL", () => {
|
||||||
|
return getBaseURL();
|
||||||
|
});
|
||||||
|
|
||||||
|
// UPDATE Base URL
|
||||||
|
ipcMain.handle("UPDATE_BASE_URL", (event, url: string) => {
|
||||||
|
setBaseURL(url);
|
||||||
|
return {
|
||||||
|
updated: true,
|
||||||
|
baseURL: url
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
ipcMain.handle("get-token", async (_, key: "ACCESS_TOKEN" | "REFRESH_TOKEN") => {
|
ipcMain.handle("get-token", async (_, key: "ACCESS_TOKEN" | "REFRESH_TOKEN") => {
|
||||||
return await getToken(key);
|
return await getToken(key);
|
||||||
|
|
@ -554,4 +568,10 @@ export const sendTokenExpired = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
;
|
ipcMain.handle("vpn-connect", async () => {
|
||||||
|
return startVPN();
|
||||||
|
});
|
||||||
|
|
||||||
|
ipcMain.handle("vpn-disconnect", async () => {
|
||||||
|
stopVPN();
|
||||||
|
});
|
||||||
|
|
@ -8,6 +8,9 @@ import "./ipc/ipcHandler.js";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { fileURLToPath } from "url";
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { execFile } from "child_process";
|
||||||
|
|
||||||
app.setAppUserModelId("com.tracker.app");
|
app.setAppUserModelId("com.tracker.app");
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
|
|
@ -52,12 +55,26 @@ app.on("second-instance", () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// CHECKING IF WIREGUARD EXIST - IF NOT INSTALLING IN CLIENT MACHINE
|
||||||
|
const wgPath = "C:\\Program Files\\WireGuard\\wireguard.exe";
|
||||||
|
|
||||||
|
if (!fs.existsSync(wgPath)) {
|
||||||
|
const installer = path.join(process.resourcesPath, "wireguard-install", "wireguard-installer.exe");
|
||||||
|
|
||||||
|
execFile(installer, ["/quiet"], (err) => {
|
||||||
|
if (err) console.error("WireGuard install failed:", err);
|
||||||
|
else console.log("WireGuard installed successfully.");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// CHECKING IF WIREGUARD EXIST - IF NOT INSTALLING IN CLIENT MACHINE
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------
|
// ---------------------------
|
||||||
// MAIN APP READY
|
// MAIN APP READY
|
||||||
// ---------------------------
|
// ---------------------------
|
||||||
app.on("ready", async () => {
|
app.on("ready", async () => {
|
||||||
|
|
||||||
|
|
||||||
splashWindow = new BrowserWindow({
|
splashWindow = new BrowserWindow({
|
||||||
width: 300,
|
width: 300,
|
||||||
height: 300,
|
height: 300,
|
||||||
|
|
@ -68,7 +85,7 @@ app.on("ready", async () => {
|
||||||
show: true,
|
show: true,
|
||||||
skipTaskbar: true,
|
skipTaskbar: true,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
devTools: true,
|
devTools: false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -90,8 +107,8 @@ app.on("ready", async () => {
|
||||||
// alwaysOnTop: true,
|
// alwaysOnTop: true,
|
||||||
// skipTaskbar: true,
|
// skipTaskbar: true,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
frame: true,
|
frame: true,
|
||||||
show: false,
|
show: false,
|
||||||
icon: resolveIcon(),
|
icon: resolveIcon(),
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
devTools: true,
|
devTools: true,
|
||||||
|
|
@ -102,14 +119,14 @@ app.on("ready", async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// win.setAlwaysOnTop(true, 'screen-saver');
|
// win.setAlwaysOnTop(true, 'screen-saver');
|
||||||
// win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
|
// win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
|
||||||
// win.setFullScreenable(false);
|
// win.setFullScreenable(false);
|
||||||
|
|
||||||
// Cross-platform safe always-on-top
|
// Cross-platform safe always-on-top
|
||||||
const isMac = process.platform === "darwin";
|
const isMac = process.platform === "darwin";
|
||||||
|
|
||||||
if (isMac) {
|
if (isMac) {
|
||||||
win.setAlwaysOnTop(true, "floating"); // best for macOS
|
win.setAlwaysOnTop(true, "floating"); // best for macOS
|
||||||
win.setVisibleOnAllWorkspaces(true); // NO fullscreen override
|
win.setVisibleOnAllWorkspaces(true); // NO fullscreen override
|
||||||
|
|
@ -117,7 +134,7 @@ app.on("ready", async () => {
|
||||||
win.setAlwaysOnTop(true, "normal"); // safest for Windows + Zoom
|
win.setAlwaysOnTop(true, "normal"); // safest for Windows + Zoom
|
||||||
win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
|
win.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
|
||||||
win.setFullScreenable(false);
|
win.setFullScreenable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
mainWindow = win;
|
mainWindow = win;
|
||||||
|
|
@ -164,17 +181,17 @@ app.on("ready", async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// app.on('browser-window-focus', () => {
|
app.on('browser-window-focus', () => {
|
||||||
// globalShortcut.register('CommandOrControl+R', () => {
|
globalShortcut.register('CommandOrControl+R', () => {
|
||||||
// // Do nothing; disables reload
|
// Do nothing; disables reload
|
||||||
// });
|
});
|
||||||
// globalShortcut.register('F5', () => {
|
globalShortcut.register('F5', () => {
|
||||||
// // Do nothing; disables reload
|
// Do nothing; disables reload
|
||||||
// });
|
});
|
||||||
// globalShortcut.register('CommandOrControl+Shift+I', () => {
|
globalShortcut.register('CommandOrControl+Shift+I', () => {
|
||||||
// // Do nothing; disables DevTools
|
// Do nothing; disables DevTools
|
||||||
// });
|
});
|
||||||
// });
|
});
|
||||||
|
|
||||||
// app.on('browser-window-blur', () => {
|
// app.on('browser-window-blur', () => {
|
||||||
// globalShortcut.unregisterAll();
|
// globalShortcut.unregisterAll();
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,14 @@ contextBridge.exposeInMainWorld('electron', {
|
||||||
getLeaveList: () => ipcRenderer.invoke("get-leave-list"),
|
getLeaveList: () => ipcRenderer.invoke("get-leave-list"),
|
||||||
getAdjustmentsList:(vaId: string) => ipcRenderer.invoke("get-adjustments-list",vaId),
|
getAdjustmentsList:(vaId: string) => ipcRenderer.invoke("get-adjustments-list",vaId),
|
||||||
|
|
||||||
checkRegion: () => ipcRenderer.invoke("check-region")
|
checkRegion: () => ipcRenderer.invoke("check-region"),
|
||||||
|
|
||||||
|
connectVPN: () => ipcRenderer.invoke("vpn-connect"),
|
||||||
|
disconnectVPN: () => ipcRenderer.invoke("vpn-disconnect"),
|
||||||
|
|
||||||
|
getBaseURL: () => ipcRenderer.invoke("GET_BASE_URL"),
|
||||||
|
updateBaseURL: (url: string) => ipcRenderer.invoke("UPDATE_BASE_URL", url),
|
||||||
|
|
||||||
} satisfies Window['electron']);
|
} satisfies Window['electron']);
|
||||||
|
|
||||||
// function ipcInvoke<Key extends keyof EventPayloadMapping>(
|
// function ipcInvoke<Key extends keyof EventPayloadMapping>(
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ test('', () => {
|
||||||
expect(template[0].label).toEqual('Show');
|
expect(template[0].label).toEqual('Show');
|
||||||
template[0]?.click?.(null as any, null as any, null as any);
|
template[0]?.click?.(null as any, null as any, null as any);
|
||||||
expect(mainWindow.show).toHaveBeenCalled();
|
expect(mainWindow.show).toHaveBeenCalled();
|
||||||
expect(app.dock.show).toHaveBeenCalled();
|
expect(app.dock!.show).toHaveBeenCalled();
|
||||||
|
|
||||||
template[1]?.click?.(null as any, null as any, null as any);
|
template[1]?.click?.(null as any, null as any, null as any);
|
||||||
expect(app.quit).toHaveBeenCalled();
|
expect(app.quit).toHaveBeenCalled();
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import { saveToken } from "./tokenHelper.js";
|
||||||
import { activeWindow } from "get-windows";
|
import { activeWindow } from "get-windows";
|
||||||
import { exec } from "child_process";
|
import { exec } from "child_process";
|
||||||
import { getUIPath } from "../pathResolver.js";
|
import { getUIPath } from "../pathResolver.js";
|
||||||
|
import { getBaseURL } from "../api/baseURL.js";
|
||||||
|
|
||||||
const httpsAgent = new https.Agent({
|
const httpsAgent = new https.Agent({
|
||||||
rejectUnauthorized: false
|
rejectUnauthorized: false
|
||||||
|
|
@ -61,14 +62,16 @@ export const handleLogin = async (credentials: { email: string, password: string
|
||||||
// Call your login API
|
// Call your login API
|
||||||
console.log("🟡 login Request received", credentials);
|
console.log("🟡 login Request received", credentials);
|
||||||
|
|
||||||
|
let baseURL = getBaseURL()
|
||||||
|
|
||||||
console.log("app.getAppPath()", app.getAppPath());
|
console.log("app.getAppPath()", app.getAppPath());
|
||||||
console.log("UIPATH", getUIPath());
|
console.log("UIPATH", getUIPath());
|
||||||
console.log("Doom 1");
|
console.log("Doom 1" , `${baseURL}/api/v1/va/login`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
console.log("➡️ Calling API...");
|
console.log("➡️ Calling API...");
|
||||||
const response = await axios.post(
|
const response = await axios.post(
|
||||||
'https://daniela-nonprofessed-boastfully.ngrok-free.app/api/v1/va/login',
|
`${baseURL}/api/v1/va/login`,
|
||||||
{ userDetails: { ...credentials } },
|
{ userDetails: { ...credentials } },
|
||||||
{ headers: { "ngrok-skip-browser-warning": 69420 }, httpsAgent }
|
{ headers: { "ngrok-skip-browser-warning": 69420 }, httpsAgent }
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,223 @@
|
||||||
|
import { app } from "electron";
|
||||||
|
import { exec, execFile } from "child_process";
|
||||||
|
import fs from "fs";
|
||||||
|
import os from "os";
|
||||||
|
import path from "path";
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ HELPERS ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
// Promise wrapper for exec()
|
||||||
|
function execPromise(cmd: string): Promise<string> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
exec(cmd, (err, stdout, stderr) => {
|
||||||
|
if (err) return reject(stderr || err);
|
||||||
|
resolve(stdout);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect dev vs production
|
||||||
|
function isDev() {
|
||||||
|
return !app.isPackaged;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ PATH RESOLVERS ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
// WireGuard installer path (Windows only)
|
||||||
|
// function getWireGuardInstallerPath(): string {
|
||||||
|
// return isDev()
|
||||||
|
// ? path.join(process.cwd(), "resources", "wireguard-install", "wireguard-installer.exe")
|
||||||
|
// : path.join(process.resourcesPath, "wireguard-install", "wireguard-installer.exe");
|
||||||
|
// }
|
||||||
|
|
||||||
|
function getWireGuardInstallerPath(): string {
|
||||||
|
const devPath = path.join(process.cwd(), "resources", "wireguard-install", "wireguard-installer.exe");
|
||||||
|
|
||||||
|
// When running "npm run dev", use devPath ALWAYS
|
||||||
|
if (!app.isPackaged) {
|
||||||
|
console.log("DEV MODE Installer Path:", devPath);
|
||||||
|
return devPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Production build path
|
||||||
|
const prodPath = path.join(process.resourcesPath, "wireguard-install", "wireguard-installer.exe");
|
||||||
|
console.log("PROD MODE Installer Path:", prodPath);
|
||||||
|
return prodPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// OS-specific wg0.conf
|
||||||
|
function getConfigPath(): string {
|
||||||
|
const base = isDev()
|
||||||
|
? path.join(process.cwd(), "resources", "wireguard")
|
||||||
|
: path.join(process.resourcesPath, "wireguard");
|
||||||
|
|
||||||
|
if (process.platform === "win32") {
|
||||||
|
return path.join(base, "windows", "wg0.conf");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.platform === "darwin") {
|
||||||
|
return path.join(base, "macos", "wg0.conf");
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error("Unsupported OS");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect installed WireGuard.exe on Windows
|
||||||
|
function findWireGuardCLI(): string | null {
|
||||||
|
const possiblePaths = [
|
||||||
|
"C:\\Program Files\\WireGuard\\wireguard.exe",
|
||||||
|
"C:\\Program Files (x86)\\WireGuard\\wireguard.exe"
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const p of possiblePaths) {
|
||||||
|
if (fs.existsSync(p)) return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ WINDOWS INSTALL LOGIC ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
// Install WireGuard silently
|
||||||
|
async function ensureWireGuardInstalled(): Promise<string> {
|
||||||
|
let cli = findWireGuardCLI();
|
||||||
|
if (cli) return cli;
|
||||||
|
|
||||||
|
// Installer path
|
||||||
|
const installer = getWireGuardInstallerPath();
|
||||||
|
if (!fs.existsSync(installer)) {
|
||||||
|
throw new Error("WireGuard installer not found in resources.");
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("WireGuard not found. Installing silently...");
|
||||||
|
await execPromise(`"${installer}" /quiet`);
|
||||||
|
|
||||||
|
cli = findWireGuardCLI();
|
||||||
|
if (!cli) throw new Error("WireGuard installation failed.");
|
||||||
|
|
||||||
|
console.log("WireGuard installed successfully:", cli);
|
||||||
|
return cli;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ WINDOWS CONNECT/DISCONNECT ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
// async function connectWindows(): Promise<string> {
|
||||||
|
// const cli = await ensureWireGuardInstalled();
|
||||||
|
// const conf = getConfigPath();
|
||||||
|
|
||||||
|
// // Disable GUI auto popup
|
||||||
|
// await execPromise(
|
||||||
|
// `reg add "HKCU\\Software\\WireGuard" /v SuppressTray /t REG_DWORD /d 1 /f`
|
||||||
|
// );
|
||||||
|
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// execFile(cli, ["/installtunnelservice", conf], (err) => {
|
||||||
|
// if (err) return reject("Failed to connect VPN: " + err);
|
||||||
|
// resolve("Windows VPN connected without GUI");
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// let wgRuntimeProcess: any = null;
|
||||||
|
|
||||||
|
// async function connectWindows(): Promise<string> {
|
||||||
|
// const cli = await ensureWireGuardInstalled();
|
||||||
|
// const conf = getConfigPath();
|
||||||
|
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// wgRuntimeProcess = execFile(cli, ["/tunnelservice", conf], (err) => {
|
||||||
|
// if (err) return reject("VPN connection error: " + err);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// // Wait a bit for interface to come up
|
||||||
|
// setTimeout(() => resolve("Windows VPN connected silently"), 800);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
async function connectWindows(): Promise<string> {
|
||||||
|
const cli = await ensureWireGuardInstalled();
|
||||||
|
const conf = getConfigPath();
|
||||||
|
|
||||||
|
// Disable GUI popup and silent mode (ignore errors)
|
||||||
|
await execPromise(`reg add "HKCU\\Software\\WireGuard" /v HideTrayIcon /t REG_DWORD /d 1 /f`).catch(() => {});
|
||||||
|
await execPromise(`reg add "HKCU\\Software\\WireGuard" /v SuppressTray /t REG_DWORD /d 1 /f`).catch(() => {});
|
||||||
|
await execPromise(`reg delete "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v WireGuard /f`).catch(() => {});
|
||||||
|
|
||||||
|
// Start background service
|
||||||
|
await execPromise(`sc start WireGuardManager`).catch(() => {});
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
execFile(cli, ["/installtunnelservice", conf], (err) => {
|
||||||
|
if (err) return reject("VPN connection failed: " + err);
|
||||||
|
resolve("Windows VPN connected silently");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// function disconnectWindows(): Promise<string> {
|
||||||
|
// const cli = findWireGuardCLI();
|
||||||
|
// if (!cli) return Promise.reject("WireGuard CLI not found");
|
||||||
|
|
||||||
|
// return execPromise(`"${cli}" /uninstalltunnelservice wg0`);
|
||||||
|
// }
|
||||||
|
|
||||||
|
async function disconnectWindows(): Promise<string> {
|
||||||
|
const cli = findWireGuardCLI();
|
||||||
|
if (!cli) throw new Error("WireGuard CLI not found");
|
||||||
|
|
||||||
|
// 1. Remove the installed tunnel service
|
||||||
|
await execPromise(`"${cli}" /uninstalltunnelservice wg0`);
|
||||||
|
|
||||||
|
// 2. Ensure background service is still running (optional clean-up)
|
||||||
|
// Windows sometimes marks the service as "stopped" after uninstall
|
||||||
|
await execPromise(`sc stop WireGuardTunnel$wg0`).catch(() => { });
|
||||||
|
await execPromise(`sc stop WireGuardManager`).catch(() => { });
|
||||||
|
|
||||||
|
return "Windows VPN disconnected";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ MACOS CONNECT/DISCONNECT ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
function connectMac(): Promise<string> {
|
||||||
|
const conf = getConfigPath();
|
||||||
|
return execPromise(`sudo wg-quick up "${conf}"`).then(() => "macOS VPN connected");
|
||||||
|
}
|
||||||
|
|
||||||
|
function disconnectMac(): Promise<string> {
|
||||||
|
return execPromise(`sudo wg-quick down wg0`).then(() => "macOS VPN disconnected");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ------------------ PUBLIC API ------------------
|
||||||
|
//
|
||||||
|
|
||||||
|
export function startVPN(): Promise<string> {
|
||||||
|
const platform = os.platform();
|
||||||
|
|
||||||
|
if (platform === "win32") return connectWindows();
|
||||||
|
if (platform === "darwin") return connectMac();
|
||||||
|
|
||||||
|
return Promise.reject("Unsupported OS");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function stopVPN(): Promise<string> {
|
||||||
|
const platform = os.platform();
|
||||||
|
|
||||||
|
if (platform === "win32") return disconnectWindows();
|
||||||
|
if (platform === "darwin") return disconnectMac();
|
||||||
|
|
||||||
|
return Promise.reject("Unsupported OS");
|
||||||
|
}
|
||||||
|
|
@ -167,7 +167,7 @@ const DashboardLayout = () => {
|
||||||
`Timer will continue running. Please stop manually when ready.`
|
`Timer will continue running. Please stop manually when ready.`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
console.log("✅ Alert shown, timer continues running");
|
console.log("✅ Alert shown, timer continues running");
|
||||||
}, [selectedProject]);
|
}, [selectedProject]);
|
||||||
|
|
@ -262,11 +262,11 @@ const DashboardLayout = () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
// STEP 6: Update UI (restore window)
|
// STEP 6: Update UI (restore window)
|
||||||
console.log("🪟 STEP 6: Restoring window...");
|
console.log("🪟 STEP 6: Restoring window...");
|
||||||
await window.electron.toggleCloseBtn(true);
|
await window.electron.toggleCloseBtn(true);
|
||||||
await window.electron.resizeWindow(500, 600);
|
await window.electron.resizeWindow(500, 600);
|
||||||
toggleWindowSize.current = true;
|
toggleWindowSize.current = true;
|
||||||
console.log("✅ Window restored");
|
console.log("✅ Window restored");
|
||||||
|
|
||||||
// Allow React to process the state update
|
// Allow React to process the state update
|
||||||
await new Promise(resolve => setTimeout(resolve, 50));
|
await new Promise(resolve => setTimeout(resolve, 50));
|
||||||
|
|
@ -333,7 +333,7 @@ const DashboardLayout = () => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("❌ Error refreshing project list:", error);
|
console.error("❌ Error refreshing project list:", error);
|
||||||
|
|
@ -590,7 +590,7 @@ const DashboardLayout = () => {
|
||||||
if (!selectedProject?.projectId) return
|
if (!selectedProject?.projectId) return
|
||||||
|
|
||||||
console.log(selectedProject?.projectId, "SelectedProject ID")
|
console.log(selectedProject?.projectId, "SelectedProject ID")
|
||||||
socketRef.current = io("https://daniela-nonprofessed-boastfully.ngrok-free.app", {
|
socketRef.current = io("https://quality-friendly-goldfish.ngrok-free.app", {
|
||||||
transports: ["websocket"],
|
transports: ["websocket"],
|
||||||
secure: true,
|
secure: true,
|
||||||
rejectUnauthorized: false,
|
rejectUnauthorized: false,
|
||||||
|
|
@ -726,9 +726,39 @@ const DashboardLayout = () => {
|
||||||
// return `${hrs}h ${mins}m `;
|
// return `${hrs}h ${mins}m `;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const [checkIp, setCheckIp] = useState(false)
|
||||||
|
useEffect(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
fetch('https://api.ipify.org/?format=json').then((res) => console.log("IPPPPPPPPPPPPPP", res))
|
||||||
|
}, 5000)
|
||||||
|
}, [checkIp])
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="flex flex-col h-screen overflow-hidden">
|
<div className="flex flex-col h-screen overflow-hidden">
|
||||||
|
{/* <button
|
||||||
|
onClick={() => {
|
||||||
|
setCheckIp((prev) => !prev)
|
||||||
|
window.electron.connectVPN().then((msg) => {
|
||||||
|
console.log(msg);
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
className="text-purple-400"
|
||||||
|
>
|
||||||
|
Connect VPN
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
window.electron.disconnectVPN();
|
||||||
|
}}
|
||||||
|
className="text-red-400"
|
||||||
|
>
|
||||||
|
Disconnect VPN
|
||||||
|
</button> */}
|
||||||
|
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
{isTracking &&
|
{isTracking &&
|
||||||
<header className="w-full flex justify-between items-center px-4 py-2 bg-base-100 border-b border-base-300 sticky top-0 z-30">
|
<header className="w-full flex justify-between items-center px-4 py-2 bg-base-100 border-b border-base-300 sticky top-0 z-30">
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,32 @@
|
||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
|
import { Shield, ShieldAlert, RefreshCw, Wifi } from "lucide-react";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
const VpnGuard: React.FC<Props> = ({ children }) => {
|
const VpnGuard: React.FC<Props> = ({ children }) => {
|
||||||
|
|
||||||
|
const VPN_API = "http://10.0.0.2:3000";
|
||||||
|
|
||||||
const [checking, setChecking] = useState(true);
|
const [checking, setChecking] = useState(true);
|
||||||
const [vpnConnected, setVpnConnected] = useState(true);
|
const [vpnConnected, setVpnConnected] = useState(true);
|
||||||
|
const [isRetrying, setIsRetrying] = useState(false);
|
||||||
|
|
||||||
const checkVPN = async () => {
|
const checkVPN = async () => {
|
||||||
setChecking(true)
|
|
||||||
try {
|
try {
|
||||||
const res = await window.electron.checkRegion();
|
setChecking(true);
|
||||||
console.log("VpnGuard", res)
|
|
||||||
if (res.success) {
|
const res = await window.electron?.checkRegion();
|
||||||
setVpnConnected(true);
|
console.log("VpnGuard", res);
|
||||||
}
|
|
||||||
} catch {
|
setVpnConnected(res?.success === true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("VPN check failed:", error);
|
||||||
setVpnConnected(false);
|
setVpnConnected(false);
|
||||||
} finally {
|
} finally {
|
||||||
setChecking(false);
|
setChecking(false);
|
||||||
|
setIsRetrying(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -27,32 +34,121 @@ const VpnGuard: React.FC<Props> = ({ children }) => {
|
||||||
checkVPN();
|
checkVPN();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
if (checking) {
|
const connectVPN = async () => {
|
||||||
|
setChecking(true);
|
||||||
|
try {
|
||||||
|
const res = await window.electron.connectVPN();
|
||||||
|
console.log("connectVPN result → ", res);
|
||||||
|
|
||||||
|
// Only proceed if VPN actually connected
|
||||||
|
if (res === "Windows VPN connected silently") {
|
||||||
|
|
||||||
|
const vpnRes = await window.electron.updateBaseURL(VPN_API);
|
||||||
|
console.log("vpnRes", vpnRes);
|
||||||
|
|
||||||
|
if (vpnRes) {
|
||||||
|
// Run VPN check again AFTER URL changes
|
||||||
|
await checkVPN();
|
||||||
|
} else {
|
||||||
|
console.warn("Base URL updated but health check failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
} finally {
|
||||||
|
setChecking(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Checking state
|
||||||
|
if (checking && !isRetrying) {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex justify-center items-center">
|
<div className="min-h-screen flex flex-col justify-center items-center bg-base-200">
|
||||||
<span className="loading loading-spinner loading-lg"></span>
|
<div className="relative">
|
||||||
<span className="ml-3">Checking VPN...</span>
|
<div className="absolute inset-0 flex items-center justify-center">
|
||||||
|
<div className="w-24 h-24 border-4 border-primary opacity-20 rounded-full animate-ping"></div>
|
||||||
|
</div>
|
||||||
|
<div className="relative bg-base-100 rounded-full p-6 shadow-xl">
|
||||||
|
<Shield className="w-12 h-12 text-primary animate-pulse" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="mt-8 text-center">
|
||||||
|
<h2 className="text-2xl font-semibold mb-2">
|
||||||
|
Verifying Connection
|
||||||
|
</h2>
|
||||||
|
<p className="text-base-content opacity-70">Checking VPN status...</p>
|
||||||
|
<div className="flex justify-center mt-4 gap-1">
|
||||||
|
<span className="loading loading-dots loading-md text-primary"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// VPN not connected state
|
||||||
if (!vpnConnected) {
|
if (!vpnConnected) {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex justify-center items-center text-center">
|
<div className="min-h-screen flex flex-col justify-center items-center bg-base-200 p-4">
|
||||||
<div className="card shadow-xl bg-base-100 p-6">
|
<div className="max-w-md w-full">
|
||||||
<h2 className="text-xl font-bold text-red-600">VPN Required</h2>
|
<div className="card bg-base-100 shadow-2xl">
|
||||||
<p className="mt-2">Please connect to your company VPN to continue.</p>
|
<div className="card-body items-center text-center">
|
||||||
|
{/* Icon with animation */}
|
||||||
|
<div className="relative mb-4">
|
||||||
|
<div className="absolute inset-0 flex items-center justify-center">
|
||||||
|
<div className="w-20 h-20 border-4 border-error opacity-20 rounded-full animate-pulse"></div>
|
||||||
|
</div>
|
||||||
|
<div className="relative bg-error bg-opacity-10 rounded-full p-4">
|
||||||
|
<ShieldAlert className="w-12 h-12" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button className="btn btn-primary mt-4"
|
{/* Title */}
|
||||||
onClick={checkVPN}>
|
<h2 className="card-title text-3xl mb-3">
|
||||||
Retry
|
VPN Required
|
||||||
</button>
|
</h2>
|
||||||
|
|
||||||
|
{/* Description */}
|
||||||
|
<p className="mb-6 opacity-80">
|
||||||
|
Please connect to your company VPN to access this application.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Retry button */}
|
||||||
|
<button
|
||||||
|
className="btn btn-primary btn-wide gap-2"
|
||||||
|
onClick={connectVPN}
|
||||||
|
disabled={isRetrying}
|
||||||
|
>
|
||||||
|
{isRetrying ? (
|
||||||
|
<>
|
||||||
|
<span className="loading loading-spinner loading-sm"></span>
|
||||||
|
Checking Connection...
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<RefreshCw className="w-5 h-5" />
|
||||||
|
Connect VPN
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{/* Help text */}
|
||||||
|
<div className="divider"></div>
|
||||||
|
<p className="text-xs opacity-60">
|
||||||
|
Need help? Contact IT support at{" "}
|
||||||
|
<a href="mailto:support@company.com" className="link link-primary">
|
||||||
|
support@company.com
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return <>{children}</>;
|
return <>{children}</>;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default VpnGuard;
|
export default VpnGuard;
|
||||||
|
|
@ -252,6 +252,13 @@ interface Window {
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
checkRegion: () => Promise<RegionResponse>;
|
checkRegion: () => Promise<RegionResponse>;
|
||||||
|
connectVPN: () => Promise<string>;
|
||||||
|
disconnectVPN: () => Promise<void>;
|
||||||
|
getBaseURL: () => Promise<string>;
|
||||||
|
updateBaseURL: (url: string) => Promise<{
|
||||||
|
updated: boolean;
|
||||||
|
baseURL: string;
|
||||||
|
}>;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue