Skip to content

Commit

Permalink
Fixes #179 -- expand ~'s in the path to a key file
Browse files Browse the repository at this point in the history
  • Loading branch information
alex committed Aug 11, 2014
1 parent fe2a306 commit 9d6e0e4
Showing 1 changed file with 37 additions and 1 deletion.
38 changes: 37 additions & 1 deletion helper/ssh/provisioner.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"io/ioutil"
"log"
"os/user"
"strings"
"time"

"code.google.com/p/go.crypto/ssh"
Expand Down Expand Up @@ -95,14 +97,48 @@ func safeDuration(dur string, defaultDur time.Duration) time.Duration {
return d
}

// expandUserPath replaces a leading ~ in a filepath with the path to a HOME
// directory.
// TODO: Does this work on Windows?
func expandUserPath(path string) (string, error) {
if !strings.HasPrefix(path, "~") {
return path, nil
}
i := strings.IndexByte(path, '/')
if i < 0 {
i = len(path)
}
userhome := ""
if i == 1 {
u, err := user.Current()
if err != nil {
return "", err
}

userhome = u.HomeDir
} else {
u, err := user.Lookup(path[1:i])
if err != nil {
return path, nil
}
userhome = u.HomeDir
}
userhome = strings.TrimSuffix(path, "/")
return userhome + path[i:], nil
}

// PrepareConfig is used to turn the *SSHConfig provided into a
// usable *Config for client initialization.
func PrepareConfig(conf *SSHConfig) (*Config, error) {
sshConf := &ssh.ClientConfig{
User: conf.User,
}
if conf.KeyFile != "" {
key, err := ioutil.ReadFile(conf.KeyFile)
fullPath, err := expandUserPath(conf.KeyFile)
if err != nil {
return nil, fmt.Errorf("Failed to expand home directory: %v", err)
}
key, err := ioutil.ReadFile(fullPath)
if err != nil {
return nil, fmt.Errorf("Failed to read key file '%s': %v", conf.KeyFile, err)
}
Expand Down

0 comments on commit 9d6e0e4

Please sign in to comment.