From 4368b7cd6ab81e6f98e167dfd86d0574d0eade7b Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Wed, 21 Jan 2026 19:05:36 -0800 Subject: XML!!! --- default.nix | 2 +- go.mod | 1 - go.sum | 4 ---- internal/config/config.go | 7 ------ roseh.moe.go | 57 ++++++++++++++++++++++++++++++----------------- tools/auth/auth.go | 18 ++++++++++----- 6 files changed, 49 insertions(+), 40 deletions(-) delete mode 100644 internal/config/config.go diff --git a/default.nix b/default.nix index 269e821..fd2f57f 100644 --- a/default.nix +++ b/default.nix @@ -16,5 +16,5 @@ pkgs.buildGoModule rec { # remember to bump this hash when your dependencies change. # vendorHash = pkgs.lib.fakeHash; - vendorHash = "sha256-J5cVBGeQ7lLVd4KMkbwDdpnCckW/t9m1Y2V9Y5PjEIs="; + vendorHash = "sha256-zt1Q33F6/XuKdfRX8lB/8IukH21WFuuzCMbIDR5TEE4="; } diff --git a/go.mod b/go.mod index f41972f..989a4e7 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.25 require ( github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e golang.org/x/term v0.38.0 - roseh.moe/pkg/ccl v1.0.1 roseh.moe/pkg/oae2 v0.1.0 roseh.moe/pkg/wordlist v1.0.2 ) diff --git a/go.sum b/go.sum index f7204d2..df26c37 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,9 @@ -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= -roseh.moe/pkg/ccl v1.0.1 h1:jD8d45xlyB3OphhSI9qoMvKAohyQ2Xtq52NPOnqBWtE= -roseh.moe/pkg/ccl v1.0.1/go.mod h1:OCcZ30pQDtjXgqgpN8eLo6f/pTi6XVKIHPs1k+gups0= roseh.moe/pkg/oae2 v0.1.0 h1:mGkGIHErlnykRZZ1dvHd73/gVjPudIEoXxdJ133GKeM= roseh.moe/pkg/oae2 v0.1.0/go.mod h1:SZ5K2nvKreVdhHVNxujxcZLOnjhVi+qPi2XkB18dR8g= roseh.moe/pkg/wordlist v1.0.2 h1:riB2RqCU5zXfCQjaPHYTXV/688FV9/Bp6Hnb0IAkP9c= diff --git a/internal/config/config.go b/internal/config/config.go deleted file mode 100644 index d404e12..0000000 --- a/internal/config/config.go +++ /dev/null @@ -1,7 +0,0 @@ -package config - -type SecretsConfig struct { - NotepadPassword []byte - SecretKey []byte - AuthKey []byte -} diff --git a/roseh.moe.go b/roseh.moe.go index b134de0..a1a6d18 100644 --- a/roseh.moe.go +++ b/roseh.moe.go @@ -10,6 +10,7 @@ import ( "embed" "encoding/base64" "encoding/binary" + "encoding/xml" "errors" "flag" "fmt" @@ -28,9 +29,7 @@ import ( "time" "github.com/skip2/go-qrcode" - "roseh.moe/pkg/ccl" "roseh.moe/pkg/oae2" - "roseh.moe/pkg/roseh.moe/internal/config" "roseh.moe/pkg/roseh.moe/internal/pwhash" "roseh.moe/pkg/wordlist" ) @@ -39,8 +38,8 @@ var ( port = flag.Int("port", 42069, "port to listen on") selfURL = flag.String("self-url", "http://localhost:42069", "base URL of the server") domain = flag.String("domain", "", "domain for auth cookie") - secretsFile = flag.String("secrets", "secrets.ccl", "secrets file") - configFile = flag.String("config", "config.ccl", "configuration file (ccl format https://pkg.go.dev/roseh.moe/pkg/ccl)") + secretsFile = flag.String("secrets", "secrets.xml", "secrets file") + configFile = flag.String("config", "config.xml", "configuration file (XML, baby!!)") https = flag.String("https", "", "directory containing cert.pem and key.pem, or empty string to use unencrypted http") holeTempDir = flag.String("hole-temp-dir", "hole", "directory to store temporary files for the wormhole") @@ -54,22 +53,32 @@ func loadSecrets() error { if err != nil { return err } - var secretsConfig config.SecretsConfig - if err := ccl.Unmarshal(fileBytes, &secretsConfig); err != nil { + var secretsConfig struct { + NotepadPassword string `xml:",attr"` + SecretKey string `xml:",attr"` + AuthKey string `xml:",attr"` + } + if err := xml.Unmarshal(fileBytes, &secretsConfig); err != nil { return fmt.Errorf("%s: %s", *secretsFile, err) } - if len(secretsConfig.NotepadPassword) == 0 { + if secretsConfig.NotepadPassword == "" { return fmt.Errorf("%s: missing NotepadPassword", *secretsFile) } - if len(secretsConfig.SecretKey) == 0 { + if secretsConfig.SecretKey == "" { return fmt.Errorf("%s: missing SecretKey", *secretsFile) } - if len(secretsConfig.AuthKey) == 0 { + if secretsConfig.AuthKey == "" { return fmt.Errorf("%s: missing AuthKey", *secretsFile) } - notepadPassword = secretsConfig.NotepadPassword - secretKey = secretsConfig.SecretKey - authenticatorKey = secretsConfig.AuthKey + if notepadPassword, err = base64.StdEncoding.DecodeString(secretsConfig.NotepadPassword); err != nil { + return fmt.Errorf("%s: bad NotepadPassword (try base64)", *secretsFile) + } + if secretKey, err = base64.StdEncoding.DecodeString(secretsConfig.SecretKey); err != nil { + return fmt.Errorf("%s: bad SecretKey (try base64)", *secretsFile) + } + if authenticatorKey, err = base64.StdEncoding.DecodeString(secretsConfig.AuthKey); err != nil { + return fmt.Errorf("%s: bad AuthKey (try base64)", *secretsFile) + } return nil } @@ -103,21 +112,27 @@ func loadConfig() (*serviceConfiguration, error) { return nil, err } var fileConfig struct { - Redirect []struct{ Package, Command, To string } - } - if err := ccl.Unmarshal(fileBytes, &fileConfig); err != nil { + Package []struct { + Name string `xml:",attr"` + URL string `xml:",attr"` + } `xml:"Redirects>Package"` + Command []struct { + Name string `xml:",attr"` + URL string `xml:",attr"` + } `xml:"Redirects>Command"` + } + if err := xml.Unmarshal(fileBytes, &fileConfig); err != nil { return nil, err } config := &serviceConfiguration{ packageRedirects: make(map[string]string), commandRedirects: make(map[string]string), } - for _, redirect := range fileConfig.Redirect { - if redirect.Package != "" { - config.packageRedirects[redirect.Package] = redirect.To - } else { - config.commandRedirects[redirect.Command] = redirect.To - } + for _, pkg := range fileConfig.Package { + config.packageRedirects[pkg.Name] = pkg.URL + } + for _, cmd := range fileConfig.Command { + config.commandRedirects[cmd.Name] = cmd.URL } serviceConfigMu.Lock() serviceConfig = config diff --git a/tools/auth/auth.go b/tools/auth/auth.go index 3c4f063..9b80389 100644 --- a/tools/auth/auth.go +++ b/tools/auth/auth.go @@ -2,13 +2,13 @@ package main import ( "encoding/base32" + "encoding/base64" + "encoding/xml" "flag" "fmt" "os" "github.com/skip2/go-qrcode" - "roseh.moe/pkg/ccl" - "roseh.moe/pkg/roseh.moe/internal/config" ) func run() error { @@ -20,14 +20,20 @@ func run() error { if err != nil { return err } - var config config.SecretsConfig - if err := ccl.Unmarshal(fileBytes, &config); err != nil { + var config struct { + AuthKey string `xml:",attr"` + } + if err := xml.Unmarshal(fileBytes, &config); err != nil { return err } - if len(config.AuthKey) == 0 { + if config.AuthKey == "" { return fmt.Errorf("%s: missing AuthKey", args[0]) } - qrCode, err := qrcode.New(fmt.Sprintf("otpauth://totp/roseh.moe:rose?secret=%s&issuer=roseh.moe", base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(config.AuthKey)), qrcode.Medium) + authKey, err := base64.StdEncoding.DecodeString(config.AuthKey) + if err != nil { + return err + } + qrCode, err := qrcode.New(fmt.Sprintf("otpauth://totp/roseh.moe:rose?secret=%s&issuer=roseh.moe", base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(authKey)), qrcode.Medium) if err != nil { return err } -- cgit v1.3.1