- Parse toml configuration file, see https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication - Retro-compatible with existing AND documented routes, until after v3.41 release - Log a warning if an unprotected-by-default route is accessed unprotected - Authentication methods: none, apikey, basic - `genkey` command to generate API keys - move log middleware to internal/server/middlewares/log Co-authored-by: Joe Jose <45399349+joejose97@users.noreply.github.com>
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package cli
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"flag"
|
|
"fmt"
|
|
)
|
|
|
|
func (c *CLI) GenKey(args []string) (err error) {
|
|
flagSet := flag.NewFlagSet("genkey", flag.ExitOnError)
|
|
err = flagSet.Parse(args)
|
|
if err != nil {
|
|
return fmt.Errorf("parsing flags: %w", err)
|
|
}
|
|
|
|
const keyLength = 128 / 8
|
|
keyBytes := make([]byte, keyLength)
|
|
|
|
_, _ = rand.Read(keyBytes)
|
|
|
|
key := base58Encode(keyBytes)
|
|
fmt.Println(key)
|
|
|
|
return nil
|
|
}
|
|
|
|
func base58Encode(data []byte) string {
|
|
const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
const radix = 58
|
|
|
|
zcount := 0
|
|
for zcount < len(data) && data[zcount] == 0 {
|
|
zcount++
|
|
}
|
|
|
|
// integer simplification of ceil(log(256)/log(58))
|
|
ceilLog256Div58 := (len(data)-zcount)*555/406 + 1 //nolint:gomnd
|
|
size := zcount + ceilLog256Div58
|
|
|
|
output := make([]byte, size)
|
|
|
|
high := size - 1
|
|
for _, b := range data {
|
|
i := size - 1
|
|
for carry := uint32(b); i > high || carry != 0; i-- {
|
|
carry += 256 * uint32(output[i]) //nolint:gomnd
|
|
output[i] = byte(carry % radix)
|
|
carry /= radix
|
|
}
|
|
high = i
|
|
}
|
|
|
|
// Determine the additional "zero-gap" in the output buffer
|
|
additionalZeroGapEnd := zcount
|
|
for additionalZeroGapEnd < size && output[additionalZeroGapEnd] == 0 {
|
|
additionalZeroGapEnd++
|
|
}
|
|
|
|
val := output[additionalZeroGapEnd-zcount:]
|
|
size = len(val)
|
|
for i := range val {
|
|
output[i] = alphabet[val[i]]
|
|
}
|
|
|
|
return string(output[:size])
|
|
}
|