diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-10-05 09:49:44 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-10-07 09:33:53 +0200 |
commit | 88fcb5fcb1cb5f040653f67d4e0b35abab089166 (patch) | |
tree | 011ac782fd5f086cd55d1dc0ac3d42419bd9acbb /client | |
parent | ddbb42fd9be581a68d95e34c36e970564ef8ee6f (diff) |
Move AtomicWriteFile to util package
Diffstat (limited to 'client')
-rw-r--r-- | client/go/util/io.go | 16 | ||||
-rw-r--r-- | client/go/vespa/crypto.go | 32 |
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. |