summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-10-05 09:49:44 +0200
committerMartin Polden <mpolden@mpolden.no>2021-10-07 09:33:53 +0200
commit88fcb5fcb1cb5f040653f67d4e0b35abab089166 (patch)
tree011ac782fd5f086cd55d1dc0ac3d42419bd9acbb /client
parentddbb42fd9be581a68d95e34c36e970564ef8ee6f (diff)
Move AtomicWriteFile to util package
Diffstat (limited to 'client')
-rw-r--r--client/go/util/io.go16
-rw-r--r--client/go/vespa/crypto.go32
2 files changed, 25 insertions, 23 deletions
diff --git a/client/go/util/io.go b/client/go/util/io.go
index e4e05d4c674..23bfec84879 100644
--- a/client/go/util/io.go
+++ b/client/go/util/io.go
@@ -50,3 +50,19 @@ func ReaderToJSON(reader io.Reader) string {
}
return prettyJSON.String()
}
+
+// AtomicWriteFile atomically writes data to filename.
+func AtomicWriteFile(filename string, data []byte) error {
+ tmpFile, err := ioutil.TempFile("", "vespa")
+ if err != nil {
+ return err
+ }
+ defer os.Remove(tmpFile.Name())
+ if _, err := tmpFile.Write(data); err != nil {
+ return err
+ }
+ if err := tmpFile.Close(); err != nil {
+ return err
+ }
+ return os.Rename(tmpFile.Name(), filename)
+}
diff --git a/client/go/vespa/crypto.go b/client/go/vespa/crypto.go
index b4a5a5b7da8..25d3a937f4b 100644
--- a/client/go/vespa/crypto.go
+++ b/client/go/vespa/crypto.go
@@ -13,21 +13,20 @@ import (
"encoding/base64"
"encoding/hex"
"encoding/pem"
- "errors"
"fmt"
"io"
"io/ioutil"
"math/big"
"net/http"
- "os"
"strings"
"time"
+
+ "github.com/vespa-engine/vespa/client/go/util"
)
const (
defaultCommonName = "cloud.vespa.example"
certificateExpiry = 3650 * 24 * time.Hour // Approximately 10 years
- tempFilePattern = "vespa"
)
// PemKeyPair represents a PEM-encoded private key and X509 certificate.
@@ -38,31 +37,18 @@ type PemKeyPair struct {
// WriteCertificateFile writes the certificate contained in this key pair to certificateFile.
func (kp *PemKeyPair) WriteCertificateFile(certificateFile string, overwrite bool) error {
- return atomicWriteFile(certificateFile, kp.Certificate, overwrite)
+ if util.PathExists(certificateFile) && !overwrite {
+ return fmt.Errorf("cannot overwrite existing file: %s", certificateFile)
+ }
+ return util.AtomicWriteFile(certificateFile, kp.Certificate)
}
// WritePrivateKeyFile writes the private key contained in this key pair to privateKeyFile.
func (kp *PemKeyPair) WritePrivateKeyFile(privateKeyFile string, overwrite bool) error {
- return atomicWriteFile(privateKeyFile, kp.PrivateKey, overwrite)
-}
-
-func atomicWriteFile(filename string, data []byte, overwrite bool) error {
- tmpFile, err := ioutil.TempFile("", tempFilePattern)
- if err != nil {
- return err
- }
- defer os.Remove(tmpFile.Name())
- if _, err := tmpFile.Write(data); err != nil {
- return err
- }
- if err := tmpFile.Close(); err != nil {
- return err
- }
- _, err = os.Stat(filename)
- if errors.Is(err, os.ErrNotExist) || overwrite {
- return os.Rename(tmpFile.Name(), filename)
+ if util.PathExists(privateKeyFile) && !overwrite {
+ return fmt.Errorf("cannot overwrite existing file: %s", privateKeyFile)
}
- return fmt.Errorf("cannot overwrite existing file: %s", filename)
+ return util.AtomicWriteFile(privateKeyFile, kp.PrivateKey)
}
// CreateKeyPair creates a key pair containing a private key and self-signed X509 certificate.