gosmartkeyboard/Server.md

2.3 KiB

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

--- 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

--- start websocket server

func clientConnected(w http.ResponseWriter, r *http.Request) {
	keyboard, err := sendkeys.NewKBWrapWithOptions(sendkeys.Noisy)
	if err != nil {
		panic(err)
	}
	c, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Print("upgrade:", err)
		return
	}
	defer c.Close()

	// get auth token
	_, message, err := c.ReadMessage()
	if err != nil {
		log.Println("read:", err)
		return
	}

	if auth.CheckAuthToken(string(message)) != nil {
		log.Println("invalid token")
		return
	}
	c.WriteMessage(websocket.TextMessage, []byte("authenticated"))


	for {
		time.Sleep(25 * time.Millisecond)
		_, message, err := c.ReadMessage()
		if err != nil {
			log.Println("read:", err)
			break
		}
		log.Printf("recv: %s", message)
		message_string := string(message)
		err = keyboard.Type(message_string)
		if err != nil {
			log.Println("type:", err)
			break
		}
	}
}

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"
	"time"
    "os"
    "net/http"
    "log"
	"keyboard.voidnet.tech/auth"
    @{gorilla/websocket import string}
    @{sendkeys import string}
)

var listener net.Listener

var upgrader = websocket.Upgrader{} // use default options


@{start websocket server}
---