summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkali kaneko (leap communications) <kali@leap.se>2020-06-23 19:12:08 +0200
committerkali kaneko (leap communications) <kali@leap.se>2020-08-11 20:59:52 +0200
commit0f8eab4e1157e83f39cd7298378bb5cc9ddb913a (patch)
treee5e4d80aad90ba1cb1f34b32723c220064753760
parent3e0764caa84a21a60f971ec3693429a9981c5921 (diff)
[feat] first simplistic implementation of a rest api
It lacks authentication, and I need to debug a segfault/abort when quitting. But kind of useful for demonstration purposes.
-rw-r--r--gui/backend.go5
-rw-r--r--gui/main.cpp10
-rw-r--r--pkg/backend/api.go4
-rw-r--r--pkg/backend/webapi.go35
4 files changed, 54 insertions, 0 deletions
diff --git a/gui/backend.go b/gui/backend.go
index faf682a..875706d 100644
--- a/gui/backend.go
+++ b/gui/backend.go
@@ -66,6 +66,11 @@ func InitializeTestBitmaskContext() {
backend.EnableMockBackend()
}
+//export EnableWebAPI
+func EnableWebAPI() {
+ backend.EnableWebAPI()
+}
+
//export RefreshContext
func RefreshContext() *C.char {
return (*C.char)(backend.RefreshContext())
diff --git a/gui/main.cpp b/gui/main.cpp
index 8033dba..6d01d49 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -66,6 +66,12 @@ int main(int argc, char **argv) {
"extension, or to control VPN by other means)."),
},
{
+ {"w", "web-api"},
+ QApplication::translate(
+ "main",
+ "Enable web api (on port 8080)."),
+ },
+ {
{"i", "install-helpers"},
QApplication::translate(
"main",
@@ -76,6 +82,7 @@ int main(int argc, char **argv) {
bool hideSystray = parser.isSet("no-systray");
bool installHelpers = parser.isSet("install-helpers");
+ bool webAPI = parser.isSet("web-api");
if (hideSystray) {
qDebug() << "Not showing systray icon because --no-systray option is set.";
@@ -132,6 +139,9 @@ int main(int argc, char **argv) {
/* let the Go side initialize its internal state */
InitializeBitmaskContext();
+ /* if requested, enable web api for controlling the VPN */
+ if (webAPI) { EnableWebAPI(); };
+
/* kick off your shoes, put your feet up */
return app.exec();
}
diff --git a/pkg/backend/api.go b/pkg/backend/api.go
index 64dac9d..f63962c 100644
--- a/pkg/backend/api.go
+++ b/pkg/backend/api.go
@@ -76,6 +76,10 @@ func EnableMockBackend() {
go enableMockBackend()
}
+func EnableWebAPI() {
+ go enableWebAPI()
+}
+
/* these two are a bit redundant since we already add them to ctx. however, we
want to have them available before everything else, to be able to parse cli
arguments. In the long run, we probably want to move all vendoring to qt, so
diff --git a/pkg/backend/webapi.go b/pkg/backend/webapi.go
new file mode 100644
index 0000000..e3918c5
--- /dev/null
+++ b/pkg/backend/webapi.go
@@ -0,0 +1,35 @@
+package backend
+
+import (
+ "fmt"
+ "log"
+ "net/http"
+)
+
+func webOn(w http.ResponseWriter, r *http.Request) {
+ log.Println("Web UI: on")
+ SwitchOn()
+}
+
+func webOff(w http.ResponseWriter, r *http.Request) {
+ log.Println("Web UI: off")
+ SwitchOff()
+}
+
+func webStatus(w http.ResponseWriter, r *http.Request) {
+ log.Println("Web UI: status")
+ fmt.Fprintf(w, ctx.Status.String())
+}
+
+func webQuit(w http.ResponseWriter, r *http.Request) {
+ log.Println("Web UI: quit")
+ Quit()
+}
+
+func enableWebAPI() {
+ http.HandleFunc("/vpn/start", webOn)
+ http.HandleFunc("/vpn/stop", webOff)
+ http.HandleFunc("/vpn/status", webStatus)
+ http.HandleFunc("/vpn/quit", webQuit)
+ http.ListenAndServe(":8080", nil)
+}