Add conversion program for converting between versions of RCW

This commit is contained in:
2025-05-20 17:32:58 +00:00
parent e40dd66d38
commit a908beaa92
6 changed files with 127 additions and 1 deletions
+1 -1
View File
@@ -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()
+14
View File
@@ -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 .
@@ -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
@@ -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=
@@ -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)
}
}