111 lines
3.4 KiB
Markdown
111 lines
3.4 KiB
Markdown
# GoSmartKeyboard
|
|
|
|
|
|
Copyright [Kevin Froman](https://chaoswebs.net/) [Licensed under GPLv3](LICENSE.md)
|
|
|
|
Work in progress
|
|
|
|
# Introduction
|
|
|
|
GoSmartKeyboard is a daemon that allows you to have a more powerful keyboarding experience. It can be used with a secondary device, such as an Android phone or a raspberry pi, or it can run locally. A seperate client binary is provided that reads from a FIFO (named pipe) and sends the data to the server. This allows you to use any program that can write to a FIFO as a source of keyboard input.
|
|
|
|
|
|
This is done with a simple websocket server meant to accept a single connection, authenticate it, and stream UTF16 characters and send them as key strokes into the window manager. **With a simple daemon like this we can enhance keyboarding with inteligent features.**
|
|
|
|
Be careful with online games, as they may interpret the keystrokes as cheating. I assume if you don't send keystrokes or more accurately than a human you should be fine, but don't blame the software if you get banned.
|
|
|
|
|
|
**See [Building.md](Building.md) for instructions on how to build this [literate](https://en.wikipedia.org/wiki/Literate_programming) project.**
|
|
|
|
|
|
## What can you do with it?
|
|
|
|
Examples of what you can do:
|
|
|
|
* Run dictation software on a separate device
|
|
* Typical macros
|
|
* Buffer typed text before sending it to the server, preventing invalid commands or input.
|
|
* Clever CLI tricks, think `vim` or `cowsay` on your keyboard!
|
|
* Isolated password manager
|
|
* One Time Passwords
|
|
* Virtual keyboard switch (keyboard multiplexer)
|
|
* Typing things into VMS, or transfering text based files to VMs/servers.
|
|
* Text storage, such as configuration or SSH pubkeys
|
|
* On-the-fly spell checking or translation
|
|
* On-the-fly encryption (ex: PGP sign every message you type), isolated from the perhaps untrusted computer
|
|
* Easy layout configuration
|
|
* Delay keystrokes by a few dozen or so milliseconds to reduce [key stroke timing biometrics](https://en.wikipedia.org/wiki/Keystroke_dynamics)
|
|
|
|
|
|
|
|
Some points about the design of this project:
|
|
|
|
* Written in go with the [literate](https://en.wikipedia.org/wiki/Literate_programming) tool [srcweave](https://github.com/justinmeiners/srcweave), so this
|
|
markdown book is actually the source code
|
|
* KISS principle above All
|
|
* Small and light core
|
|
* No dependencies for the core and most features
|
|
* Features (such as described in above section) are implementend as seperate programs, unix style
|
|
* Simple [threat model](ThreatModel.md)
|
|
|
|
|
|
# Running
|
|
|
|
## Server
|
|
|
|
`sudo KEYBOARD_TCP_BIND_ADDRESS=0.0 KEYBOARD_TCP_BIND_PORT=8080 ./keyboard`
|
|
|
|
|
|
# Server Entrypoint
|
|
|
|
|
|
|
|
Right out of the gate, 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(){
|
|
|
|
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"
|
|
"keyboard.voidnet.tech/server"
|
|
"keyboard.voidnet.tech/auth"
|
|
)
|
|
|
|
|
|
@{entrypoint}
|
|
|
|
---
|
|
|
|
|
|
|
|
--- set network bind globals
|
|
|
|
var string unixSocketPath
|
|
var bool unixSocketPathExists
|
|
var string tcpBindAddress
|
|
var bool tcpBindAddressExists
|
|
var string tcpBindPort
|
|
var bool tcpBindPortExists
|
|
|
|
---
|
|
``` |