svn commit: r466368 - in head/sysutils/docker: . files

Nikolai Lifanov lifanov at FreeBSD.org
Tue Apr 3 18:46:53 UTC 2018


Author: lifanov
Date: Tue Apr  3 18:46:51 2018
New Revision: 466368
URL: https://svnweb.freebsd.org/changeset/ports/466368

Log:
  update sysutils/docker to 18.03.0
  
  This also switches patches that only add files to adding files.

Added:
  head/sysutils/docker/files/default_store_freebsd.go   (contents, props changed)
  head/sysutils/docker/files/pass_freebsd.go   (contents, props changed)
Deleted:
  head/sysutils/docker/files/patch-components_cli_cli_config_credentials_default__store__freebsd.go
  head/sysutils/docker/files/patch-components_cli_vendor_github.com_docker_docker-credential-helpers_pass_pass__freebsd.go
Modified:
  head/sysutils/docker/Makefile
  head/sysutils/docker/distinfo

Modified: head/sysutils/docker/Makefile
==============================================================================
--- head/sysutils/docker/Makefile	Tue Apr  3 18:23:54 2018	(r466367)
+++ head/sysutils/docker/Makefile	Tue Apr  3 18:46:51 2018	(r466368)
@@ -2,7 +2,7 @@
 # $FreeBSD$
 
 PORTNAME=		docker
-PORTVERSION=		17.12.0
+PORTVERSION=		18.03.0
 DISTVERSIONPREFIX=	v
 DISTVERSIONSUFFIX=	-ce
 CATEGORIES=		sysutils
@@ -24,5 +24,9 @@ GO_TARGET=	${GO_PKGNAME}/cli/cmd/docker
 
 pre-build:
 		@${MV} ${GO_WRKSRC}/components/* ${GO_WRKSRC}/
+		@${CP} ${FILESDIR}/default_store_freebsd.go \
+			${GO_WRKSRC}/cli/cli/config/credentials/
+		@${CP} ${FILESDIR}/pass_freebsd.go \
+			${GO_WRKSRC}/cli/vendor/github.com/docker/docker-credential-helpers/pass/
 
 .include <bsd.port.mk>

Modified: head/sysutils/docker/distinfo
==============================================================================
--- head/sysutils/docker/distinfo	Tue Apr  3 18:23:54 2018	(r466367)
+++ head/sysutils/docker/distinfo	Tue Apr  3 18:46:51 2018	(r466368)
@@ -1,3 +1,3 @@
-TIMESTAMP = 1515075041
-SHA256 (docker-docker-ce-v17.12.0-ce_GH0.tar.gz) = 1303483c878ded1c0e19f323f04316cef6d4c0c895f85c412af6468647d18ef9
-SIZE (docker-docker-ce-v17.12.0-ce_GH0.tar.gz) = 11008332
+TIMESTAMP = 1522780844
+SHA256 (docker-docker-ce-v18.03.0-ce_GH0.tar.gz) = 07651973b4a4adac86599b5c1abc9b1c82aa143ac18205ff399afa814d403280
+SIZE (docker-docker-ce-v18.03.0-ce_GH0.tar.gz) = 12751925

Added: head/sysutils/docker/files/default_store_freebsd.go
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/docker/files/default_store_freebsd.go	Tue Apr  3 18:46:51 2018	(r466368)
@@ -0,0 +1,13 @@
+package credentials
+
+import (
+	"github.com/docker/docker-credential-helpers/pass"
+)
+
+func defaultCredentialsStore() string {
+	if pass.PassInitialized {
+		return "pass"
+	}
+
+	return "secretservice"
+}

Added: head/sysutils/docker/files/pass_freebsd.go
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/docker/files/pass_freebsd.go	Tue Apr  3 18:46:51 2018	(r466368)
@@ -0,0 +1,204 @@
+package pass
+
+import (
+	"encoding/base64"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"os/exec"
+	"path"
+	"strings"
+
+	"github.com/docker/docker-credential-helpers/credentials"
+)
+
+const PASS_FOLDER = "docker-credential-helpers"
+
+var (
+	PassInitialized bool
+)
+
+func init() {
+	PassInitialized = exec.Command("pass").Run() == nil
+}
+
+func runPass(stdinContent string, args ...string) (string, error) {
+	cmd := exec.Command("pass", args...)
+
+	stdin, err := cmd.StdinPipe()
+	if err != nil {
+		return "", err
+	}
+	defer stdin.Close()
+
+	stderr, err := cmd.StderrPipe()
+	if err != nil {
+		return "", err
+	}
+	defer stderr.Close()
+
+	stdout, err := cmd.StdoutPipe()
+	if err != nil {
+		return "", err
+	}
+	defer stdout.Close()
+
+	err = cmd.Start()
+	if err != nil {
+		return "", err
+	}
+
+	_, err = stdin.Write([]byte(stdinContent))
+	if err != nil {
+		return "", err
+	}
+	stdin.Close()
+
+	errContent, err := ioutil.ReadAll(stderr)
+	if err != nil {
+		return "", fmt.Errorf("error reading stderr: %s", err)
+	}
+
+	result, err := ioutil.ReadAll(stdout)
+	if err != nil {
+		return "", fmt.Errorf("Error reading stdout: %s", err)
+	}
+
+	cmdErr := cmd.Wait()
+	if cmdErr != nil {
+		return "", fmt.Errorf("%s: %s", cmdErr, errContent)
+	}
+
+	return string(result), nil
+}
+
+// Pass handles secrets using Linux secret-service as a store.
+type Pass struct{}
+
+// Add adds new credentials to the keychain.
+func (h Pass) Add(creds *credentials.Credentials) error {
+	if !PassInitialized {
+		return errors.New("pass store is uninitialized")
+	}
+
+	if creds == nil {
+		return errors.New("missing credentials")
+	}
+
+	encoded := base64.URLEncoding.EncodeToString([]byte(creds.ServerURL))
+
+	_, err := runPass(creds.Secret, "insert", "-f", "-m", path.Join(PASS_FOLDER, encoded, creds.Username))
+	return err
+}
+
+// Delete removes credentials from the store.
+func (h Pass) Delete(serverURL string) error {
+	if !PassInitialized {
+		return errors.New("pass store is uninitialized")
+	}
+
+	if serverURL == "" {
+		return errors.New("missing server url")
+	}
+
+	encoded := base64.URLEncoding.EncodeToString([]byte(serverURL))
+	_, err := runPass("", "rm", "-rf", path.Join(PASS_FOLDER, encoded))
+	return err
+}
+
+// listPassDir lists all the contents of a directory in the password store.
+// Pass uses fancy unicode to emit stuff to stdout, so rather than try
+// and parse this, let's just look at the directory structure instead.
+func listPassDir(args ...string) ([]os.FileInfo, error) {
+	passDir := os.ExpandEnv("$HOME/.password-store")
+	for _, e := range os.Environ() {
+		parts := strings.SplitN(e, "=", 2)
+		if len(parts) < 2 {
+			continue
+		}
+
+		if parts[0] != "PASSWORD_STORE_DIR" {
+			continue
+		}
+
+		passDir = parts[1]
+		break
+	}
+
+	p := path.Join(append([]string{passDir, PASS_FOLDER}, args...)...)
+	contents, err := ioutil.ReadDir(p)
+	if err != nil {
+		if os.IsNotExist(err) {
+			return []os.FileInfo{}, nil
+		}
+
+		return nil, err
+	}
+
+	return contents, nil
+}
+
+// Get returns the username and secret to use for a given registry server URL.
+func (h Pass) Get(serverURL string) (string, string, error) {
+	if !PassInitialized {
+		return "", "", errors.New("pass store is uninitialized")
+	}
+
+	if serverURL == "" {
+		return "", "", errors.New("missing server url")
+	}
+
+	encoded := base64.URLEncoding.EncodeToString([]byte(serverURL))
+
+	usernames, err := listPassDir(encoded)
+	if err != nil {
+		return "", "", err
+	}
+
+	if len(usernames) < 1 {
+		return "", "", fmt.Errorf("no usernames for %s", serverURL)
+	}
+
+	actual := strings.TrimSuffix(usernames[0].Name(), ".gpg")
+	secret, err := runPass("", "show", path.Join(PASS_FOLDER, encoded, actual))
+	return actual, secret, err
+}
+
+// List returns the stored URLs and corresponding usernames for a given credentials label
+func (h Pass) List() (map[string]string, error) {
+	if !PassInitialized {
+		return nil, errors.New("pass store is uninitialized")
+	}
+
+	servers, err := listPassDir()
+	if err != nil {
+		return nil, err
+	}
+
+	resp := map[string]string{}
+
+	for _, server := range servers {
+		if !server.IsDir() {
+			continue
+		}
+
+		serverURL, err := base64.URLEncoding.DecodeString(server.Name())
+		if err != nil {
+			return nil, err
+		}
+
+		usernames, err := listPassDir(server.Name())
+		if err != nil {
+			return nil, err
+		}
+
+		if len(usernames) < 1 {
+			return nil, fmt.Errorf("no usernames for %s", serverURL)
+		}
+
+		resp[string(serverURL)] = strings.TrimSuffix(usernames[0].Name(), ".gpg")
+	}
+
+	return resp, nil
+}


More information about the svn-ports-head mailing list