diff --git a/clip/clipClearProcess.go b/clip/clipClearProcess.go index eb38394..7337574 100644 --- a/clip/clipClearProcess.go +++ b/clip/clipClearProcess.go @@ -41,7 +41,7 @@ func ClearProcess(assignedContents []byte) error { if err != nil { return errors.New("unable to read clipboard contents") } - if bytes.Equal(assignedContents, newContents) { + if bytes.Equal(assignedContents, bytes.TrimRight(newContents, "\r\n")) { if err = clearClipboard(); err != nil { return err } diff --git a/clip/copy_MAC.go b/clip/copy_MAC.go index a7cb0fd..005432a 100644 --- a/clip/copy_MAC.go +++ b/clip/copy_MAC.go @@ -7,17 +7,21 @@ import ( "os/exec" "github.com/rwinkhart/go-boilerplate/back" + "github.com/rwinkhart/go-boilerplate/security" ) // CopyBytes copies a byte slice to the clipboard. func CopyBytes(clearClipboardAutomatically bool, copySubject []byte) error { cmd := exec.Command("pbcopy") - _ = back.WriteToStdinAndZeroizeInput(cmd, copySubject) + _ = back.WriteToStdin(cmd, copySubject, false) if err := cmd.Run(); err != nil { + security.ZeroizeBytes(copySubject) return errors.New("unable to copy to clipboard: " + err.Error()) } if clearClipboardAutomatically { LaunchClearProcess(copySubject) + } else { + security.ZeroizeBytes(copySubject) } return nil } @@ -25,6 +29,6 @@ func CopyBytes(clearClipboardAutomatically bool, copySubject []byte) error { // getClipCommands returns the commands for pasting and clearing the clipboard contents. func getClipCommands() (*exec.Cmd, *exec.Cmd, error) { cmdClear := exec.Command("pbcopy") - _ = back.WriteToStdinAndZeroizeInput(cmdClear, nil) + _ = back.WriteToStdin(cmdClear, nil, false) return exec.Command("pbpaste"), cmdClear, nil } diff --git a/clip/copy_UNIX.go b/clip/copy_UNIX.go index 236bc84..c0348c7 100644 --- a/clip/copy_UNIX.go +++ b/clip/copy_UNIX.go @@ -8,6 +8,7 @@ import ( "os/exec" "github.com/rwinkhart/go-boilerplate/back" + "github.com/rwinkhart/go-boilerplate/security" ) // CopyBytes copies a byte slice to the clipboard. @@ -24,12 +25,15 @@ func CopyBytes(clearClipboardAutomatically bool, copySubject []byte) error { cmdCopy = exec.Command("xclip", "-sel", "c", "-t", "text/plain") } - _ = back.WriteToStdinAndZeroizeInput(cmdCopy, copySubject) + _ = back.WriteToStdin(cmdCopy, copySubject, false) if err = cmdCopy.Run(); err != nil { + security.ZeroizeBytes(copySubject) return errors.New("unable to copy to clipboard: " + err.Error()) } if clearClipboardAutomatically { LaunchClearProcess(copySubject) + } else { + security.ZeroizeBytes(copySubject) } return nil } diff --git a/clip/copy_WIN.go b/clip/copy_WIN.go index 2f43b51..da0c923 100644 --- a/clip/copy_WIN.go +++ b/clip/copy_WIN.go @@ -7,17 +7,21 @@ import ( "os/exec" "github.com/rwinkhart/go-boilerplate/back" + "github.com/rwinkhart/go-boilerplate/security" ) // CopyBytes copies a byte slice to the clipboard. func CopyBytes(clearClipboardAutomatically bool, copySubject []byte) error { cmd := exec.Command("clip.exe") - _ = back.WriteToStdinAndZeroizeInput(cmd, copySubject) + _ = back.WriteToStdin(cmd, copySubject, false) if err := cmd.Run(); err != nil { + security.ZeroizeBytes(copySubject) return errors.New("unable to copy to clipboard: " + err.Error()) } if clearClipboardAutomatically { LaunchClearProcess(copySubject) + } else { + security.ZeroizeBytes(copySubject) } return nil } @@ -25,6 +29,6 @@ func CopyBytes(clearClipboardAutomatically bool, copySubject []byte) error { // getClipCommands returns the commands for pasting and clearing the clipboard contents. func getClipCommands() (*exec.Cmd, *exec.Cmd, error) { clearCMD := exec.Command("clip.exe") - _ = back.WriteToStdinAndZeroizeInput(clearCMD, nil) + _ = back.WriteToStdin(clearCMD, nil, false) return exec.Command("powershell.exe", "-c", "Get-Clipboard"), clearCMD, nil } diff --git a/clip/launchClipClearProcessCLI_GENERIC.go b/clip/launchClipClearProcessCLI_GENERIC.go index 12170f9..4f40514 100644 --- a/clip/launchClipClearProcessCLI_GENERIC.go +++ b/clip/launchClipClearProcessCLI_GENERIC.go @@ -15,7 +15,7 @@ import ( func LaunchClearProcess(copySubject []byte) { cmd := exec.Command(os.Args[0], "clipclear") cmd.SysProcAttr = global.GetSysProcAttr() - _ = back.WriteToStdinAndZeroizeInput(cmd, copySubject) + _ = back.WriteToStdin(cmd, copySubject, true) _ = cmd.Start() os.Exit(0) // use os.Exit directly since this version of this function is only meant for non-interactive CLI implementations } diff --git a/crypt/rcw.go b/crypt/rcw.go index cb85709..17ae554 100644 --- a/crypt/rcw.go +++ b/crypt/rcw.go @@ -95,7 +95,7 @@ func launchRCWDProcess() []byte { cmd := exec.Command(os.Args[0], "startrcwd") cmd.SysProcAttr = global.GetSysProcAttr() - _ = back.WriteToStdinAndZeroizeInput(cmd, append([]byte{}, password...)) + _ = back.WriteToStdin(cmd, password, false) _ = cmd.Start() return password diff --git a/docs/release-notes-archive/2026.md b/docs/release-notes-archive/2026.md index 74c069f..a930856 100644 --- a/docs/release-notes-archive/2026.md +++ b/docs/release-notes-archive/2026.md @@ -45,7 +45,7 @@ This release adds password age-tracking support and features large refactors tha - gopkg.in/ini.v1 - Bumped - Go: v1.25.4 => v1.26.0 - - github.com/rwinkhart/go-boilerplate: v0.1.0 => v0.3.0 + - github.com/rwinkhart/go-boilerplate: v0.1.0 => v0.3.1 - github.com/rwinkhart/rcw: v0.2.4 => v0.3.0 - golang.org/x/crypto: v0.45.0 => v0.48.0 - github.com/rwinkhart/sys: v0.38.0 => v0.41.0 diff --git a/go.mod b/go.mod index 39b404a..5d68a00 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.0 require ( github.com/pkg/sftp v1.13.10 github.com/pquerna/otp v1.5.0 - github.com/rwinkhart/go-boilerplate v0.3.0 + github.com/rwinkhart/go-boilerplate v0.3.1 github.com/rwinkhart/rcw v0.3.0 golang.org/x/crypto v0.48.0 golang.org/x/sys v0.41.0 diff --git a/go.sum b/go.sum index 60795c0..6ca2d27 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs= github.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= -github.com/rwinkhart/go-boilerplate v0.3.0 h1:dwlm1mZya1xrATkvm2pHbTIFNb5WRjIc7A3a4Ep2aAM= -github.com/rwinkhart/go-boilerplate v0.3.0/go.mod h1:ES13A2r9fnCVfyezwMBgY/RgA4pOIudOUXz3Jk/ikes= +github.com/rwinkhart/go-boilerplate v0.3.1 h1:vkVRuptO2s1yPzzwpvtiiB0c/hPB6yr0p1mzZ2Myb9E= +github.com/rwinkhart/go-boilerplate v0.3.1/go.mod h1:ES13A2r9fnCVfyezwMBgY/RgA4pOIudOUXz3Jk/ikes= github.com/rwinkhart/go-winio v0.1.1 h1:kAJKiqneR7cUR01Wn5/doAAV4kOGTEGPug4oinXc5N4= github.com/rwinkhart/go-winio v0.1.1/go.mod h1:ZWa7ssZJT30CCDGJ7fk/2SBTq9BIQrrVjrcss0UW2s0= github.com/rwinkhart/peercred-mini v0.1.4 h1:93+phjLknvJadEd2cu/ZPPWdfRSPOwFJzDBEn4ZtWVc=