126 lines
2.6 KiB
Markdown
126 lines
2.6 KiB
Markdown
# 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. In the case of TCP, the server will listen on 127.1 by default but can be configured to listen on a different address and port. In any case, it is highly recommended to run the server behind a reverse proxy supporting HTTPS such as nginx or caddy.
|
|
|
|
# Server Entrypoint
|
|
|
|
Before main execution, both the server and client check for a version command line argument. If it is present, the program will print the version and exit.
|
|
|
|
First, we make sure a token is provisioned. In the future we will use the system keyring.
|
|
|
|
Then we can start the web server and listen for websocket connections.
|
|
|
|
``` go
|
|
|
|
--- entrypoint
|
|
|
|
func main(){
|
|
@{handle version command}
|
|
tokenBase64, _ := auth.ProvisionToken()
|
|
if len(tokenBase64) > 0 {
|
|
fmt.Println("This is your authentication token, it will only be shown once: " + tokenBase64)
|
|
}
|
|
|
|
|
|
server.StartServer()
|
|
}
|
|
|
|
---
|
|
|
|
|
|
--- /server/main.go
|
|
package main
|
|
|
|
import(
|
|
"fmt"
|
|
"os"
|
|
"keyboard.voidnet.tech/server"
|
|
"keyboard.voidnet.tech/auth"
|
|
)
|
|
|
|
|
|
@{entrypoint}
|
|
|
|
---
|
|
|
|
```
|
|
|
|
|
|
# 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")
|
|
}
|
|
|
|
}
|
|
|
|
---
|
|
```
|
|
|
|
|
|
## HTTP API endpoints
|
|
|
|
|
|
|
|
``` go
|
|
--- start http server
|
|
|
|
func StartServer() {
|
|
|
|
@{create listener}
|
|
fmt.Println("Listening on", listener.Addr())
|
|
http.HandleFunc("/sendkeys", clientConnected)
|
|
//http.HandleFunc("/activewindow", )
|
|
http.Serve(listener, nil)
|
|
|
|
|
|
}
|
|
|
|
|
|
---
|
|
|
|
|
|
--- /server/server/server.go
|
|
package server
|
|
|
|
import(
|
|
"net"
|
|
"time"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"regexp"
|
|
"net/http"
|
|
"fmt"
|
|
"log"
|
|
"keyboard.voidnet.tech/auth"
|
|
@{gorilla/websocket import string}
|
|
@{keylogger import string}
|
|
)
|
|
|
|
var listener net.Listener
|
|
|
|
var upgrader = websocket.Upgrader{} // use default options
|
|
|
|
@{streaming keyboard input}
|
|
@{start http server}
|
|
|
|
---
|
|
``` |