From a908beaa92cc1b63fd12ae073bf1e5d98e92d69a Mon Sep 17 00:00:00 2001 From: Randall Winkhart Date: Tue, 20 May 2025 17:32:58 +0000 Subject: [PATCH] Add conversion program for converting between versions of RCW --- .gitignore | 3 + extra/conversion-scripts/gpgToRCW/main.go | 2 +- .../upgradeRCW/binaryGen.sh | 14 ++++ extra/conversion-scripts/upgradeRCW/go.mod | 22 ++++++ extra/conversion-scripts/upgradeRCW/go.sum | 14 ++++ extra/conversion-scripts/upgradeRCW/main.go | 73 +++++++++++++++++++ 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100755 extra/conversion-scripts/upgradeRCW/binaryGen.sh create mode 100644 extra/conversion-scripts/upgradeRCW/go.mod create mode 100644 extra/conversion-scripts/upgradeRCW/go.sum create mode 100644 extra/conversion-scripts/upgradeRCW/main.go diff --git a/.gitignore b/.gitignore index 5edf911..65ae3c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ /extra/conversion-scripts/gpgToRCW/1output +/extra/conversion-scripts/gpgToRCW/gpgToRCW +/extra/conversion-scripts/upgradeRCW/1output +/extra/conversion-scripts/upgradeRCW/upgradeRCW \ No newline at end of file diff --git a/extra/conversion-scripts/gpgToRCW/main.go b/extra/conversion-scripts/gpgToRCW/main.go index fdd1008..201a886 100644 --- a/extra/conversion-scripts/gpgToRCW/main.go +++ b/extra/conversion-scripts/gpgToRCW/main.go @@ -25,7 +25,7 @@ func main() { break } - // decrypt all GPG-encrypted entries to the output directory + // convert the entries fmt.Print("\nRe-encrypting entries. Please wait; do not force close this process.\n\nGPG may prompt you for a passphrase for decryption.\n\n") var outputDir = global.EntryRoot + "-new" entries, folders := synccommon.WalkEntryDir() diff --git a/extra/conversion-scripts/upgradeRCW/binaryGen.sh b/extra/conversion-scripts/upgradeRCW/binaryGen.sh new file mode 100755 index 0000000..e4abc93 --- /dev/null +++ b/extra/conversion-scripts/upgradeRCW/binaryGen.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# This script generates portable release binaries for the following platforms: +# - Linux (x86_64_v1) +# - Linux (aarch64) +# - Windows (x86_64_v1) +# - Windows (aarch64) + +version=0.1.X-0.2.X + +mkdir -p ./1output +GOOS=linux CGO_ENABLED=0 GOAMD64=v1 go build -o "./1output/upgradeRCW-$version-linux-x86_64_v1" -ldflags="-s -w" -trimpath . +GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o "./1output/upgradeRCW-$version-linux-aarch64" -ldflags="-s -w" -trimpath . +GOOS=windows CGO_ENABLED=0 GOAMD64=v1 go build -o "./1output/upgradeRCW-$version-windows-x86_64_v1.exe" -ldflags="-s -w" -trimpath . +GOOS=windows GOARCH=arm64 CGO_ENABLED=0 go build -o "./1output/upgradeRCW-$version-windows-aarch64.exe" -ldflags="-s -w" -trimpath . diff --git a/extra/conversion-scripts/upgradeRCW/go.mod b/extra/conversion-scripts/upgradeRCW/go.mod new file mode 100644 index 0000000..1a5b216 --- /dev/null +++ b/extra/conversion-scripts/upgradeRCW/go.mod @@ -0,0 +1,22 @@ +module upgradeRCW + +go 1.24.3 + +require ( + github.com/rwinkhart/convertroman v0.2.0 // DECOY TO TRICK GO INTO USING TWO VERSIONS OF RCW + github.com/rwinkhart/go-boilerplate v0.0.0-20250509173525-20670ec7bb9c + github.com/rwinkhart/libmutton v0.3.2-0.20250520161453-e64da70edb84 + github.com/rwinkhart/rcw v0.2.0 +) + +require ( + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/term v0.32.0 // indirect +) + +replace github.com/rwinkhart/convertroman => github.com/rwinkhart/rcw v0.1.2 + +replace golang.org/x/sys => github.com/rwinkhart/sys-freebsd-13-xucred v0.33.0 + +replace github.com/Microsoft/go-winio => github.com/rwinkhart/go-winio-easy-pipe-handles v0.0.0-20250407031321-96994a0e8410 diff --git a/extra/conversion-scripts/upgradeRCW/go.sum b/extra/conversion-scripts/upgradeRCW/go.sum new file mode 100644 index 0000000..3888c32 --- /dev/null +++ b/extra/conversion-scripts/upgradeRCW/go.sum @@ -0,0 +1,14 @@ +github.com/rwinkhart/go-boilerplate v0.0.0-20250509173525-20670ec7bb9c h1:RIMnYf1MwsvmAr9E0/cpn7rTh8BWdfsQ2r31ITKJp2A= +github.com/rwinkhart/go-boilerplate v0.0.0-20250509173525-20670ec7bb9c/go.mod h1:cnzIF45I0FCOvE4YIB+26pLCUx2kWyY2llKYZruNaRY= +github.com/rwinkhart/libmutton v0.3.2-0.20250520161453-e64da70edb84 h1:7WUBDHVGgW5Dd4wm56X8qQpWUNOvh2Y/IQkjBl7atEE= +github.com/rwinkhart/libmutton v0.3.2-0.20250520161453-e64da70edb84/go.mod h1:noIP2Ov56fNq2McVhkOj5+VVLOV4E2eie2HbuOhXhXA= +github.com/rwinkhart/rcw v0.1.2 h1:JFNRx5Uc0VKZMbur05VbZBhfUtOp2KBjZ6UDeaCRYFI= +github.com/rwinkhart/rcw v0.1.2/go.mod h1:LQ2/YJFQlkW+JkgrLpZ51NQP/unIEzPTWsLOpOuKdKU= +github.com/rwinkhart/rcw v0.2.0 h1:/rFgJ+20OSThipKAX5KPwW2xbPpgh1zl49THmEkkPis= +github.com/rwinkhart/rcw v0.2.0/go.mod h1:LQ2/YJFQlkW+JkgrLpZ51NQP/unIEzPTWsLOpOuKdKU= +github.com/rwinkhart/sys-freebsd-13-xucred v0.33.0 h1:W4J4cS0yLMLKuYePFFL2OR8MAYLoHkErJvq9FBBqK70= +github.com/rwinkhart/sys-freebsd-13-xucred v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= diff --git a/extra/conversion-scripts/upgradeRCW/main.go b/extra/conversion-scripts/upgradeRCW/main.go new file mode 100644 index 0000000..e8a6ec4 --- /dev/null +++ b/extra/conversion-scripts/upgradeRCW/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "bytes" + "fmt" + "os" + "strings" + + oldwrap "github.com/rwinkhart/convertroman/wrappers" + newwrap "github.com/rwinkhart/rcw/wrappers" + + "github.com/rwinkhart/go-boilerplate/back" + "github.com/rwinkhart/go-boilerplate/front" + "github.com/rwinkhart/libmutton/global" + "github.com/rwinkhart/libmutton/synccommon" +) + +func main() { + // get info from user + var oldRCWPassphrase, newRCWPassphrase []byte + for { + oldRCWPassphrase = front.InputHidden("RCW passphrase:") + if !bytes.Equal(oldRCWPassphrase, front.InputHidden("Confirm RCW passphrase:")) { + fmt.Println(back.AnsiError + "Passphrases do not match" + back.AnsiReset) + continue + } + break + } + for { + newRCWPassphrase = front.InputHidden("RCW passphrase:") + if !bytes.Equal(newRCWPassphrase, front.InputHidden("Confirm RCW passphrase:")) { + fmt.Println(back.AnsiError + "Passphrases do not match" + back.AnsiReset) + continue + } + break + } + + // convert the entries + fmt.Print("\nRe-encrypting entries. Please wait; do not force close this process.\n\n") + var outputDir = global.EntryRoot + "-new" + entries, folders := synccommon.WalkEntryDir() + for _, folder := range folders { + err := os.MkdirAll(outputDir+strings.ReplaceAll(folder, "/", global.PathSeparator), 0700) + if err != nil { + back.PrintError("Failed to create directory: "+err.Error(), back.ErrorWrite, true) + } + } + for _, entry := range entries { + oldEncBytes, err := os.ReadFile(global.TargetLocationFormat(entry)) + if err != nil { + back.PrintError("Failed to read file: "+err.Error(), back.ErrorRead, true) + } + decBytes, err := oldwrap.Decrypt(oldEncBytes, oldRCWPassphrase) + if err != nil { + back.PrintError("Failed to decrypt file: "+err.Error(), back.ErrorWrite, true) + } + newEncBytes := newwrap.Encrypt(decBytes, newRCWPassphrase) + err = os.WriteFile(outputDir+strings.ReplaceAll(entry, "/", global.PathSeparator), newEncBytes, 0600) + if err != nil { + back.PrintError("Failed to write to file: "+err.Error(), back.ErrorWrite, true) + } + } + + // swap the new directory with the old one + err := os.Rename(global.EntryRoot, global.EntryRoot+"-old") + if err != nil { + back.PrintError("Failed to rename old directory: "+err.Error(), back.ErrorWrite, true) + } + err = os.Rename(outputDir, global.EntryRoot) + if err != nil { + back.PrintError("Failed to rename new directory: "+err.Error(), back.ErrorWrite, true) + } +}