Ejemplo n.º 1
0
func SshAuthentication(details *config.ArtifactoryDetails) error {
	_, host, port, err := parseUrl(details.Url)
	if err != nil {
		return err
	}

	log.Info("Performing SSH authentication...")
	if details.SshKeyPath == "" {
		err := cliutils.CheckError(errors.New("Cannot invoke the SshAuthentication function with no SSH key path. "))
		if err != nil {
			return err
		}
	}

	buffer, err := ioutil.ReadFile(details.SshKeyPath)
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}
	key, err := ssh.ParsePrivateKey(buffer)
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}
	sshConfig := &ssh.ClientConfig{
		User: "******",
		Auth: []ssh.AuthMethod{
			ssh.PublicKeys(key),
		},
	}

	hostAndPort := host + ":" + strconv.Itoa(port)
	connection, err := ssh.Dial("tcp", hostAndPort, sshConfig)
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}
	defer connection.Close()

	session, err := connection.NewSession()
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}
	defer session.Close()

	stdout, err := session.StdoutPipe()
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}

	var buf bytes.Buffer
	go io.Copy(&buf, stdout)

	session.Run("jfrog-authenticate")

	var result SshAuthResult
	err = json.Unmarshal(buf.Bytes(), &result)
	err = cliutils.CheckError(err)
	if err != nil {
		return err
	}
	details.Url = cliutils.AddTrailingSlashIfNeeded(result.Href)
	details.SshAuthHeaders = result.Headers
	log.Info("SSH authentication successful.")
	return nil
}