diff --git a/Makefile b/Makefile index 3b9dc9d..2a35f81 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ weave: - srcweave --formatter srcweave-format --weave docs/ ReadMe.go.md security/Authentication.md Dependencies.md + srcweave --formatter srcweave-format --weave docs/ ReadMe.md security/Authentication.md EnvironmentVariables.md Dependencies.md Server.md tangle: - srcweave --formatter srcweave-format --tangle smartkeyboard/ ReadMe.go.md security/Authentication.md EnvironmentVariables.md Dependencies.md + srcweave --formatter srcweave-format --tangle smartkeyboard/ ReadMe.md security/Authentication.md EnvironmentVariables.md Dependencies.md Server.md clean: rm -rf docs find smartkeyboard/ -type f -not -name "*_test.go" -delete @@ -9,8 +9,8 @@ clean: rm go.sum test: tangle - -go mod init voidnet.tech/m/v2 - go mod tidy - go test -v ./... + -cd smartkeyboard && go mod init keyboard.voidnet.tech + -cd smartkeyboard && go mod tidy + -cd smartkeyboard && go test -v ./... all: weave tangle \ No newline at end of file diff --git a/ReadMe.md b/ReadMe.md index 9c006af..dfbad5e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -45,20 +45,24 @@ A smart keyboard could, for example, be used for the following: First, we call +``` go + --- entrypoint func main(){ - fmt.Println("Hello, World!") + server.StartServer() } --- --- /main.go - package main - @{set network bind globals} + import( + "keyboard.voidnet.tech/server" + ) + @{entrypoint} @@ -75,4 +79,5 @@ First, we call var string tcpBindPort var bool tcpBindPortExists ---- \ No newline at end of file +--- +``` \ No newline at end of file diff --git a/Server.md b/Server.md new file mode 100644 index 0000000..13c3673 --- /dev/null +++ b/Server.md @@ -0,0 +1,103 @@ +# Keyboard socket server + +The server has two jobs, to authenticate and to accept a stream of key presses from the client. + +For efficiency and security we support use of a unix socket, but tcp can be used instead + +# Picking a socket type and setting the listener + + +``` go +--- create listener + +@{unixSocketPath} // gets unixSocketPath from environment, unixSocketPathExists defines if it exists +@{TCPBindAddress} // gets tcpBindAddress from environment, tcpBindAddressExists defines if it exists +@{TCPBindPort} // gets tcpBindPort from environment, tcpBindPortExists defines if it exists + + +if unixSocketPathExists { + listener, _ = net.Listen("unix", unixSocketPath) +} else{ + if tcpBindAddressExists && tcpBindPortExists { + listener, _ = net.Listen("tcp", tcpBindAddress + ":" + tcpBindPort) + } else { + listener, _ = net.Listen("tcp", "127.0.0.1:8080") + } + +} + +--- +``` + + +# Starting the server + +``` go +--- start websocket server + +func clientConnected(w http.ResponseWriter, r *http.Request) { + kb, err := keybd_event.NewKeyBonding() + if err != nil { + panic(err) + } + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + defer c.Close() + + for { + _, message, err := c.ReadMessage() + if err != nil { + log.Println("read:", err) + break + } + log.Printf("recv: %s", message) + message_string := string(message) + for _, char := range message_string { + // make sure that the char is a number + number, err := strconv.Atoi(string(char)) + if err == nil { + kb.SetKeys(number) + } + } + // sendkeys + //kb.SetKeys(30, 32, 33) + go kb.Launching() + } +} + +func StartServer() { + + // create http server on unix socket + @{create listener} + http.HandleFunc("/sendkeys", clientConnected) + http.Serve(listener, nil) + + +} + + +--- +``` + +--- /server/server.go +package server + +import( + "net" + "os" + "net/http" + "log" + @{gorilla/websocket import string} + @{keybd_event import string} +) + +var listener net.Listener + +var upgrader = websocket.Upgrader{} // use default options + + +@{start websocket server} +--- \ No newline at end of file