mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
remove ccirrelo/supervisor, update
everything seems to work even though sirupsen is upper case? :cyfap:
This commit is contained in:
2
vendor/github.com/docker/docker-credential-helpers/.gitignore
generated
vendored
2
vendor/github.com/docker/docker-credential-helpers/.gitignore
generated
vendored
@@ -1,2 +0,0 @@
|
||||
bin
|
||||
release
|
||||
49
vendor/github.com/docker/docker-credential-helpers/.travis.yml
generated
vendored
49
vendor/github.com/docker/docker-credential-helpers/.travis.yml
generated
vendored
@@ -1,49 +0,0 @@
|
||||
---
|
||||
# See appveyor.yml for windows build.
|
||||
sudo: required
|
||||
language: go
|
||||
dist: trusty
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
notifications:
|
||||
email: false
|
||||
go:
|
||||
- 1.8
|
||||
install: make deps
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libsecret-1-dev
|
||||
- pass
|
||||
before_script:
|
||||
- "export DISPLAY=:99.0"
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sh ci/before_script_linux.sh; fi
|
||||
- make validate
|
||||
script: make test
|
||||
|
||||
before_deploy:
|
||||
- sh ci/before_deploy.sh
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: "cGs5cao/MeVQVnum+Pr/Tpv+w83NsqGVS3wxvi3LYEf2ON4Kkmtd+Alwi0YFkGPJmSY0jZOct8NVK/M70qSnIU4l+AAq9+3KSMv23u4xrmy2sQog3AF+Ve3Rac+iYwZHOWwGs9I67CSuVv0vjJNVsDsTVefc25lHJImjRvXIS4p9xYzRPeUDCoqAo/QMVE+vFiMyxydsvt8fhd0gZCjPYWEpyHe9tjZ1tr1HsHZKFAjVb6AmF45d8rvadPoVUuLaOtr35wDC3XRKEvCZUefQpwLkrNj7j2L1rVGlY1xTE2APpLtvfd7R1Mx6kSfS1Gm3Pwcv3mugadXIhecL0lsdnU+BANjX3VUiv4ryzTPbsge966mv9ZQYwAzgCQTWRtMNJqsAnPZTeAkiOntd+HMQbPpxljOxv1sjDPY+EIZesyB3yQRJI8vMxqFcAjxeRyLcBqEnRFC2nd/Ln0KZ7ZFu16FcpNqRojdBayyypuXKqAiBNwtp4ti/65x8eHfBJuNjJtNZkRsJEYam4CYMRLxds9plKQfkaZ8045PKpyXO8fMpUhrfqSVID4IrYvD+io6XoXtdR4Lk6isZ2EgrjdrqgdG70S5lwKihL4iAi2F2ZCWhngFhkeNVOZunEWE6qZMk5wKODajR9sixGDApGPZQVojHwCNRGILZaHZ39JCIj3s="
|
||||
# upload file artifacts using a glob expression.
|
||||
# It requires both options `file_glob` and `file`:
|
||||
# https://github.com/travis-ci/dpl/blob/master/lib/dpl/provider/releases.rb#L47-L53
|
||||
file_glob: true
|
||||
file: docker-credential-*-${TRAVIS_TAG}-amd64.tar.gz
|
||||
# don't delete the artifacts from previous phases
|
||||
skip_cleanup: true
|
||||
# deploy when a new tag is pushed
|
||||
on:
|
||||
tags: true
|
||||
|
||||
branches:
|
||||
only:
|
||||
# Pushes and PR to the master branch
|
||||
- master
|
||||
# IMPORTANT Ruby regex to match tags. Required, or travis won't trigger deploys when a new tag
|
||||
# is pushed. This regex matches semantic versions like v1.2.3-rc4+2016.02.22
|
||||
- /^v\d+\.\d+\.\d+.*$/
|
||||
50
vendor/github.com/docker/docker-credential-helpers/CHANGELOG.md
generated
vendored
50
vendor/github.com/docker/docker-credential-helpers/CHANGELOG.md
generated
vendored
@@ -1,50 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
This changelog tracks the releases of docker-credential-helpers.
|
||||
This project includes different binaries per platform.
|
||||
The platform released is identified after the tag name.
|
||||
|
||||
## v0.5.2 (Mac OS X, Windows, Linux)
|
||||
|
||||
- Add a `version` command to output the version
|
||||
- Fix storing URLs without scheme, and use `https://` by default
|
||||
|
||||
## v0.5.1 (Go client, Mac OS X, Windows, Linux)
|
||||
|
||||
- Redirect credential helpers' standard error to the caller's
|
||||
- Prevent invalid credentials and credentials queries
|
||||
|
||||
## v0.5.0 (Mac OS X)
|
||||
|
||||
- Add a label for Docker credentials and filter credentials lookup to filter keychain lookups
|
||||
|
||||
## v0.4.2 (Mac OS X, Windows)
|
||||
|
||||
- Fix osxkeychain list
|
||||
- macOS binary is now signed on release
|
||||
- Generate a `.exe` instead
|
||||
|
||||
## v0.4.1 (Mac OS X)
|
||||
|
||||
- Fixes to support older version of OSX (10.10, 10.11)
|
||||
|
||||
## v0.4.0 (Go client, Mac OS X, Windows, Linux)
|
||||
|
||||
- Full implementation for OSX ready
|
||||
- Fix some windows issues
|
||||
- Implement client.List, change list API
|
||||
- mac: delete credentials before adding them to avoid already exist error (fixes #37)
|
||||
|
||||
## v0.3.0 (Go client)
|
||||
|
||||
- Add Go client library to talk with the native programs.
|
||||
|
||||
## v0.2.0 (Mac OS X, Windows, Linux)
|
||||
|
||||
- Initial release of docker-credential-secretservice for Linux.
|
||||
- Use new secrets payload introduced in https://github.com/docker/docker/pull/20970.
|
||||
|
||||
## v0.1.0 (Mac OS X, Windows)
|
||||
|
||||
- Initial release of docker-credential-osxkeychain for Mac OS X.
|
||||
- Initial release of docker-credential-wincred for Microsoft Windows.
|
||||
20
vendor/github.com/docker/docker-credential-helpers/LICENSE
generated
vendored
20
vendor/github.com/docker/docker-credential-helpers/LICENSE
generated
vendored
@@ -1,20 +0,0 @@
|
||||
Copyright (c) 2016 David Calavera
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
166
vendor/github.com/docker/docker-credential-helpers/MAINTAINERS
generated
vendored
166
vendor/github.com/docker/docker-credential-helpers/MAINTAINERS
generated
vendored
@@ -1,166 +0,0 @@
|
||||
# docker-credential-helpers maintainers file
|
||||
#
|
||||
# This file describes who runs the docker/docker-credential-helpers project and how.
|
||||
# This is a living document - if you see something out of date or missing, speak up!
|
||||
#
|
||||
# It is structured to be consumable by both humans and programs.
|
||||
# To extract its contents programmatically, use any TOML-compliant parser.
|
||||
#
|
||||
# This file is compiled into the MAINTAINERS file in docker/opensource.
|
||||
#
|
||||
[Org]
|
||||
[Org."Core maintainers"]
|
||||
people = [
|
||||
"aaronlehmann",
|
||||
"calavera",
|
||||
"coolljt0725",
|
||||
"cpuguy83",
|
||||
"crosbymichael",
|
||||
"dnephin",
|
||||
"dongluochen",
|
||||
"duglin",
|
||||
"estesp",
|
||||
"icecrime",
|
||||
"jhowardmsft",
|
||||
"lk4d4",
|
||||
"mavenugo",
|
||||
"mhbauer",
|
||||
"n4ss",
|
||||
"runcom",
|
||||
"stevvooe",
|
||||
"thajeztah",
|
||||
"tianon",
|
||||
"tibor",
|
||||
"tonistiigi",
|
||||
"unclejack",
|
||||
"vdemeester",
|
||||
"vieux"
|
||||
]
|
||||
|
||||
[people]
|
||||
|
||||
# A reference list of all people associated with the project.
|
||||
# All other sections should refer to people by their canonical key
|
||||
# in the people section.
|
||||
|
||||
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
|
||||
|
||||
[people.aaronlehmann]
|
||||
Name = "Aaron Lehmann"
|
||||
Email = "aaron.lehmann@docker.com"
|
||||
GitHub = "aaronlehmann"
|
||||
|
||||
[people.calavera]
|
||||
Name = "David Calavera"
|
||||
Email = "david.calavera@gmail.com"
|
||||
GitHub = "calavera"
|
||||
|
||||
[people.coolljt0725]
|
||||
Name = "Lei Jitang"
|
||||
Email = "leijitang@huawei.com"
|
||||
GitHub = "coolljt0725"
|
||||
|
||||
[people.cpuguy83]
|
||||
Name = "Brian Goff"
|
||||
Email = "cpuguy83@gmail.com"
|
||||
Github = "cpuguy83"
|
||||
|
||||
[people.crosbymichael]
|
||||
Name = "Michael Crosby"
|
||||
Email = "crosbymichael@gmail.com"
|
||||
GitHub = "crosbymichael"
|
||||
|
||||
[people.dnephin]
|
||||
Name = "Daniel Nephin"
|
||||
Email = "dnephin@gmail.com"
|
||||
GitHub = "dnephin"
|
||||
|
||||
[people.dongluochen]
|
||||
Name = "Dongluo Chen"
|
||||
Email = "dongluo.chen@docker.com"
|
||||
GitHub = "dongluochen"
|
||||
|
||||
[people.duglin]
|
||||
Name = "Doug Davis"
|
||||
Email = "dug@us.ibm.com"
|
||||
GitHub = "duglin"
|
||||
|
||||
[people.estesp]
|
||||
Name = "Phil Estes"
|
||||
Email = "estesp@linux.vnet.ibm.com"
|
||||
GitHub = "estesp"
|
||||
|
||||
[people.icecrime]
|
||||
Name = "Arnaud Porterie"
|
||||
Email = "arnaud@docker.com"
|
||||
GitHub = "icecrime"
|
||||
|
||||
[people.jhowardmsft]
|
||||
Name = "John Howard"
|
||||
Email = "jhoward@microsoft.com"
|
||||
GitHub = "jhowardmsft"
|
||||
|
||||
[people.lk4d4]
|
||||
Name = "Alexander Morozov"
|
||||
Email = "lk4d4@docker.com"
|
||||
GitHub = "lk4d4"
|
||||
|
||||
[people.mavenugo]
|
||||
Name = "Madhu Venugopal"
|
||||
Email = "madhu@docker.com"
|
||||
GitHub = "mavenugo"
|
||||
|
||||
[people.mhbauer]
|
||||
Name = "Morgan Bauer"
|
||||
Email = "mbauer@us.ibm.com"
|
||||
GitHub = "mhbauer"
|
||||
|
||||
[people.n4ss]
|
||||
Name = "Nassim Eddequiouaq"
|
||||
Email = "eddequiouaq.nassim@gmail.com"
|
||||
GitHub = "n4ss"
|
||||
|
||||
[people.runcom]
|
||||
Name = "Antonio Murdaca"
|
||||
Email = "runcom@redhat.com"
|
||||
GitHub = "runcom"
|
||||
|
||||
[people.stevvooe]
|
||||
Name = "Stephen Day"
|
||||
Email = "stephen.day@docker.com"
|
||||
GitHub = "stevvooe"
|
||||
|
||||
[people.thajeztah]
|
||||
Name = "Sebastiaan van Stijn"
|
||||
Email = "github@gone.nl"
|
||||
GitHub = "thaJeztah"
|
||||
|
||||
[people.tianon]
|
||||
Name = "Tianon Gravi"
|
||||
Email = "admwiggin@gmail.com"
|
||||
GitHub = "tianon"
|
||||
|
||||
[people.tibor]
|
||||
Name = "Tibor Vass"
|
||||
Email = "tibor@docker.com"
|
||||
GitHub = "tiborvass"
|
||||
|
||||
[people.tonistiigi]
|
||||
Name = "Tõnis Tiigi"
|
||||
Email = "tonis@docker.com"
|
||||
GitHub = "tonistiigi"
|
||||
|
||||
[people.unclejack]
|
||||
Name = "Cristian Staretu"
|
||||
Email = "cristian.staretu@gmail.com"
|
||||
GitHub = "unclejack"
|
||||
|
||||
[people.vdemeester]
|
||||
Name = "Vincent Demeester"
|
||||
Email = "vincent@sbr.pm"
|
||||
GitHub = "vdemeester"
|
||||
|
||||
[people.vieux]
|
||||
Name = "Victor Vieux"
|
||||
Email = "vieux@docker.com"
|
||||
GitHub = "vieux"
|
||||
82
vendor/github.com/docker/docker-credential-helpers/Makefile
generated
vendored
82
vendor/github.com/docker/docker-credential-helpers/Makefile
generated
vendored
@@ -1,82 +0,0 @@
|
||||
.PHONY: all deps osxkeychain secretservice test validate wincred pass deb
|
||||
|
||||
TRAVIS_OS_NAME ?= linux
|
||||
VERSION := $(shell grep 'const Version' credentials/version.go | awk -F'"' '{ print $$2 }')
|
||||
|
||||
all: test
|
||||
|
||||
deps:
|
||||
go get github.com/golang/lint/golint
|
||||
|
||||
clean:
|
||||
rm -rf bin
|
||||
rm -rf release
|
||||
|
||||
osxkeychain:
|
||||
mkdir bin
|
||||
go build -ldflags -s -o bin/docker-credential-osxkeychain osxkeychain/cmd/main_darwin.go
|
||||
|
||||
osxcodesign: osxkeychain
|
||||
$(eval SIGNINGHASH = $(shell security find-identity -v -p codesigning | grep "Developer ID Application: Docker Inc" | cut -d ' ' -f 4))
|
||||
xcrun -log codesign -s $(SIGNINGHASH) --force --verbose bin/docker-credential-osxkeychain
|
||||
xcrun codesign --verify --deep --strict --verbose=2 --display bin/docker-credential-osxkeychain
|
||||
|
||||
osxrelease: clean vet_osx lint fmt test osxcodesign
|
||||
mkdir -p release
|
||||
@echo "\nPackaging version ${VERSION}\n"
|
||||
cd bin && tar cvfz ../release/docker-credential-osxkeychain-v$(VERSION)-amd64.tar.gz docker-credential-osxkeychain
|
||||
|
||||
secretservice:
|
||||
mkdir bin
|
||||
go build -o bin/docker-credential-secretservice secretservice/cmd/main_linux.go
|
||||
|
||||
pass:
|
||||
mkdir -p bin
|
||||
go build -o bin/docker-credential-pass pass/cmd/main_linux.go
|
||||
|
||||
wincred:
|
||||
mkdir bin
|
||||
go build -o bin/docker-credential-wincred.exe wincred/cmd/main_windows.go
|
||||
|
||||
winrelease: clean vet_win lint fmt test wincred
|
||||
mkdir -p release
|
||||
@echo "\nPackaging version ${VERSION}\n"
|
||||
cd bin && zip ../release/docker-credential-wincred-v$(VERSION)-amd64.zip docker-credential-wincred.exe
|
||||
|
||||
test:
|
||||
# tests all packages except vendor
|
||||
go test -v `go list ./... | grep -v /vendor/`
|
||||
|
||||
vet: vet_$(TRAVIS_OS_NAME)
|
||||
go vet ./credentials
|
||||
|
||||
vet_win:
|
||||
go vet ./wincred
|
||||
|
||||
vet_osx:
|
||||
go vet ./osxkeychain
|
||||
|
||||
vet_linux:
|
||||
go vet ./secretservice
|
||||
|
||||
lint:
|
||||
for p in `go list ./... | grep -v /vendor/`; do \
|
||||
golint $$p ; \
|
||||
done
|
||||
|
||||
fmt:
|
||||
gofmt -s -l `ls **/*.go | grep -v vendor`
|
||||
|
||||
validate: vet lint fmt
|
||||
|
||||
|
||||
BUILDIMG:=docker-credential-secretservice-$(VERSION)
|
||||
deb:
|
||||
mkdir -p release
|
||||
docker build -f deb/Dockerfile \
|
||||
--build-arg VERSION=$(VERSION) \
|
||||
--build-arg DISTRO=xenial \
|
||||
--tag $(BUILDIMG) \
|
||||
.
|
||||
docker run --rm --net=none $(BUILDIMG) tar cf - /release | tar xf -
|
||||
docker rmi $(BUILDIMG)
|
||||
76
vendor/github.com/docker/docker-credential-helpers/README.md
generated
vendored
76
vendor/github.com/docker/docker-credential-helpers/README.md
generated
vendored
@@ -1,76 +0,0 @@
|
||||
## Introduction
|
||||
|
||||
docker-credential-helpers is a suite of programs to use native stores to keep Docker credentials safe.
|
||||
|
||||
## Installation
|
||||
|
||||
Go to the [Releases](https://github.com/docker/docker-credential-helpers/releases) page and download the binary that works better for you. Put that binary in your `$PATH`, so Docker can find it.
|
||||
|
||||
### Building from scratch
|
||||
|
||||
The programs in this repository are written with the Go programming language. These instructions assume that you have previous knowledge about the language and you have it installed in your machine.
|
||||
|
||||
1 - Download the source and put it in your `$GOPATH` with `go get`.
|
||||
|
||||
```
|
||||
$ go get github.com/docker/docker-credential-helpers
|
||||
```
|
||||
|
||||
2 - Use `make` to build the program you want. That will leave any executable in the `bin` directory inside the repository.
|
||||
|
||||
```
|
||||
$ cd $GOPATH/docker/docker-credentials-helpers
|
||||
$ make osxkeychain
|
||||
```
|
||||
|
||||
3 - Put that binary in your `$PATH`, so Docker can find it.
|
||||
|
||||
## Usage
|
||||
|
||||
### With the Docker Engine
|
||||
|
||||
Set the `credsStore` option in your `.docker/config.json` file with the suffix of the program you want to use. For instance, set it to `osxkeychain` if you want to use `docker-credential-osxkeychain`.
|
||||
|
||||
```json
|
||||
{
|
||||
"credsStore": "osxkeychain"
|
||||
}
|
||||
```
|
||||
|
||||
### With other command line applications
|
||||
|
||||
The sub-package [client](https://godoc.org/github.com/docker/docker-credential-helpers/client) includes
|
||||
functions to call external programs from your own command line applications.
|
||||
|
||||
There are three things you need to know if you need to interact with a helper:
|
||||
|
||||
1. The name of the program to execute, for instance `docker-credential-osxkeychain`.
|
||||
2. The server address to identify the credentials, for instance `https://example.com`.
|
||||
3. The username and secret to store, when you want to store credentials.
|
||||
|
||||
You can see examples of each function in the [client](https://godoc.org/github.com/docker/docker-credential-helpers/client) documentation.
|
||||
|
||||
### Available programs
|
||||
|
||||
1. osxkeychain: Provides a helper to use the OS X keychain as credentials store.
|
||||
2. secretservice: Provides a helper to use the D-Bus secret service as credentials store.
|
||||
3. wincred: Provides a helper to use Windows credentials manager as store.
|
||||
|
||||
## Development
|
||||
|
||||
A credential helper can be any program that can read values from the standard input. We use the first argument in the command line to differentiate the kind of command to execute. There are four valid values:
|
||||
|
||||
- `store`: Adds credentials to the keychain. The payload in the standard input is a JSON document with `ServerURL`, `Username` and `Secret`.
|
||||
- `get`: Retrieves credentials from the keychain. The payload in the standard input is the raw value for the `ServerURL`.
|
||||
- `erase`: Removes credentials from the keychain. The payload in the standard input is the raw value for the `ServerURL`.
|
||||
- `list`: Lists stored credentials. There is no standard input payload.
|
||||
|
||||
This repository also includes libraries to implement new credentials programs in Go. Adding a new helper program is pretty easy. You can see how the OS X keychain helper works in the [osxkeychain](osxkeychain) directory.
|
||||
|
||||
1. Implement the interface `credentials.Helper` in `YOUR_PACKAGE/YOUR_PACKAGE_$GOOS.go`
|
||||
2. Create a main program in `YOUR_PACKAGE/cmd/main_$GOOS.go`.
|
||||
3. Add make tasks to build your program and run tests.
|
||||
|
||||
## License
|
||||
|
||||
MIT. See [LICENSE](LICENSE) for more information.
|
||||
24
vendor/github.com/docker/docker-credential-helpers/appveyor.yml
generated
vendored
24
vendor/github.com/docker/docker-credential-helpers/appveyor.yml
generated
vendored
@@ -1,24 +0,0 @@
|
||||
image: Visual Studio 2015
|
||||
environment:
|
||||
GOPATH: c:\gopath
|
||||
|
||||
clone_folder: c:\gopath\src\github.com\docker\docker-credential-helpers
|
||||
clone_depth: 10
|
||||
|
||||
before_build:
|
||||
- set PATH=%PATH%;C:\MinGW\bin;
|
||||
- set PATH=%PATH%;C:\go18\bin;
|
||||
- set GOROOT=C:\go18
|
||||
|
||||
build_script:
|
||||
- mingw32-make vet_win wincred
|
||||
|
||||
test_script:
|
||||
- mingw32-make test
|
||||
|
||||
deploy: off
|
||||
|
||||
artifacts:
|
||||
- path: bin/docker-credential-wincred.exe
|
||||
|
||||
configuration: Release
|
||||
15
vendor/github.com/docker/docker-credential-helpers/ci/before_deploy.sh
generated
vendored
15
vendor/github.com/docker/docker-credential-helpers/ci/before_deploy.sh
generated
vendored
@@ -1,15 +0,0 @@
|
||||
set -ex
|
||||
|
||||
mkdir bin
|
||||
case "$TRAVIS_OS_NAME" in
|
||||
"osx")
|
||||
go build -o bin/docker-credential-osxkeychain osxkeychain/cmd/main_darwin.go
|
||||
cd bin
|
||||
tar czf ../docker-credential-osxkeychain-${TRAVIS_TAG}-amd64.tar.gz docker-credential-osxkeychain
|
||||
;;
|
||||
"linux")
|
||||
go build -o bin/docker-credential-secretservice secretservice/cmd/main_linux.go
|
||||
cd bin
|
||||
tar czf ../docker-credential-secretservice-${TRAVIS_TAG}-amd64.tar.gz docker-credential-secretservice
|
||||
;;
|
||||
esac
|
||||
22
vendor/github.com/docker/docker-credential-helpers/ci/before_script_linux.sh
generated
vendored
22
vendor/github.com/docker/docker-credential-helpers/ci/before_script_linux.sh
generated
vendored
@@ -1,22 +0,0 @@
|
||||
set -ex
|
||||
|
||||
sh -e /etc/init.d/xvfb start
|
||||
sleep 3 # give xvfb some time to start
|
||||
|
||||
# init key for pass
|
||||
gpg --batch --gen-key <<-EOF
|
||||
%echo Generating a standard key
|
||||
Key-Type: DSA
|
||||
Key-Length: 1024
|
||||
Subkey-Type: ELG-E
|
||||
Subkey-Length: 1024
|
||||
Name-Real: Meshuggah Rocks
|
||||
Name-Email: meshuggah@example.com
|
||||
Expire-Date: 0
|
||||
# Do a commit here, so that we can later print "done" :-)
|
||||
%commit
|
||||
%echo done
|
||||
EOF
|
||||
|
||||
key=$(gpg --no-auto-check-trustdb --list-secret-keys | grep ^sec | cut -d/ -f2 | cut -d" " -f1)
|
||||
pass init $key
|
||||
121
vendor/github.com/docker/docker-credential-helpers/client/client.go
generated
vendored
121
vendor/github.com/docker/docker-credential-helpers/client/client.go
generated
vendored
@@ -1,121 +0,0 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
// isValidCredsMessage checks if 'msg' contains invalid credentials error message.
|
||||
// It returns whether the logs are free of invalid credentials errors and the error if it isn't.
|
||||
// error values can be errCredentialsMissingServerURL or errCredentialsMissingUsername.
|
||||
func isValidCredsMessage(msg string) error {
|
||||
if credentials.IsCredentialsMissingServerURLMessage(msg) {
|
||||
return credentials.NewErrCredentialsMissingServerURL()
|
||||
}
|
||||
|
||||
if credentials.IsCredentialsMissingUsernameMessage(msg) {
|
||||
return credentials.NewErrCredentialsMissingUsername()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Store uses an external program to save credentials.
|
||||
func Store(program ProgramFunc, creds *credentials.Credentials) error {
|
||||
cmd := program("store")
|
||||
|
||||
buffer := new(bytes.Buffer)
|
||||
if err := json.NewEncoder(buffer).Encode(creds); err != nil {
|
||||
return err
|
||||
}
|
||||
cmd.Input(buffer)
|
||||
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t := strings.TrimSpace(string(out))
|
||||
|
||||
if isValidErr := isValidCredsMessage(t); isValidErr != nil {
|
||||
err = isValidErr
|
||||
}
|
||||
|
||||
return fmt.Errorf("error storing credentials - err: %v, out: `%s`", err, t)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get executes an external program to get the credentials from a native store.
|
||||
func Get(program ProgramFunc, serverURL string) (*credentials.Credentials, error) {
|
||||
cmd := program("get")
|
||||
cmd.Input(strings.NewReader(serverURL))
|
||||
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t := strings.TrimSpace(string(out))
|
||||
|
||||
if credentials.IsErrCredentialsNotFoundMessage(t) {
|
||||
return nil, credentials.NewErrCredentialsNotFound()
|
||||
}
|
||||
|
||||
if isValidErr := isValidCredsMessage(t); isValidErr != nil {
|
||||
err = isValidErr
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("error getting credentials - err: %v, out: `%s`", err, t)
|
||||
}
|
||||
|
||||
resp := &credentials.Credentials{
|
||||
ServerURL: serverURL,
|
||||
}
|
||||
|
||||
if err := json.NewDecoder(bytes.NewReader(out)).Decode(resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
// Erase executes a program to remove the server credentials from the native store.
|
||||
func Erase(program ProgramFunc, serverURL string) error {
|
||||
cmd := program("erase")
|
||||
cmd.Input(strings.NewReader(serverURL))
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t := strings.TrimSpace(string(out))
|
||||
|
||||
if isValidErr := isValidCredsMessage(t); isValidErr != nil {
|
||||
err = isValidErr
|
||||
}
|
||||
|
||||
return fmt.Errorf("error erasing credentials - err: %v, out: `%s`", err, t)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// List executes a program to list server credentials in the native store.
|
||||
func List(program ProgramFunc) (map[string]string, error) {
|
||||
cmd := program("list")
|
||||
cmd.Input(strings.NewReader("unused"))
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t := strings.TrimSpace(string(out))
|
||||
|
||||
if isValidErr := isValidCredsMessage(t); isValidErr != nil {
|
||||
err = isValidErr
|
||||
}
|
||||
|
||||
return nil, fmt.Errorf("error listing credentials - err: %v, out: `%s`", err, t)
|
||||
}
|
||||
|
||||
var resp map[string]string
|
||||
if err = json.NewDecoder(bytes.NewReader(out)).Decode(&resp); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
213
vendor/github.com/docker/docker-credential-helpers/client/client_test.go
generated
vendored
213
vendor/github.com/docker/docker-credential-helpers/client/client_test.go
generated
vendored
@@ -1,213 +0,0 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
const (
|
||||
validServerAddress = "https://index.docker.io/v1"
|
||||
validUsername = "linus"
|
||||
validServerAddress2 = "https://example.com:5002"
|
||||
invalidServerAddress = "https://foobar.example.com"
|
||||
missingCredsAddress = "https://missing.docker.io/v1"
|
||||
)
|
||||
|
||||
var errProgramExited = fmt.Errorf("exited 1")
|
||||
|
||||
// mockProgram simulates interactions between the docker client and a remote
|
||||
// credentials helper.
|
||||
// Unit tests inject this mocked command into the remote to control execution.
|
||||
type mockProgram struct {
|
||||
arg string
|
||||
input io.Reader
|
||||
}
|
||||
|
||||
// Output returns responses from the remote credentials helper.
|
||||
// It mocks those responses based in the input in the mock.
|
||||
func (m *mockProgram) Output() ([]byte, error) {
|
||||
in, err := ioutil.ReadAll(m.input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
inS := string(in)
|
||||
|
||||
switch m.arg {
|
||||
case "erase":
|
||||
switch inS {
|
||||
case validServerAddress:
|
||||
return nil, nil
|
||||
default:
|
||||
return []byte("program failed"), errProgramExited
|
||||
}
|
||||
case "get":
|
||||
switch inS {
|
||||
case validServerAddress:
|
||||
return []byte(`{"Username": "foo", "Secret": "bar"}`), nil
|
||||
case validServerAddress2:
|
||||
return []byte(`{"Username": "<token>", "Secret": "abcd1234"}`), nil
|
||||
case missingCredsAddress:
|
||||
return []byte(credentials.NewErrCredentialsNotFound().Error()), errProgramExited
|
||||
case invalidServerAddress:
|
||||
return []byte("program failed"), errProgramExited
|
||||
case "":
|
||||
return []byte(credentials.NewErrCredentialsMissingServerURL().Error()), errProgramExited
|
||||
}
|
||||
case "store":
|
||||
var c credentials.Credentials
|
||||
err := json.NewDecoder(strings.NewReader(inS)).Decode(&c)
|
||||
if err != nil {
|
||||
return []byte("error storing credentials"), errProgramExited
|
||||
}
|
||||
switch c.ServerURL {
|
||||
case validServerAddress:
|
||||
return nil, nil
|
||||
case validServerAddress2:
|
||||
return nil, nil
|
||||
default:
|
||||
return []byte("error storing credentials"), errProgramExited
|
||||
}
|
||||
case "list":
|
||||
return []byte(fmt.Sprintf(`{"%s": "%s"}`, validServerAddress, validUsername)), nil
|
||||
|
||||
}
|
||||
|
||||
return []byte(fmt.Sprintf("unknown argument %q with %q", m.arg, inS)), errProgramExited
|
||||
}
|
||||
|
||||
// Input sets the input to send to a remote credentials helper.
|
||||
func (m *mockProgram) Input(in io.Reader) {
|
||||
m.input = in
|
||||
}
|
||||
|
||||
func mockProgramFn(args ...string) Program {
|
||||
return &mockProgram{
|
||||
arg: args[0],
|
||||
}
|
||||
}
|
||||
|
||||
func ExampleStore() {
|
||||
p := NewShellProgramFunc("docker-credential-secretservice")
|
||||
|
||||
c := &credentials.Credentials{
|
||||
ServerURL: "https://example.com",
|
||||
Username: "calavera",
|
||||
Secret: "my super secret token",
|
||||
}
|
||||
|
||||
if err := Store(p, c); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStore(t *testing.T) {
|
||||
valid := []credentials.Credentials{
|
||||
{validServerAddress, "foo", "bar"},
|
||||
{validServerAddress2, "<token>", "abcd1234"},
|
||||
}
|
||||
|
||||
for _, v := range valid {
|
||||
if err := Store(mockProgramFn, &v); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
invalid := []credentials.Credentials{
|
||||
{invalidServerAddress, "foo", "bar"},
|
||||
}
|
||||
|
||||
for _, v := range invalid {
|
||||
if err := Store(mockProgramFn, &v); err == nil {
|
||||
t.Fatalf("Expected error for server %s, got nil", v.ServerURL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ExampleGet() {
|
||||
p := NewShellProgramFunc("docker-credential-secretservice")
|
||||
|
||||
creds, err := Get(p, "https://example.com")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Got credentials for user `%s` in `%s`\n", creds.Username, creds.ServerURL)
|
||||
}
|
||||
|
||||
func TestGet(t *testing.T) {
|
||||
valid := []credentials.Credentials{
|
||||
{validServerAddress, "foo", "bar"},
|
||||
{validServerAddress2, "<token>", "abcd1234"},
|
||||
}
|
||||
|
||||
for _, v := range valid {
|
||||
c, err := Get(mockProgramFn, v.ServerURL)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c.Username != v.Username {
|
||||
t.Fatalf("expected username `%s`, got %s", v.Username, c.Username)
|
||||
}
|
||||
if c.Secret != v.Secret {
|
||||
t.Fatalf("expected secret `%s`, got %s", v.Secret, c.Secret)
|
||||
}
|
||||
}
|
||||
|
||||
missingServerURLErr := credentials.NewErrCredentialsMissingServerURL()
|
||||
|
||||
invalid := []struct {
|
||||
serverURL string
|
||||
err string
|
||||
}{
|
||||
{missingCredsAddress, credentials.NewErrCredentialsNotFound().Error()},
|
||||
{invalidServerAddress, "error getting credentials - err: exited 1, out: `program failed`"},
|
||||
{"", fmt.Sprintf("error getting credentials - err: %s, out: `%s`",
|
||||
missingServerURLErr.Error(), missingServerURLErr.Error())},
|
||||
}
|
||||
|
||||
for _, v := range invalid {
|
||||
_, err := Get(mockProgramFn, v.serverURL)
|
||||
if err == nil {
|
||||
t.Fatalf("Expected error for server %s, got nil", v.serverURL)
|
||||
}
|
||||
if err.Error() != v.err {
|
||||
t.Fatalf("Expected error `%s`, got `%v`", v.err, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ExampleErase() {
|
||||
p := NewShellProgramFunc("docker-credential-secretservice")
|
||||
|
||||
if err := Erase(p, "https://example.com"); err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestErase(t *testing.T) {
|
||||
if err := Erase(mockProgramFn, validServerAddress); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := Erase(mockProgramFn, invalidServerAddress); err == nil {
|
||||
t.Fatalf("Expected error for server %s, got nil", invalidServerAddress)
|
||||
}
|
||||
}
|
||||
|
||||
func TestList(t *testing.T) {
|
||||
auths, err := List(mockProgramFn)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if username, exists := auths[validServerAddress]; !exists || username != validUsername {
|
||||
t.Fatalf("auths[%s] returned %s, %t; expected %s, %t", validServerAddress, username, exists, validUsername, true)
|
||||
}
|
||||
}
|
||||
56
vendor/github.com/docker/docker-credential-helpers/client/command.go
generated
vendored
56
vendor/github.com/docker/docker-credential-helpers/client/command.go
generated
vendored
@@ -1,56 +0,0 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
// Program is an interface to execute external programs.
|
||||
type Program interface {
|
||||
Output() ([]byte, error)
|
||||
Input(in io.Reader)
|
||||
}
|
||||
|
||||
// ProgramFunc is a type of function that initializes programs based on arguments.
|
||||
type ProgramFunc func(args ...string) Program
|
||||
|
||||
// NewShellProgramFunc creates programs that are executed in a Shell.
|
||||
func NewShellProgramFunc(name string) ProgramFunc {
|
||||
return NewShellProgramFuncWithEnv(name, nil)
|
||||
}
|
||||
|
||||
// NewShellProgramFuncWithEnv creates programs that are executed in a Shell with environment variables
|
||||
func NewShellProgramFuncWithEnv(name string, env *map[string]string) ProgramFunc {
|
||||
return func(args ...string) Program {
|
||||
return &Shell{cmd: createProgramCmdRedirectErr(name, args, env)}
|
||||
}
|
||||
}
|
||||
|
||||
func createProgramCmdRedirectErr(commandName string, args []string, env *map[string]string) *exec.Cmd {
|
||||
programCmd := exec.Command(commandName, args...)
|
||||
programCmd.Env = os.Environ()
|
||||
if env != nil {
|
||||
for k, v := range *env {
|
||||
programCmd.Env = append(programCmd.Env, fmt.Sprintf("%s=%s", k, v))
|
||||
}
|
||||
}
|
||||
programCmd.Stderr = os.Stderr
|
||||
return programCmd
|
||||
}
|
||||
|
||||
// Shell invokes shell commands to talk with a remote credentials helper.
|
||||
type Shell struct {
|
||||
cmd *exec.Cmd
|
||||
}
|
||||
|
||||
// Output returns responses from the remote credentials helper.
|
||||
func (s *Shell) Output() ([]byte, error) {
|
||||
return s.cmd.Output()
|
||||
}
|
||||
|
||||
// Input sets the input to send to a remote credentials helper.
|
||||
func (s *Shell) Input(in io.Reader) {
|
||||
s.cmd.Stdin = in
|
||||
}
|
||||
186
vendor/github.com/docker/docker-credential-helpers/credentials/credentials.go
generated
vendored
186
vendor/github.com/docker/docker-credential-helpers/credentials/credentials.go
generated
vendored
@@ -1,186 +0,0 @@
|
||||
package credentials
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Credentials holds the information shared between docker and the credentials store.
|
||||
type Credentials struct {
|
||||
ServerURL string
|
||||
Username string
|
||||
Secret string
|
||||
}
|
||||
|
||||
// isValid checks the integrity of Credentials object such that no credentials lack
|
||||
// a server URL or a username.
|
||||
// It returns whether the credentials are valid and the error if it isn't.
|
||||
// error values can be errCredentialsMissingServerURL or errCredentialsMissingUsername
|
||||
func (c *Credentials) isValid() (bool, error) {
|
||||
if len(c.ServerURL) == 0 {
|
||||
return false, NewErrCredentialsMissingServerURL()
|
||||
}
|
||||
|
||||
if len(c.Username) == 0 {
|
||||
return false, NewErrCredentialsMissingUsername()
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// CredsLabel holds the way Docker credentials should be labeled as such in credentials stores that allow labelling.
|
||||
// That label allows to filter out non-Docker credentials too at lookup/search in macOS keychain,
|
||||
// Windows credentials manager and Linux libsecret. Default value is "Docker Credentials"
|
||||
var CredsLabel = "Docker Credentials"
|
||||
|
||||
// SetCredsLabel is a simple setter for CredsLabel
|
||||
func SetCredsLabel(label string) {
|
||||
CredsLabel = label
|
||||
}
|
||||
|
||||
// Serve initializes the credentials helper and parses the action argument.
|
||||
// This function is designed to be called from a command line interface.
|
||||
// It uses os.Args[1] as the key for the action.
|
||||
// It uses os.Stdin as input and os.Stdout as output.
|
||||
// This function terminates the program with os.Exit(1) if there is an error.
|
||||
func Serve(helper Helper) {
|
||||
var err error
|
||||
if len(os.Args) != 2 {
|
||||
err = fmt.Errorf("Usage: %s <store|get|erase|list|version>", os.Args[0])
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
err = HandleCommand(helper, os.Args[1], os.Stdin, os.Stdout)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stdout, "%v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// HandleCommand uses a helper and a key to run a credential action.
|
||||
func HandleCommand(helper Helper, key string, in io.Reader, out io.Writer) error {
|
||||
switch key {
|
||||
case "store":
|
||||
return Store(helper, in)
|
||||
case "get":
|
||||
return Get(helper, in, out)
|
||||
case "erase":
|
||||
return Erase(helper, in)
|
||||
case "list":
|
||||
return List(helper, out)
|
||||
case "version":
|
||||
return PrintVersion(out)
|
||||
}
|
||||
return fmt.Errorf("Unknown credential action `%s`", key)
|
||||
}
|
||||
|
||||
// Store uses a helper and an input reader to save credentials.
|
||||
// The reader must contain the JSON serialization of a Credentials struct.
|
||||
func Store(helper Helper, reader io.Reader) error {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
buffer := new(bytes.Buffer)
|
||||
for scanner.Scan() {
|
||||
buffer.Write(scanner.Bytes())
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil && err != io.EOF {
|
||||
return err
|
||||
}
|
||||
|
||||
var creds Credentials
|
||||
if err := json.NewDecoder(buffer).Decode(&creds); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if ok, err := creds.isValid(); !ok {
|
||||
return err
|
||||
}
|
||||
|
||||
return helper.Add(&creds)
|
||||
}
|
||||
|
||||
// Get retrieves the credentials for a given server url.
|
||||
// The reader must contain the server URL to search.
|
||||
// The writer is used to write the JSON serialization of the credentials.
|
||||
func Get(helper Helper, reader io.Reader, writer io.Writer) error {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
buffer := new(bytes.Buffer)
|
||||
for scanner.Scan() {
|
||||
buffer.Write(scanner.Bytes())
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil && err != io.EOF {
|
||||
return err
|
||||
}
|
||||
|
||||
serverURL := strings.TrimSpace(buffer.String())
|
||||
if len(serverURL) == 0 {
|
||||
return NewErrCredentialsMissingServerURL()
|
||||
}
|
||||
|
||||
username, secret, err := helper.Get(serverURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
resp := Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: username,
|
||||
Secret: secret,
|
||||
}
|
||||
|
||||
buffer.Reset()
|
||||
if err := json.NewEncoder(buffer).Encode(resp); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Fprint(writer, buffer.String())
|
||||
return nil
|
||||
}
|
||||
|
||||
// Erase removes credentials from the store.
|
||||
// The reader must contain the server URL to remove.
|
||||
func Erase(helper Helper, reader io.Reader) error {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
buffer := new(bytes.Buffer)
|
||||
for scanner.Scan() {
|
||||
buffer.Write(scanner.Bytes())
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil && err != io.EOF {
|
||||
return err
|
||||
}
|
||||
|
||||
serverURL := strings.TrimSpace(buffer.String())
|
||||
if len(serverURL) == 0 {
|
||||
return NewErrCredentialsMissingServerURL()
|
||||
}
|
||||
|
||||
return helper.Delete(serverURL)
|
||||
}
|
||||
|
||||
//List returns all the serverURLs of keys in
|
||||
//the OS store as a list of strings
|
||||
func List(helper Helper, writer io.Writer) error {
|
||||
accts, err := helper.List()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.NewEncoder(writer).Encode(accts)
|
||||
}
|
||||
|
||||
//PrintVersion outputs the current version.
|
||||
func PrintVersion(writer io.Writer) error {
|
||||
fmt.Fprintln(writer, Version)
|
||||
return nil
|
||||
}
|
||||
249
vendor/github.com/docker/docker-credential-helpers/credentials/credentials_test.go
generated
vendored
249
vendor/github.com/docker/docker-credential-helpers/credentials/credentials_test.go
generated
vendored
@@ -1,249 +0,0 @@
|
||||
package credentials
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type memoryStore struct {
|
||||
creds map[string]*Credentials
|
||||
}
|
||||
|
||||
func newMemoryStore() *memoryStore {
|
||||
return &memoryStore{
|
||||
creds: make(map[string]*Credentials),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *memoryStore) Add(creds *Credentials) error {
|
||||
m.creds[creds.ServerURL] = creds
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *memoryStore) Delete(serverURL string) error {
|
||||
delete(m.creds, serverURL)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *memoryStore) Get(serverURL string) (string, string, error) {
|
||||
c, ok := m.creds[serverURL]
|
||||
if !ok {
|
||||
return "", "", fmt.Errorf("creds not found for %s", serverURL)
|
||||
}
|
||||
return c.Username, c.Secret, nil
|
||||
}
|
||||
|
||||
func (m *memoryStore) List() (map[string]string, error) {
|
||||
//Simply a placeholder to let memoryStore be a valid implementation of Helper interface
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func TestStore(t *testing.T) {
|
||||
serverURL := "https://index.docker.io/v1/"
|
||||
creds := &Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
if err := Store(h, in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
c, ok := h.creds[serverURL]
|
||||
if !ok {
|
||||
t.Fatalf("creds not found for %s\n", serverURL)
|
||||
}
|
||||
|
||||
if c.Username != "foo" {
|
||||
t.Fatalf("expected username foo, got %s\n", c.Username)
|
||||
}
|
||||
|
||||
if c.Secret != "bar" {
|
||||
t.Fatalf("expected username bar, got %s\n", c.Secret)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreMissingServerURL(t *testing.T) {
|
||||
creds := &Credentials{
|
||||
ServerURL: "",
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
|
||||
if err := Store(h, in); IsCredentialsMissingServerURL(err) == false {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreMissingUsername(t *testing.T) {
|
||||
creds := &Credentials{
|
||||
ServerURL: "https://index.docker.io/v1/",
|
||||
Username: "",
|
||||
Secret: "bar",
|
||||
}
|
||||
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
|
||||
if err := Store(h, in); IsCredentialsMissingUsername(err) == false {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGet(t *testing.T) {
|
||||
serverURL := "https://index.docker.io/v1/"
|
||||
creds := &Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
if err := Store(h, in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
buf := strings.NewReader(serverURL)
|
||||
w := new(bytes.Buffer)
|
||||
if err := Get(h, buf, w); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if w.Len() == 0 {
|
||||
t.Fatalf("expected output in the writer, got %d", w.Len())
|
||||
}
|
||||
|
||||
var c Credentials
|
||||
if err := json.NewDecoder(w).Decode(&c); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c.Username != "foo" {
|
||||
t.Fatalf("expected username foo, got %s\n", c.Username)
|
||||
}
|
||||
|
||||
if c.Secret != "bar" {
|
||||
t.Fatalf("expected username bar, got %s\n", c.Secret)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMissingServerURL(t *testing.T) {
|
||||
serverURL := "https://index.docker.io/v1/"
|
||||
creds := &Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
if err := Store(h, in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
buf := strings.NewReader("")
|
||||
w := new(bytes.Buffer)
|
||||
|
||||
if err := Get(h, buf, w); IsCredentialsMissingServerURL(err) == false {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestErase(t *testing.T) {
|
||||
serverURL := "https://index.docker.io/v1/"
|
||||
creds := &Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
if err := Store(h, in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
buf := strings.NewReader(serverURL)
|
||||
if err := Erase(h, buf); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
w := new(bytes.Buffer)
|
||||
if err := Get(h, buf, w); err == nil {
|
||||
t.Fatal("expected error getting missing creds, got empty")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEraseMissingServerURL(t *testing.T) {
|
||||
serverURL := "https://index.docker.io/v1/"
|
||||
creds := &Credentials{
|
||||
ServerURL: serverURL,
|
||||
Username: "foo",
|
||||
Secret: "bar",
|
||||
}
|
||||
b, err := json.Marshal(creds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := bytes.NewReader(b)
|
||||
|
||||
h := newMemoryStore()
|
||||
if err := Store(h, in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
buf := strings.NewReader("")
|
||||
if err := Erase(h, buf); IsCredentialsMissingServerURL(err) == false {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestList(t *testing.T) {
|
||||
//This tests that there is proper input an output into the byte stream
|
||||
//Individual stores are very OS specific and have been tested in osxkeychain and secretservice respectively
|
||||
out := new(bytes.Buffer)
|
||||
h := newMemoryStore()
|
||||
if err := List(h, out); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
//testing that there is an output
|
||||
if out.Len() == 0 {
|
||||
t.Fatalf("expected output in the writer, got %d", 0)
|
||||
}
|
||||
}
|
||||
102
vendor/github.com/docker/docker-credential-helpers/credentials/error.go
generated
vendored
102
vendor/github.com/docker/docker-credential-helpers/credentials/error.go
generated
vendored
@@ -1,102 +0,0 @@
|
||||
package credentials
|
||||
|
||||
const (
|
||||
// ErrCredentialsNotFound standardizes the not found error, so every helper returns
|
||||
// the same message and docker can handle it properly.
|
||||
errCredentialsNotFoundMessage = "credentials not found in native keychain"
|
||||
|
||||
// ErrCredentialsMissingServerURL and ErrCredentialsMissingUsername standardize
|
||||
// invalid credentials or credentials management operations
|
||||
errCredentialsMissingServerURLMessage = "no credentials server URL"
|
||||
errCredentialsMissingUsernameMessage = "no credentials username"
|
||||
)
|
||||
|
||||
// errCredentialsNotFound represents an error
|
||||
// raised when credentials are not in the store.
|
||||
type errCredentialsNotFound struct{}
|
||||
|
||||
// Error returns the standard error message
|
||||
// for when the credentials are not in the store.
|
||||
func (errCredentialsNotFound) Error() string {
|
||||
return errCredentialsNotFoundMessage
|
||||
}
|
||||
|
||||
// NewErrCredentialsNotFound creates a new error
|
||||
// for when the credentials are not in the store.
|
||||
func NewErrCredentialsNotFound() error {
|
||||
return errCredentialsNotFound{}
|
||||
}
|
||||
|
||||
// IsErrCredentialsNotFound returns true if the error
|
||||
// was caused by not having a set of credentials in a store.
|
||||
func IsErrCredentialsNotFound(err error) bool {
|
||||
_, ok := err.(errCredentialsNotFound)
|
||||
return ok
|
||||
}
|
||||
|
||||
// IsErrCredentialsNotFoundMessage returns true if the error
|
||||
// was caused by not having a set of credentials in a store.
|
||||
//
|
||||
// This function helps to check messages returned by an
|
||||
// external program via its standard output.
|
||||
func IsErrCredentialsNotFoundMessage(err string) bool {
|
||||
return err == errCredentialsNotFoundMessage
|
||||
}
|
||||
|
||||
// errCredentialsMissingServerURL represents an error raised
|
||||
// when the credentials object has no server URL or when no
|
||||
// server URL is provided to a credentials operation requiring
|
||||
// one.
|
||||
type errCredentialsMissingServerURL struct{}
|
||||
|
||||
func (errCredentialsMissingServerURL) Error() string {
|
||||
return errCredentialsMissingServerURLMessage
|
||||
}
|
||||
|
||||
// errCredentialsMissingUsername represents an error raised
|
||||
// when the credentials object has no username or when no
|
||||
// username is provided to a credentials operation requiring
|
||||
// one.
|
||||
type errCredentialsMissingUsername struct{}
|
||||
|
||||
func (errCredentialsMissingUsername) Error() string {
|
||||
return errCredentialsMissingUsernameMessage
|
||||
}
|
||||
|
||||
// NewErrCredentialsMissingServerURL creates a new error for
|
||||
// errCredentialsMissingServerURL.
|
||||
func NewErrCredentialsMissingServerURL() error {
|
||||
return errCredentialsMissingServerURL{}
|
||||
}
|
||||
|
||||
// NewErrCredentialsMissingUsername creates a new error for
|
||||
// errCredentialsMissingUsername.
|
||||
func NewErrCredentialsMissingUsername() error {
|
||||
return errCredentialsMissingUsername{}
|
||||
}
|
||||
|
||||
// IsCredentialsMissingServerURL returns true if the error
|
||||
// was an errCredentialsMissingServerURL.
|
||||
func IsCredentialsMissingServerURL(err error) bool {
|
||||
_, ok := err.(errCredentialsMissingServerURL)
|
||||
return ok
|
||||
}
|
||||
|
||||
// IsCredentialsMissingServerURLMessage checks for an
|
||||
// errCredentialsMissingServerURL in the error message.
|
||||
func IsCredentialsMissingServerURLMessage(err string) bool {
|
||||
return err == errCredentialsMissingServerURLMessage
|
||||
}
|
||||
|
||||
// IsCredentialsMissingUsername returns true if the error
|
||||
// was an errCredentialsMissingUsername.
|
||||
func IsCredentialsMissingUsername(err error) bool {
|
||||
_, ok := err.(errCredentialsMissingUsername)
|
||||
return ok
|
||||
}
|
||||
|
||||
// IsCredentialsMissingUsernameMessage checks for an
|
||||
// errCredentialsMissingUsername in the error message.
|
||||
func IsCredentialsMissingUsernameMessage(err string) bool {
|
||||
return err == errCredentialsMissingUsernameMessage
|
||||
}
|
||||
14
vendor/github.com/docker/docker-credential-helpers/credentials/helper.go
generated
vendored
14
vendor/github.com/docker/docker-credential-helpers/credentials/helper.go
generated
vendored
@@ -1,14 +0,0 @@
|
||||
package credentials
|
||||
|
||||
// Helper is the interface a credentials store helper must implement.
|
||||
type Helper interface {
|
||||
// Add appends credentials to the store.
|
||||
Add(*Credentials) error
|
||||
// Delete removes credentials from the store.
|
||||
Delete(serverURL string) error
|
||||
// Get retrieves credentials from the store.
|
||||
// It returns username and secret as strings.
|
||||
Get(serverURL string) (string, string, error)
|
||||
// List returns the stored serverURLs and their associated usernames.
|
||||
List() (map[string]string, error)
|
||||
}
|
||||
4
vendor/github.com/docker/docker-credential-helpers/credentials/version.go
generated
vendored
4
vendor/github.com/docker/docker-credential-helpers/credentials/version.go
generated
vendored
@@ -1,4 +0,0 @@
|
||||
package credentials
|
||||
|
||||
// Version holds a string describing the current version
|
||||
const Version = "0.5.2"
|
||||
19
vendor/github.com/docker/docker-credential-helpers/deb/Dockerfile
generated
vendored
19
vendor/github.com/docker/docker-credential-helpers/deb/Dockerfile
generated
vendored
@@ -1,19 +0,0 @@
|
||||
FROM ubuntu:xenial
|
||||
|
||||
ARG VERSION
|
||||
ARG DISTRO
|
||||
|
||||
RUN apt-get update && apt-get install -yy debhelper dh-make golang-go libsecret-1-dev
|
||||
RUN mkdir -p /build
|
||||
|
||||
WORKDIR /build
|
||||
ENV GOPATH /build
|
||||
|
||||
COPY Makefile .
|
||||
COPY credentials credentials
|
||||
COPY secretservice secretservice
|
||||
COPY pass pass
|
||||
COPY deb/debian ./debian
|
||||
COPY deb/build-deb .
|
||||
|
||||
RUN /build/build-deb ${VERSION} ${DISTRO}
|
||||
26
vendor/github.com/docker/docker-credential-helpers/deb/build-deb
generated
vendored
26
vendor/github.com/docker/docker-credential-helpers/deb/build-deb
generated
vendored
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -x
|
||||
set -e
|
||||
|
||||
version=$1
|
||||
distro=$2
|
||||
|
||||
maintainer=$(awk -F ': ' '$1 == "Maintainer" { print $2; exit }' debian/control)
|
||||
|
||||
cat > "debian/changelog" <<-EOF
|
||||
docker-credential-helpers ($version) $DISTRO; urgency=low
|
||||
|
||||
* New upstream version
|
||||
|
||||
-- $maintainer $(date --rfc-2822)
|
||||
EOF
|
||||
|
||||
mkdir -p src/github.com/docker/docker-credential-helpers
|
||||
ln -s /build/credentials /build/src/github.com/docker/docker-credential-helpers/credentials
|
||||
ln -s /build/secretservice /build/src/github.com/docker/docker-credential-helpers/secretservice
|
||||
ln -s /build/pass /build/src/github.com/docker/docker-credential-helpers/pass
|
||||
|
||||
dpkg-buildpackage -us -uc
|
||||
|
||||
mkdir /release
|
||||
mv /docker-credential-* /release
|
||||
1
vendor/github.com/docker/docker-credential-helpers/deb/debian/compat
generated
vendored
1
vendor/github.com/docker/docker-credential-helpers/deb/debian/compat
generated
vendored
@@ -1 +0,0 @@
|
||||
9
|
||||
25
vendor/github.com/docker/docker-credential-helpers/deb/debian/control
generated
vendored
25
vendor/github.com/docker/docker-credential-helpers/deb/debian/control
generated
vendored
@@ -1,25 +0,0 @@
|
||||
Source: docker-credential-helpers
|
||||
Section: admin
|
||||
Priority: optional
|
||||
Maintainer: Docker <support@docker.com>
|
||||
Homepage: https://dockerproject.org
|
||||
Standards-Version: 3.9.6
|
||||
Vcs-Browser: https://github.com/docker/docker-credential-helpers
|
||||
Vcs-Git: git://github.com/docker/docker-credential-helpers.git
|
||||
Build-Depends: debhelper
|
||||
, dh-make
|
||||
, libsecret-1-dev
|
||||
|
||||
Package: docker-credential-secretservice
|
||||
Architecture: any
|
||||
Depends: libsecret-1-0
|
||||
, ${misc:Depends}
|
||||
Description: docker-credential-secretservice is a credential helper backend
|
||||
which uses libsecret to keep Docker credentials safe.
|
||||
|
||||
Package: docker-credential-pass
|
||||
Architecture: any
|
||||
Depends: pass
|
||||
, ${misc:Depends}
|
||||
Description: docker-credential-secretservice is a credential helper backend
|
||||
which uses the pass utility to keep Docker credentials safe.
|
||||
@@ -1 +0,0 @@
|
||||
debian/tmp/usr/bin/docker-credential-pass
|
||||
@@ -1 +0,0 @@
|
||||
debian/tmp/usr/bin/docker-credential-secretservice
|
||||
17
vendor/github.com/docker/docker-credential-helpers/deb/debian/rules
generated
vendored
17
vendor/github.com/docker/docker-credential-helpers/deb/debian/rules
generated
vendored
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
DESTDIR := $(CURDIR)/debian/tmp
|
||||
|
||||
override_dh_auto_build:
|
||||
make secretservice pass
|
||||
|
||||
override_dh_auto_install:
|
||||
install -D bin/docker-credential-secretservice $(DESTDIR)/usr/bin/docker-credential-secretservice
|
||||
install -D bin/docker-credential-pass $(DESTDIR)/usr/bin/docker-credential-pass
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
override_dh_auto_test:
|
||||
# no tests
|
||||
|
||||
10
vendor/github.com/docker/docker-credential-helpers/osxkeychain/cmd/main_darwin.go
generated
vendored
10
vendor/github.com/docker/docker-credential-helpers/osxkeychain/cmd/main_darwin.go
generated
vendored
@@ -1,10 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
"github.com/docker/docker-credential-helpers/osxkeychain"
|
||||
)
|
||||
|
||||
func main() {
|
||||
credentials.Serve(osxkeychain.Osxkeychain{})
|
||||
}
|
||||
228
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.c
generated
vendored
228
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.c
generated
vendored
@@ -1,228 +0,0 @@
|
||||
#include "osxkeychain_darwin.h"
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <Foundation/NSValue.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
char *get_error(OSStatus status) {
|
||||
char *buf = malloc(128);
|
||||
CFStringRef str = SecCopyErrorMessageString(status, NULL);
|
||||
int success = CFStringGetCString(str, buf, 128, kCFStringEncodingUTF8);
|
||||
if (!success) {
|
||||
strncpy(buf, "Unknown error", 128);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *keychain_add(struct Server *server, char *label, char *username, char *secret) {
|
||||
SecKeychainItemRef item;
|
||||
|
||||
OSStatus status = SecKeychainAddInternetPassword(
|
||||
NULL,
|
||||
strlen(server->host), server->host,
|
||||
0, NULL,
|
||||
strlen(username), username,
|
||||
strlen(server->path), server->path,
|
||||
server->port,
|
||||
server->proto,
|
||||
kSecAuthenticationTypeDefault,
|
||||
strlen(secret), secret,
|
||||
&item
|
||||
);
|
||||
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
|
||||
SecKeychainAttribute attribute;
|
||||
SecKeychainAttributeList attrs;
|
||||
attribute.tag = kSecLabelItemAttr;
|
||||
attribute.data = label;
|
||||
attribute.length = strlen(label);
|
||||
attrs.count = 1;
|
||||
attrs.attr = &attribute;
|
||||
|
||||
status = SecKeychainItemModifyContent(item, &attrs, 0, NULL);
|
||||
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *keychain_get(struct Server *server, unsigned int *username_l, char **username, unsigned int *secret_l, char **secret) {
|
||||
char *tmp;
|
||||
SecKeychainItemRef item;
|
||||
|
||||
OSStatus status = SecKeychainFindInternetPassword(
|
||||
NULL,
|
||||
strlen(server->host), server->host,
|
||||
0, NULL,
|
||||
0, NULL,
|
||||
strlen(server->path), server->path,
|
||||
server->port,
|
||||
server->proto,
|
||||
kSecAuthenticationTypeDefault,
|
||||
secret_l, (void **)&tmp,
|
||||
&item);
|
||||
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
|
||||
*secret = strdup(tmp);
|
||||
SecKeychainItemFreeContent(NULL, tmp);
|
||||
|
||||
SecKeychainAttributeList list;
|
||||
SecKeychainAttribute attr;
|
||||
|
||||
list.count = 1;
|
||||
list.attr = &attr;
|
||||
attr.tag = kSecAccountItemAttr;
|
||||
|
||||
status = SecKeychainItemCopyContent(item, NULL, &list, NULL, NULL);
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
|
||||
*username = strdup(attr.data);
|
||||
*username_l = attr.length;
|
||||
SecKeychainItemFreeContent(&list, NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *keychain_delete(struct Server *server) {
|
||||
SecKeychainItemRef item;
|
||||
|
||||
OSStatus status = SecKeychainFindInternetPassword(
|
||||
NULL,
|
||||
strlen(server->host), server->host,
|
||||
0, NULL,
|
||||
0, NULL,
|
||||
strlen(server->path), server->path,
|
||||
server->port,
|
||||
server->proto,
|
||||
kSecAuthenticationTypeDefault,
|
||||
0, NULL,
|
||||
&item);
|
||||
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
|
||||
status = SecKeychainItemDelete(item);
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char * CFStringToCharArr(CFStringRef aString) {
|
||||
if (aString == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
CFIndex length = CFStringGetLength(aString);
|
||||
CFIndex maxSize =
|
||||
CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
|
||||
char *buffer = (char *)malloc(maxSize);
|
||||
if (CFStringGetCString(aString, buffer, maxSize,
|
||||
kCFStringEncodingUTF8)) {
|
||||
return buffer;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *keychain_list(char *credsLabel, char *** paths, char *** accts, unsigned int *list_l) {
|
||||
CFStringRef credsLabelCF = CFStringCreateWithCString(NULL, credsLabel, kCFStringEncodingUTF8);
|
||||
CFMutableDictionaryRef query = CFDictionaryCreateMutable (NULL, 1, NULL, NULL);
|
||||
CFDictionaryAddValue(query, kSecClass, kSecClassInternetPassword);
|
||||
CFDictionaryAddValue(query, kSecReturnAttributes, kCFBooleanTrue);
|
||||
CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitAll);
|
||||
CFDictionaryAddValue(query, kSecAttrLabel, credsLabelCF);
|
||||
//Use this query dictionary
|
||||
CFTypeRef result= NULL;
|
||||
OSStatus status = SecItemCopyMatching(
|
||||
query,
|
||||
&result);
|
||||
|
||||
CFRelease(credsLabelCF);
|
||||
|
||||
//Ran a search and store the results in result
|
||||
if (status) {
|
||||
return get_error(status);
|
||||
}
|
||||
CFIndex numKeys = CFArrayGetCount(result);
|
||||
*paths = (char **) malloc((int)sizeof(char *)*numKeys);
|
||||
*accts = (char **) malloc((int)sizeof(char *)*numKeys);
|
||||
//result is of type CFArray
|
||||
for(CFIndex i=0; i<numKeys; i++) {
|
||||
CFDictionaryRef currKey = CFArrayGetValueAtIndex(result,i);
|
||||
|
||||
CFStringRef protocolTmp = CFDictionaryGetValue(currKey, CFSTR("ptcl"));
|
||||
if (protocolTmp != NULL) {
|
||||
CFStringRef protocolStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@"), protocolTmp);
|
||||
if (CFStringCompare(protocolStr, CFSTR("htps"), 0) == kCFCompareEqualTo) {
|
||||
protocolTmp = CFSTR("https://");
|
||||
}
|
||||
else {
|
||||
protocolTmp = CFSTR("http://");
|
||||
}
|
||||
CFRelease(protocolStr);
|
||||
}
|
||||
else {
|
||||
char * path = "0";
|
||||
char * acct = "0";
|
||||
(*paths)[i] = (char *) malloc(sizeof(char)*(strlen(path)));
|
||||
memcpy((*paths)[i], path, sizeof(char)*(strlen(path)));
|
||||
(*accts)[i] = (char *) malloc(sizeof(char)*(strlen(acct)));
|
||||
memcpy((*accts)[i], acct, sizeof(char)*(strlen(acct)));
|
||||
continue;
|
||||
}
|
||||
|
||||
CFMutableStringRef str = CFStringCreateMutableCopy(NULL, 0, protocolTmp);
|
||||
CFStringRef serverTmp = CFDictionaryGetValue(currKey, CFSTR("srvr"));
|
||||
if (serverTmp != NULL) {
|
||||
CFStringAppend(str, serverTmp);
|
||||
}
|
||||
|
||||
CFStringRef pathTmp = CFDictionaryGetValue(currKey, CFSTR("path"));
|
||||
if (pathTmp != NULL) {
|
||||
CFStringAppend(str, pathTmp);
|
||||
}
|
||||
|
||||
const NSNumber * portTmp = CFDictionaryGetValue(currKey, CFSTR("port"));
|
||||
if (portTmp != NULL && portTmp.integerValue != 0) {
|
||||
CFStringRef portStr = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@"), portTmp);
|
||||
CFStringAppend(str, CFSTR(":"));
|
||||
CFStringAppend(str, portStr);
|
||||
CFRelease(portStr);
|
||||
}
|
||||
|
||||
CFStringRef acctTmp = CFDictionaryGetValue(currKey, CFSTR("acct"));
|
||||
if (acctTmp == NULL) {
|
||||
acctTmp = CFSTR("account not defined");
|
||||
}
|
||||
|
||||
char * path = CFStringToCharArr(str);
|
||||
char * acct = CFStringToCharArr(acctTmp);
|
||||
|
||||
//We now have all we need, username and servername. Now export this to .go
|
||||
(*paths)[i] = (char *) malloc(sizeof(char)*(strlen(path)+1));
|
||||
memcpy((*paths)[i], path, sizeof(char)*(strlen(path)+1));
|
||||
(*accts)[i] = (char *) malloc(sizeof(char)*(strlen(acct)+1));
|
||||
memcpy((*accts)[i], acct, sizeof(char)*(strlen(acct)+1));
|
||||
|
||||
CFRelease(str);
|
||||
}
|
||||
*list_l = (int)numKeys;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void freeListData(char *** data, unsigned int length) {
|
||||
for(int i=0; i<length; i++) {
|
||||
free((*data)[i]);
|
||||
}
|
||||
free(*data);
|
||||
}
|
||||
196
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.go
generated
vendored
196
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.go
generated
vendored
@@ -1,196 +0,0 @@
|
||||
package osxkeychain
|
||||
|
||||
/*
|
||||
#cgo CFLAGS: -x objective-c -mmacosx-version-min=10.10
|
||||
#cgo LDFLAGS: -framework Security -framework Foundation -mmacosx-version-min=10.10
|
||||
|
||||
#include "osxkeychain_darwin.h"
|
||||
#include <stdlib.h>
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"errors"
|
||||
"net/url"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unsafe"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
// errCredentialsNotFound is the specific error message returned by OS X
|
||||
// when the credentials are not in the keychain.
|
||||
const errCredentialsNotFound = "The specified item could not be found in the keychain."
|
||||
|
||||
// Osxkeychain handles secrets using the OS X Keychain as store.
|
||||
type Osxkeychain struct{}
|
||||
|
||||
// Add adds new credentials to the keychain.
|
||||
func (h Osxkeychain) Add(creds *credentials.Credentials) error {
|
||||
h.Delete(creds.ServerURL)
|
||||
|
||||
s, err := splitServer(creds.ServerURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer freeServer(s)
|
||||
|
||||
label := C.CString(credentials.CredsLabel)
|
||||
defer C.free(unsafe.Pointer(label))
|
||||
username := C.CString(creds.Username)
|
||||
defer C.free(unsafe.Pointer(username))
|
||||
secret := C.CString(creds.Secret)
|
||||
defer C.free(unsafe.Pointer(secret))
|
||||
|
||||
errMsg := C.keychain_add(s, label, username, secret)
|
||||
if errMsg != nil {
|
||||
defer C.free(unsafe.Pointer(errMsg))
|
||||
return errors.New(C.GoString(errMsg))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete removes credentials from the keychain.
|
||||
func (h Osxkeychain) Delete(serverURL string) error {
|
||||
s, err := splitServer(serverURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer freeServer(s)
|
||||
|
||||
errMsg := C.keychain_delete(s)
|
||||
if errMsg != nil {
|
||||
defer C.free(unsafe.Pointer(errMsg))
|
||||
return errors.New(C.GoString(errMsg))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get returns the username and secret to use for a given registry server URL.
|
||||
func (h Osxkeychain) Get(serverURL string) (string, string, error) {
|
||||
s, err := splitServer(serverURL)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
defer freeServer(s)
|
||||
|
||||
var usernameLen C.uint
|
||||
var username *C.char
|
||||
var secretLen C.uint
|
||||
var secret *C.char
|
||||
defer C.free(unsafe.Pointer(username))
|
||||
defer C.free(unsafe.Pointer(secret))
|
||||
|
||||
errMsg := C.keychain_get(s, &usernameLen, &username, &secretLen, &secret)
|
||||
if errMsg != nil {
|
||||
defer C.free(unsafe.Pointer(errMsg))
|
||||
goMsg := C.GoString(errMsg)
|
||||
if goMsg == errCredentialsNotFound {
|
||||
return "", "", credentials.NewErrCredentialsNotFound()
|
||||
}
|
||||
|
||||
return "", "", errors.New(goMsg)
|
||||
}
|
||||
|
||||
user := C.GoStringN(username, C.int(usernameLen))
|
||||
pass := C.GoStringN(secret, C.int(secretLen))
|
||||
return user, pass, nil
|
||||
}
|
||||
|
||||
// List returns the stored URLs and corresponding usernames.
|
||||
func (h Osxkeychain) List() (map[string]string, error) {
|
||||
credsLabelC := C.CString(credentials.CredsLabel)
|
||||
defer C.free(unsafe.Pointer(credsLabelC))
|
||||
|
||||
var pathsC **C.char
|
||||
defer C.free(unsafe.Pointer(pathsC))
|
||||
var acctsC **C.char
|
||||
defer C.free(unsafe.Pointer(acctsC))
|
||||
var listLenC C.uint
|
||||
errMsg := C.keychain_list(credsLabelC, &pathsC, &acctsC, &listLenC)
|
||||
if errMsg != nil {
|
||||
defer C.free(unsafe.Pointer(errMsg))
|
||||
goMsg := C.GoString(errMsg)
|
||||
return nil, errors.New(goMsg)
|
||||
}
|
||||
|
||||
defer C.freeListData(&pathsC, listLenC)
|
||||
defer C.freeListData(&acctsC, listLenC)
|
||||
|
||||
var listLen int
|
||||
listLen = int(listLenC)
|
||||
pathTmp := (*[1 << 30]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
|
||||
acctTmp := (*[1 << 30]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
|
||||
//taking the array of c strings into go while ignoring all the stuff irrelevant to credentials-helper
|
||||
resp := make(map[string]string)
|
||||
for i := 0; i < listLen; i++ {
|
||||
if C.GoString(pathTmp[i]) == "0" {
|
||||
continue
|
||||
}
|
||||
resp[C.GoString(pathTmp[i])] = C.GoString(acctTmp[i])
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func splitServer(serverURL string) (*C.struct_Server, error) {
|
||||
u, err := parseURL(serverURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
proto := C.kSecProtocolTypeHTTPS
|
||||
if u.Scheme == "http" {
|
||||
proto = C.kSecProtocolTypeHTTP
|
||||
}
|
||||
var port int
|
||||
p := getPort(u)
|
||||
if p != "" {
|
||||
port, err = strconv.Atoi(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return &C.struct_Server{
|
||||
proto: C.SecProtocolType(proto),
|
||||
host: C.CString(getHostname(u)),
|
||||
port: C.uint(port),
|
||||
path: C.CString(u.Path),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func freeServer(s *C.struct_Server) {
|
||||
C.free(unsafe.Pointer(s.host))
|
||||
C.free(unsafe.Pointer(s.path))
|
||||
}
|
||||
|
||||
// parseURL parses and validates a given serverURL to an url.URL, and
|
||||
// returns an error if validation failed. Querystring parameters are
|
||||
// omitted in the resulting URL, because they are not used in the helper.
|
||||
//
|
||||
// If serverURL does not have a valid scheme, `//` is used as scheme
|
||||
// before parsing. This prevents the hostname being used as path,
|
||||
// and the credentials being stored without host.
|
||||
func parseURL(serverURL string) (*url.URL, error) {
|
||||
// Check if serverURL has a scheme, otherwise add `//` as scheme.
|
||||
if !strings.Contains(serverURL, "://") && !strings.HasPrefix(serverURL, "//") {
|
||||
serverURL = "//" + serverURL
|
||||
}
|
||||
|
||||
u, err := url.Parse(serverURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if u.Scheme != "" && u.Scheme != "https" && u.Scheme != "http" {
|
||||
return nil, errors.New("unsupported scheme: " + u.Scheme)
|
||||
}
|
||||
if getHostname(u) == "" {
|
||||
return nil, errors.New("no hostname in URL")
|
||||
}
|
||||
|
||||
u.RawQuery = ""
|
||||
return u, nil
|
||||
}
|
||||
14
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.h
generated
vendored
14
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin.h
generated
vendored
@@ -1,14 +0,0 @@
|
||||
#include <Security/Security.h>
|
||||
|
||||
struct Server {
|
||||
SecProtocolType proto;
|
||||
char *host;
|
||||
char *path;
|
||||
unsigned int port;
|
||||
};
|
||||
|
||||
char *keychain_add(struct Server *server, char *label, char *username, char *secret);
|
||||
char *keychain_get(struct Server *server, unsigned int *username_l, char **username, unsigned int *secret_l, char **secret);
|
||||
char *keychain_delete(struct Server *server);
|
||||
char *keychain_list(char *credsLabel, char *** data, char *** accts, unsigned int *list_l);
|
||||
void freeListData(char *** data, unsigned int length);
|
||||
253
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin_test.go
generated
vendored
253
vendor/github.com/docker/docker-credential-helpers/osxkeychain/osxkeychain_darwin_test.go
generated
vendored
@@ -1,253 +0,0 @@
|
||||
package osxkeychain
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestOSXKeychainHelper(t *testing.T) {
|
||||
creds := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v1",
|
||||
Username: "foobar",
|
||||
Secret: "foobarbaz",
|
||||
}
|
||||
creds1 := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v2",
|
||||
Username: "foobarbaz",
|
||||
Secret: "foobar",
|
||||
}
|
||||
helper := Osxkeychain{}
|
||||
if err := helper.Add(creds); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
username, secret, err := helper.Get(creds.ServerURL)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if username != "foobar" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobar", username)
|
||||
}
|
||||
|
||||
if secret != "foobarbaz" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobarbaz", secret)
|
||||
}
|
||||
|
||||
auths, err := helper.List()
|
||||
if err != nil || len(auths) == 0 {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
helper.Add(creds1)
|
||||
defer helper.Delete(creds1.ServerURL)
|
||||
newauths, err := helper.List()
|
||||
if len(newauths)-len(auths) != 1 {
|
||||
if err == nil {
|
||||
t.Fatalf("Error: len(newauths): %d, len(auths): %d", len(newauths), len(auths))
|
||||
}
|
||||
t.Fatalf("Error: len(newauths): %d, len(auths): %d\n Error= %v", len(newauths), len(auths), err)
|
||||
}
|
||||
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
// TestOSXKeychainHelperParseURL verifies that a // "scheme" is added to URLs,
|
||||
// and that invalid URLs produce an error.
|
||||
func TestOSXKeychainHelperParseURL(t *testing.T) {
|
||||
tests := []struct {
|
||||
url string
|
||||
expectedURL string
|
||||
err error
|
||||
}{
|
||||
{url: "foobar.docker.io", expectedURL: "//foobar.docker.io"},
|
||||
{url: "foobar.docker.io:2376", expectedURL: "//foobar.docker.io:2376"},
|
||||
{url: "//foobar.docker.io:2376", expectedURL: "//foobar.docker.io:2376"},
|
||||
{url: "http://foobar.docker.io:2376", expectedURL: "http://foobar.docker.io:2376"},
|
||||
{url: "https://foobar.docker.io:2376", expectedURL: "https://foobar.docker.io:2376"},
|
||||
{url: "https://foobar.docker.io:2376/some/path", expectedURL: "https://foobar.docker.io:2376/some/path"},
|
||||
{url: "https://foobar.docker.io:2376/some/other/path?foo=bar", expectedURL: "https://foobar.docker.io:2376/some/other/path"},
|
||||
{url: "/foobar.docker.io", err: errors.New("no hostname in URL")},
|
||||
{url: "ftp://foobar.docker.io:2376", err: errors.New("unsupported scheme: ftp")},
|
||||
}
|
||||
|
||||
for _, te := range tests {
|
||||
u, err := parseURL(te.url)
|
||||
|
||||
if te.err == nil && err != nil {
|
||||
t.Errorf("Error: failed to parse URL %q: %s", te.url, err)
|
||||
continue
|
||||
}
|
||||
if te.err != nil && err == nil {
|
||||
t.Errorf("Error: expected error %q, got none when parsing URL %q", te.err, te.url)
|
||||
continue
|
||||
}
|
||||
if te.err != nil && err.Error() != te.err.Error() {
|
||||
t.Errorf("Error: expected error %q, got %q when parsing URL %q", te.err, err, te.url)
|
||||
continue
|
||||
}
|
||||
if u != nil && u.String() != te.expectedURL {
|
||||
t.Errorf("Error: expected URL: %q, but got %q for URL: %q", te.expectedURL, u.String(), te.url)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestOSXKeychainHelperRetrieveAliases verifies that secrets can be accessed
|
||||
// through variations on the URL
|
||||
func TestOSXKeychainHelperRetrieveAliases(t *testing.T) {
|
||||
tests := []struct {
|
||||
storeURL string
|
||||
readURL string
|
||||
}{
|
||||
// stored with port, retrieved without
|
||||
{"https://foobar.docker.io:2376", "https://foobar.docker.io"},
|
||||
|
||||
// stored as https, retrieved without scheme
|
||||
{"https://foobar.docker.io:2376", "foobar.docker.io"},
|
||||
|
||||
// stored with path, retrieved without
|
||||
{"https://foobar.docker.io:1234/one/two", "https://foobar.docker.io:1234"},
|
||||
}
|
||||
|
||||
helper := Osxkeychain{}
|
||||
defer func() {
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
}()
|
||||
|
||||
// Clean store before testing.
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
|
||||
for _, te := range tests {
|
||||
c := &credentials.Credentials{ServerURL: te.storeURL, Username: "hello", Secret: "world"}
|
||||
if err := helper.Add(c); err != nil {
|
||||
t.Errorf("Error: failed to store secret for URL %q: %s", te.storeURL, err)
|
||||
continue
|
||||
}
|
||||
if _, _, err := helper.Get(te.readURL); err != nil {
|
||||
t.Errorf("Error: failed to read secret for URL %q using %q", te.storeURL, te.readURL)
|
||||
}
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
}
|
||||
|
||||
// TestOSXKeychainHelperRetrieveStrict verifies that only matching secrets are
|
||||
// returned.
|
||||
func TestOSXKeychainHelperRetrieveStrict(t *testing.T) {
|
||||
tests := []struct {
|
||||
storeURL string
|
||||
readURL string
|
||||
}{
|
||||
// stored as https, retrieved using http
|
||||
{"https://foobar.docker.io:2376", "http://foobar.docker.io:2376"},
|
||||
|
||||
// stored as http, retrieved using https
|
||||
{"http://foobar.docker.io:2376", "https://foobar.docker.io:2376"},
|
||||
|
||||
// same: stored as http, retrieved without a scheme specified (hence, using the default https://)
|
||||
{"http://foobar.docker.io", "foobar.docker.io:5678"},
|
||||
|
||||
// non-matching ports
|
||||
{"https://foobar.docker.io:1234", "https://foobar.docker.io:5678"},
|
||||
|
||||
// non-matching ports TODO is this desired behavior? The other way round does work
|
||||
//{"https://foobar.docker.io", "https://foobar.docker.io:5678"},
|
||||
|
||||
// non-matching paths
|
||||
{"https://foobar.docker.io:1234/one/two", "https://foobar.docker.io:1234/five/six"},
|
||||
}
|
||||
|
||||
helper := Osxkeychain{}
|
||||
defer func() {
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
}()
|
||||
|
||||
// Clean store before testing.
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
|
||||
for _, te := range tests {
|
||||
c := &credentials.Credentials{ServerURL: te.storeURL, Username: "hello", Secret: "world"}
|
||||
if err := helper.Add(c); err != nil {
|
||||
t.Errorf("Error: failed to store secret for URL %q: %s", te.storeURL, err)
|
||||
continue
|
||||
}
|
||||
if _, _, err := helper.Get(te.readURL); err == nil {
|
||||
t.Errorf("Error: managed to read secret for URL %q using %q, but should not be able to", te.storeURL, te.readURL)
|
||||
}
|
||||
helper.Delete(te.storeURL)
|
||||
}
|
||||
}
|
||||
|
||||
// TestOSXKeychainHelperStoreRetrieve verifies that secrets stored in the
|
||||
// the keychain can be read back using the URL that was used to store them.
|
||||
func TestOSXKeychainHelperStoreRetrieve(t *testing.T) {
|
||||
tests := []struct {
|
||||
url string
|
||||
}{
|
||||
{url: "foobar.docker.io"},
|
||||
{url: "foobar.docker.io:2376"},
|
||||
{url: "//foobar.docker.io:2376"},
|
||||
{url: "https://foobar.docker.io:2376"},
|
||||
{url: "http://foobar.docker.io:2376"},
|
||||
{url: "https://foobar.docker.io:2376/some/path"},
|
||||
{url: "https://foobar.docker.io:2376/some/other/path"},
|
||||
{url: "https://foobar.docker.io:2376/some/other/path?foo=bar"},
|
||||
}
|
||||
|
||||
helper := Osxkeychain{}
|
||||
defer func() {
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.url)
|
||||
}
|
||||
}()
|
||||
|
||||
// Clean store before testing.
|
||||
for _, te := range tests {
|
||||
helper.Delete(te.url)
|
||||
}
|
||||
|
||||
// Note that we don't delete between individual tests here, to verify that
|
||||
// subsequent stores/overwrites don't affect storing / retrieving secrets.
|
||||
for i, te := range tests {
|
||||
c := &credentials.Credentials{
|
||||
ServerURL: te.url,
|
||||
Username: fmt.Sprintf("user-%d", i),
|
||||
Secret: fmt.Sprintf("secret-%d", i),
|
||||
}
|
||||
|
||||
if err := helper.Add(c); err != nil {
|
||||
t.Errorf("Error: failed to store secret for URL: %s: %s", te.url, err)
|
||||
continue
|
||||
}
|
||||
user, secret, err := helper.Get(te.url)
|
||||
if err != nil {
|
||||
t.Errorf("Error: failed to read secret for URL %q: %s", te.url, err)
|
||||
continue
|
||||
}
|
||||
if user != c.Username {
|
||||
t.Errorf("Error: expected username %s, got username %s for URL: %s", c.Username, user, te.url)
|
||||
}
|
||||
if secret != c.Secret {
|
||||
t.Errorf("Error: expected secret %s, got secret %s for URL: %s", c.Secret, secret, te.url)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestMissingCredentials(t *testing.T) {
|
||||
helper := Osxkeychain{}
|
||||
_, _, err := helper.Get("https://adsfasdf.wrewerwer.com/asdfsdddd")
|
||||
if !credentials.IsErrCredentialsNotFound(err) {
|
||||
t.Fatalf("expected ErrCredentialsNotFound, got %v", err)
|
||||
}
|
||||
}
|
||||
13
vendor/github.com/docker/docker-credential-helpers/osxkeychain/url_go18.go
generated
vendored
13
vendor/github.com/docker/docker-credential-helpers/osxkeychain/url_go18.go
generated
vendored
@@ -1,13 +0,0 @@
|
||||
//+build go1.8
|
||||
|
||||
package osxkeychain
|
||||
|
||||
import "net/url"
|
||||
|
||||
func getHostname(u *url.URL) string {
|
||||
return u.Hostname()
|
||||
}
|
||||
|
||||
func getPort(u *url.URL) string {
|
||||
return u.Port()
|
||||
}
|
||||
41
vendor/github.com/docker/docker-credential-helpers/osxkeychain/url_non_go18.go
generated
vendored
41
vendor/github.com/docker/docker-credential-helpers/osxkeychain/url_non_go18.go
generated
vendored
@@ -1,41 +0,0 @@
|
||||
//+build !go1.8
|
||||
|
||||
package osxkeychain
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func getHostname(u *url.URL) string {
|
||||
return stripPort(u.Host)
|
||||
}
|
||||
|
||||
func getPort(u *url.URL) string {
|
||||
return portOnly(u.Host)
|
||||
}
|
||||
|
||||
func stripPort(hostport string) string {
|
||||
colon := strings.IndexByte(hostport, ':')
|
||||
if colon == -1 {
|
||||
return hostport
|
||||
}
|
||||
if i := strings.IndexByte(hostport, ']'); i != -1 {
|
||||
return strings.TrimPrefix(hostport[:i], "[")
|
||||
}
|
||||
return hostport[:colon]
|
||||
}
|
||||
|
||||
func portOnly(hostport string) string {
|
||||
colon := strings.IndexByte(hostport, ':')
|
||||
if colon == -1 {
|
||||
return ""
|
||||
}
|
||||
if i := strings.Index(hostport, "]:"); i != -1 {
|
||||
return hostport[i+len("]:"):]
|
||||
}
|
||||
if strings.Contains(hostport, "]") {
|
||||
return ""
|
||||
}
|
||||
return hostport[colon+len(":"):]
|
||||
}
|
||||
10
vendor/github.com/docker/docker-credential-helpers/pass/cmd/main_linux.go
generated
vendored
10
vendor/github.com/docker/docker-credential-helpers/pass/cmd/main_linux.go
generated
vendored
@@ -1,10 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
"github.com/docker/docker-credential-helpers/pass"
|
||||
)
|
||||
|
||||
func main() {
|
||||
credentials.Serve(pass.Pass{})
|
||||
}
|
||||
221
vendor/github.com/docker/docker-credential-helpers/pass/pass_linux.go
generated
vendored
221
vendor/github.com/docker/docker-credential-helpers/pass/pass_linux.go
generated
vendored
@@ -1,221 +0,0 @@
|
||||
// A `pass` based credential helper. Passwords are stored as arguments to pass
|
||||
// of the form: "$PASS_FOLDER/base64-url(serverURL)/username". We base64-url
|
||||
// encode the serverURL, because under the hood pass uses files and folders, so
|
||||
// /s will get translated into additional folders.
|
||||
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
|
||||
}
|
||||
|
||||
func getPassDir() string {
|
||||
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
|
||||
}
|
||||
|
||||
return passDir
|
||||
}
|
||||
|
||||
// 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 := getPassDir()
|
||||
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))
|
||||
|
||||
if _, err := os.Stat(path.Join(getPassDir(), PASS_FOLDER, encoded)); err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return "", "", nil;
|
||||
}
|
||||
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
75
vendor/github.com/docker/docker-credential-helpers/pass/pass_linux_test.go
generated
vendored
75
vendor/github.com/docker/docker-credential-helpers/pass/pass_linux_test.go
generated
vendored
@@ -1,75 +0,0 @@
|
||||
package pass
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
func TestPassHelper(t *testing.T) {
|
||||
helper := Pass{}
|
||||
|
||||
creds := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v1",
|
||||
Username: "nothing",
|
||||
Secret: "isthebestmeshuggahalbum",
|
||||
}
|
||||
|
||||
helper.Add(creds)
|
||||
|
||||
creds.ServerURL = "https://foobar.docker.io:9999/v2"
|
||||
helper.Add(creds)
|
||||
|
||||
credsList, err := helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for server, username := range credsList {
|
||||
if !(strings.Contains(server, "2376") ||
|
||||
strings.Contains(server, "9999")) {
|
||||
t.Fatalf("invalid url: %s", creds.ServerURL)
|
||||
}
|
||||
|
||||
if username != "nothing" {
|
||||
t.Fatalf("invalid username: %v", username)
|
||||
}
|
||||
|
||||
u, s, err := helper.Get(server)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if u != username {
|
||||
t.Fatalf("invalid username %s", u)
|
||||
}
|
||||
|
||||
if s != "isthebestmeshuggahalbum" {
|
||||
t.Fatalf("invalid secret: %s", s)
|
||||
}
|
||||
|
||||
err = helper.Delete(server)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
username, _, err = helper.Get(server)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if username != "" {
|
||||
t.Fatalf("%s shouldn't exist any more", username)
|
||||
}
|
||||
}
|
||||
|
||||
credsList, err = helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(credsList) != 0 {
|
||||
t.Fatal("didn't delete all creds?")
|
||||
}
|
||||
}
|
||||
10
vendor/github.com/docker/docker-credential-helpers/secretservice/cmd/main_linux.go
generated
vendored
10
vendor/github.com/docker/docker-credential-helpers/secretservice/cmd/main_linux.go
generated
vendored
@@ -1,10 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
"github.com/docker/docker-credential-helpers/secretservice"
|
||||
)
|
||||
|
||||
func main() {
|
||||
credentials.Serve(secretservice.Secretservice{})
|
||||
}
|
||||
162
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.c
generated
vendored
162
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.c
generated
vendored
@@ -1,162 +0,0 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "secretservice_linux.h"
|
||||
|
||||
const SecretSchema *docker_get_schema(void)
|
||||
{
|
||||
static const SecretSchema docker_schema = {
|
||||
"io.docker.Credentials", SECRET_SCHEMA_NONE,
|
||||
{
|
||||
{ "label", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "server", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "username", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "docker_cli", SECRET_SCHEMA_ATTRIBUTE_STRING },
|
||||
{ "NULL", 0 },
|
||||
}
|
||||
};
|
||||
return &docker_schema;
|
||||
}
|
||||
|
||||
GError *add(char *label, char *server, char *username, char *secret) {
|
||||
GError *err = NULL;
|
||||
|
||||
secret_password_store_sync (DOCKER_SCHEMA, SECRET_COLLECTION_DEFAULT,
|
||||
server, secret, NULL, &err,
|
||||
"label", label,
|
||||
"server", server,
|
||||
"username", username,
|
||||
"docker_cli", "1",
|
||||
NULL);
|
||||
return err;
|
||||
}
|
||||
|
||||
GError *delete(char *server) {
|
||||
GError *err = NULL;
|
||||
|
||||
secret_password_clear_sync(DOCKER_SCHEMA, NULL, &err,
|
||||
"server", server,
|
||||
"docker_cli", "1",
|
||||
NULL);
|
||||
if (err != NULL)
|
||||
return err;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *get_attribute(const char *attribute, SecretItem *item) {
|
||||
GHashTable *attributes;
|
||||
GHashTableIter iter;
|
||||
gchar *value, *key;
|
||||
|
||||
attributes = secret_item_get_attributes(item);
|
||||
g_hash_table_iter_init(&iter, attributes);
|
||||
while (g_hash_table_iter_next(&iter, (void **)&key, (void **)&value)) {
|
||||
if (strncmp(key, attribute, strlen(key)) == 0)
|
||||
return (char *)value;
|
||||
}
|
||||
g_hash_table_unref(attributes);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GError *get(char *server, char **username, char **secret) {
|
||||
GError *err = NULL;
|
||||
GHashTable *attributes;
|
||||
SecretService *service;
|
||||
GList *items, *l;
|
||||
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
||||
SecretValue *secretValue;
|
||||
gsize length;
|
||||
gchar *value;
|
||||
|
||||
attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
||||
g_hash_table_insert(attributes, g_strdup("server"), g_strdup(server));
|
||||
g_hash_table_insert(attributes, g_strdup("docker_cli"), g_strdup("1"));
|
||||
|
||||
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
||||
if (err == NULL) {
|
||||
items = secret_service_search_sync(service, DOCKER_SCHEMA, attributes, flags, NULL, &err);
|
||||
if (err == NULL) {
|
||||
for (l = items; l != NULL; l = g_list_next(l)) {
|
||||
value = secret_item_get_schema_name(l->data);
|
||||
if (strncmp(value, "io.docker.Credentials", strlen(value)) != 0) {
|
||||
g_free(value);
|
||||
continue;
|
||||
}
|
||||
g_free(value);
|
||||
secretValue = secret_item_get_secret(l->data);
|
||||
if (secret != NULL) {
|
||||
*secret = strdup(secret_value_get(secretValue, &length));
|
||||
secret_value_unref(secretValue);
|
||||
}
|
||||
*username = get_attribute("username", l->data);
|
||||
}
|
||||
g_list_free_full(items, g_object_unref);
|
||||
}
|
||||
g_object_unref(service);
|
||||
}
|
||||
g_hash_table_unref(attributes);
|
||||
if (err != NULL) {
|
||||
return err;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GError *list(char *ref_label, char *** paths, char *** accts, unsigned int *list_l) {
|
||||
GList *items;
|
||||
GError *err = NULL;
|
||||
SecretService *service;
|
||||
SecretSearchFlags flags = SECRET_SEARCH_LOAD_SECRETS | SECRET_SEARCH_ALL | SECRET_SEARCH_UNLOCK;
|
||||
GHashTable *attributes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
|
||||
|
||||
// List credentials with the right label only
|
||||
g_hash_table_insert(attributes, g_strdup("label"), g_strdup(ref_label));
|
||||
|
||||
service = secret_service_get_sync(SECRET_SERVICE_NONE, NULL, &err);
|
||||
if (err != NULL) {
|
||||
return err;
|
||||
}
|
||||
|
||||
items = secret_service_search_sync(service, NULL, attributes, flags, NULL, &err);
|
||||
int numKeys = g_list_length(items);
|
||||
if (err != NULL) {
|
||||
return err;
|
||||
}
|
||||
|
||||
char **tmp_paths = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
||||
char **tmp_accts = (char **) calloc(1,(int)sizeof(char *)*numKeys);
|
||||
|
||||
// items now contains our keys from the gnome keyring
|
||||
// we will now put it in our two lists to return it to go
|
||||
GList *current;
|
||||
int listNumber = 0;
|
||||
for(current = items; current!=NULL; current = current->next) {
|
||||
char *pathTmp = secret_item_get_label(current->data);
|
||||
// you cannot have a key without a label in the gnome keyring
|
||||
char *acctTmp = get_attribute("username",current->data);
|
||||
if (acctTmp==NULL) {
|
||||
acctTmp = "account not defined";
|
||||
}
|
||||
|
||||
tmp_paths[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(pathTmp)+1));
|
||||
tmp_accts[listNumber] = (char *) calloc(1, sizeof(char)*(strlen(acctTmp)+1));
|
||||
|
||||
memcpy(tmp_paths[listNumber], pathTmp, sizeof(char)*(strlen(pathTmp)+1));
|
||||
memcpy(tmp_accts[listNumber], acctTmp, sizeof(char)*(strlen(acctTmp)+1));
|
||||
|
||||
listNumber = listNumber + 1;
|
||||
}
|
||||
|
||||
*paths = (char **) realloc(tmp_paths, (int)sizeof(char *)*listNumber);
|
||||
*accts = (char **) realloc(tmp_accts, (int)sizeof(char *)*listNumber);
|
||||
|
||||
*list_l = listNumber;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void freeListData(char *** data, unsigned int length) {
|
||||
int i;
|
||||
for(i=0; i<length; i++) {
|
||||
free((*data)[i]);
|
||||
}
|
||||
free(*data);
|
||||
}
|
||||
118
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go
generated
vendored
118
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.go
generated
vendored
@@ -1,118 +0,0 @@
|
||||
package secretservice
|
||||
|
||||
/*
|
||||
#cgo pkg-config: libsecret-1
|
||||
|
||||
#include "secretservice_linux.h"
|
||||
#include <stdlib.h>
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"errors"
|
||||
"unsafe"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
// Secretservice handles secrets using Linux secret-service as a store.
|
||||
type Secretservice struct{}
|
||||
|
||||
// Add adds new credentials to the keychain.
|
||||
func (h Secretservice) Add(creds *credentials.Credentials) error {
|
||||
if creds == nil {
|
||||
return errors.New("missing credentials")
|
||||
}
|
||||
credsLabel := C.CString(credentials.CredsLabel)
|
||||
defer C.free(unsafe.Pointer(credsLabel))
|
||||
server := C.CString(creds.ServerURL)
|
||||
defer C.free(unsafe.Pointer(server))
|
||||
username := C.CString(creds.Username)
|
||||
defer C.free(unsafe.Pointer(username))
|
||||
secret := C.CString(creds.Secret)
|
||||
defer C.free(unsafe.Pointer(secret))
|
||||
|
||||
if err := C.add(credsLabel, server, username, secret); err != nil {
|
||||
defer C.g_error_free(err)
|
||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
||||
return errors.New(C.GoString(errMsg))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete removes credentials from the store.
|
||||
func (h Secretservice) Delete(serverURL string) error {
|
||||
if serverURL == "" {
|
||||
return errors.New("missing server url")
|
||||
}
|
||||
server := C.CString(serverURL)
|
||||
defer C.free(unsafe.Pointer(server))
|
||||
|
||||
if err := C.delete(server); err != nil {
|
||||
defer C.g_error_free(err)
|
||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
||||
return errors.New(C.GoString(errMsg))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get returns the username and secret to use for a given registry server URL.
|
||||
func (h Secretservice) Get(serverURL string) (string, string, error) {
|
||||
if serverURL == "" {
|
||||
return "", "", errors.New("missing server url")
|
||||
}
|
||||
var username *C.char
|
||||
defer C.free(unsafe.Pointer(username))
|
||||
var secret *C.char
|
||||
defer C.free(unsafe.Pointer(secret))
|
||||
server := C.CString(serverURL)
|
||||
defer C.free(unsafe.Pointer(server))
|
||||
|
||||
err := C.get(server, &username, &secret)
|
||||
if err != nil {
|
||||
defer C.g_error_free(err)
|
||||
errMsg := (*C.char)(unsafe.Pointer(err.message))
|
||||
return "", "", errors.New(C.GoString(errMsg))
|
||||
}
|
||||
user := C.GoString(username)
|
||||
pass := C.GoString(secret)
|
||||
if pass == "" {
|
||||
return "", "", credentials.NewErrCredentialsNotFound()
|
||||
}
|
||||
return user, pass, nil
|
||||
}
|
||||
|
||||
// List returns the stored URLs and corresponding usernames for a given credentials label
|
||||
func (h Secretservice) List() (map[string]string, error) {
|
||||
credsLabelC := C.CString(credentials.CredsLabel)
|
||||
defer C.free(unsafe.Pointer(credsLabelC))
|
||||
|
||||
var pathsC **C.char
|
||||
defer C.free(unsafe.Pointer(pathsC))
|
||||
var acctsC **C.char
|
||||
defer C.free(unsafe.Pointer(acctsC))
|
||||
var listLenC C.uint
|
||||
err := C.list(credsLabelC, &pathsC, &acctsC, &listLenC)
|
||||
if err != nil {
|
||||
defer C.free(unsafe.Pointer(err))
|
||||
return nil, errors.New("Error from list function in secretservice_linux.c likely due to error in secretservice library")
|
||||
}
|
||||
defer C.freeListData(&pathsC, listLenC)
|
||||
defer C.freeListData(&acctsC, listLenC)
|
||||
|
||||
resp := make(map[string]string)
|
||||
|
||||
listLen := int(listLenC)
|
||||
if listLen == 0 {
|
||||
return resp, nil
|
||||
}
|
||||
// The maximum capacity of the following two slices is limited to (2^29)-1 to remain compatible
|
||||
// with 32-bit platforms. The size of a `*C.char` (a pointer) is 4 Byte on a 32-bit system
|
||||
// and (2^29)*4 == math.MaxInt32 + 1. -- See issue golang/go#13656
|
||||
pathTmp := (*[(1 << 29) - 1]*C.char)(unsafe.Pointer(pathsC))[:listLen:listLen]
|
||||
acctTmp := (*[(1 << 29) - 1]*C.char)(unsafe.Pointer(acctsC))[:listLen:listLen]
|
||||
for i := 0; i < listLen; i++ {
|
||||
resp[C.GoString(pathTmp[i])] = C.GoString(acctTmp[i])
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
13
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.h
generated
vendored
13
vendor/github.com/docker/docker-credential-helpers/secretservice/secretservice_linux.h
generated
vendored
@@ -1,13 +0,0 @@
|
||||
#define SECRET_WITH_UNSTABLE 1
|
||||
#define SECRET_API_SUBJECT_TO_CHANGE 1
|
||||
#include <libsecret/secret.h>
|
||||
|
||||
const SecretSchema *docker_get_schema(void) G_GNUC_CONST;
|
||||
|
||||
#define DOCKER_SCHEMA docker_get_schema()
|
||||
|
||||
GError *add(char *label, char *server, char *username, char *secret);
|
||||
GError *delete(char *server);
|
||||
GError *get(char *server, char **username, char **secret);
|
||||
GError *list(char *label, char *** paths, char *** accts, unsigned int *list_l);
|
||||
void freeListData(char *** data, unsigned int length);
|
||||
@@ -1,90 +0,0 @@
|
||||
package secretservice
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
func TestSecretServiceHelper(t *testing.T) {
|
||||
t.Skip("test requires gnome-keyring but travis CI doesn't have it")
|
||||
|
||||
creds := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v1",
|
||||
Username: "foobar",
|
||||
Secret: "foobarbaz",
|
||||
}
|
||||
|
||||
helper := Secretservice{}
|
||||
|
||||
// Check how many docker credentials we have when starting the test
|
||||
old_auths, err := helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// If any docker credentials with the tests values we are providing, we
|
||||
// remove them as they probably come from a previous failed test
|
||||
for k, v := range old_auths {
|
||||
if strings.Compare(k, creds.ServerURL) == 0 && strings.Compare(v, creds.Username) == 0 {
|
||||
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check again how many docker credentials we have when starting the test
|
||||
old_auths, err = helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Add new credentials
|
||||
if err := helper.Add(creds); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Verify that it is inside the secret service store
|
||||
username, secret, err := helper.Get(creds.ServerURL)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if username != "foobar" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobar", username)
|
||||
}
|
||||
|
||||
if secret != "foobarbaz" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobarbaz", secret)
|
||||
}
|
||||
|
||||
// We should have one more credential than before adding
|
||||
new_auths, err := helper.List()
|
||||
if err != nil || (len(new_auths)-len(old_auths) != 1) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
old_auths = new_auths
|
||||
|
||||
// Deleting the credentials associated to current server url should succeed
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// We should have one less credential than before deleting
|
||||
new_auths, err = helper.List()
|
||||
if err != nil || (len(old_auths)-len(new_auths) != 1) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMissingCredentials(t *testing.T) {
|
||||
t.Skip("test requires gnome-keyring but travis CI doesn't have it")
|
||||
|
||||
helper := Secretservice{}
|
||||
_, _, err := helper.Get("https://adsfasdf.wrewerwer.com/asdfsdddd")
|
||||
if !credentials.IsErrCredentialsNotFound(err) {
|
||||
t.Fatalf("expected ErrCredentialsNotFound, got %v", err)
|
||||
}
|
||||
}
|
||||
10
vendor/github.com/docker/docker-credential-helpers/wincred/cmd/main_windows.go
generated
vendored
10
vendor/github.com/docker/docker-credential-helpers/wincred/cmd/main_windows.go
generated
vendored
@@ -1,10 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
"github.com/docker/docker-credential-helpers/wincred"
|
||||
)
|
||||
|
||||
func main() {
|
||||
credentials.Serve(wincred.Wincred{})
|
||||
}
|
||||
74
vendor/github.com/docker/docker-credential-helpers/wincred/wincred_windows.go
generated
vendored
74
vendor/github.com/docker/docker-credential-helpers/wincred/wincred_windows.go
generated
vendored
@@ -1,74 +0,0 @@
|
||||
package wincred
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strings"
|
||||
|
||||
winc "github.com/danieljoos/wincred"
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
// Wincred handles secrets using the Windows credential service.
|
||||
type Wincred struct{}
|
||||
|
||||
// Add adds new credentials to the windows credentials manager.
|
||||
func (h Wincred) Add(creds *credentials.Credentials) error {
|
||||
g := winc.NewGenericCredential(creds.ServerURL)
|
||||
g.UserName = creds.Username
|
||||
g.CredentialBlob = []byte(creds.Secret)
|
||||
g.Persist = winc.PersistLocalMachine
|
||||
g.Attributes = []winc.CredentialAttribute{{"label", []byte(credentials.CredsLabel)}}
|
||||
|
||||
return g.Write()
|
||||
}
|
||||
|
||||
// Delete removes credentials from the windows credentials manager.
|
||||
func (h Wincred) Delete(serverURL string) error {
|
||||
g, err := winc.GetGenericCredential(serverURL)
|
||||
if g == nil {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return g.Delete()
|
||||
}
|
||||
|
||||
// Get retrieves credentials from the windows credentials manager.
|
||||
func (h Wincred) Get(serverURL string) (string, string, error) {
|
||||
g, _ := winc.GetGenericCredential(serverURL)
|
||||
if g == nil {
|
||||
return "", "", credentials.NewErrCredentialsNotFound()
|
||||
}
|
||||
for _, attr := range g.Attributes {
|
||||
if strings.Compare(attr.Keyword, "label") == 0 &&
|
||||
bytes.Compare(attr.Value, []byte(credentials.CredsLabel)) == 0 {
|
||||
|
||||
return g.UserName, string(g.CredentialBlob), nil
|
||||
}
|
||||
}
|
||||
return "", "", credentials.NewErrCredentialsNotFound()
|
||||
}
|
||||
|
||||
// List returns the stored URLs and corresponding usernames for a given credentials label.
|
||||
func (h Wincred) List() (map[string]string, error) {
|
||||
creds, err := winc.List()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := make(map[string]string)
|
||||
for i := range creds {
|
||||
attrs := creds[i].Attributes
|
||||
for _, attr := range attrs {
|
||||
if strings.Compare(attr.Keyword, "label") == 0 &&
|
||||
bytes.Compare(attr.Value, []byte(credentials.CredsLabel)) == 0 {
|
||||
|
||||
resp[creds[i].TargetName] = creds[i].UserName
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
95
vendor/github.com/docker/docker-credential-helpers/wincred/wincred_windows_test.go
generated
vendored
95
vendor/github.com/docker/docker-credential-helpers/wincred/wincred_windows_test.go
generated
vendored
@@ -1,95 +0,0 @@
|
||||
package wincred
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/docker/docker-credential-helpers/credentials"
|
||||
)
|
||||
|
||||
func TestWinCredHelper(t *testing.T) {
|
||||
creds := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v1",
|
||||
Username: "foobar",
|
||||
Secret: "foobarbaz",
|
||||
}
|
||||
creds1 := &credentials.Credentials{
|
||||
ServerURL: "https://foobar.docker.io:2376/v2",
|
||||
Username: "foobarbaz",
|
||||
Secret: "foobar",
|
||||
}
|
||||
|
||||
helper := Wincred{}
|
||||
|
||||
// check for and remove remaining credentials from previous fail tests
|
||||
oldauths, err := helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for k, v := range oldauths {
|
||||
if strings.Compare(k, creds.ServerURL) == 0 && strings.Compare(v, creds.Username) == 0 {
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
} else if strings.Compare(k, creds1.ServerURL) == 0 && strings.Compare(v, creds1.Username) == 0 {
|
||||
if err := helper.Delete(creds1.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// recount for credentials
|
||||
oldauths, err = helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := helper.Add(creds); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
username, secret, err := helper.Get(creds.ServerURL)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if username != "foobar" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobar", username)
|
||||
}
|
||||
|
||||
if secret != "foobarbaz" {
|
||||
t.Fatalf("expected %s, got %s\n", "foobarbaz", secret)
|
||||
}
|
||||
|
||||
auths, err := helper.List()
|
||||
if err != nil || len(auths)-len(oldauths) != 1 {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
helper.Add(creds1)
|
||||
defer helper.Delete(creds1.ServerURL)
|
||||
newauths, err := helper.List()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(newauths)-len(auths) != 1 {
|
||||
if err == nil {
|
||||
t.Fatalf("Error: len(newauths): %d, len(auths): %d", len(newauths), len(auths))
|
||||
}
|
||||
t.Fatalf("Error: len(newauths): %d, len(auths): %d\n Error= %v", len(newauths), len(auths), err)
|
||||
}
|
||||
|
||||
if err := helper.Delete(creds.ServerURL); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMissingCredentials(t *testing.T) {
|
||||
helper := Wincred{}
|
||||
_, _, err := helper.Get("https://adsfasdf.wrewerwer.com/asdfsdddd")
|
||||
if !credentials.IsErrCredentialsNotFound(err) {
|
||||
t.Fatalf("expected ErrCredentialsNotFound, got %v", err)
|
||||
}
|
||||
}
|
||||
8
vendor/github.com/docker/libnetwork/agent.go
generated
vendored
8
vendor/github.com/docker/libnetwork/agent.go
generated
vendored
@@ -892,13 +892,13 @@ func (c *controller) handleEpTableEvent(ev events.Event) {
|
||||
if svcID != "" {
|
||||
// This is a remote task part of a service
|
||||
if err := c.addServiceBinding(svcName, svcID, nid, eid, containerName, vip, ingressPorts, serviceAliases, taskAliases, ip, "handleEpTableEvent"); err != nil {
|
||||
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
|
||||
logrus.Errorf("failed adding service binding for %s epRec:%v err:%v", eid, epRec, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// This is a remote container simply attached to an attachable network
|
||||
if err := c.addContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
|
||||
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
|
||||
logrus.Errorf("failed adding container name resolution for %s epRec:%v err:%v", eid, epRec, err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -906,13 +906,13 @@ func (c *controller) handleEpTableEvent(ev events.Event) {
|
||||
if svcID != "" {
|
||||
// This is a remote task part of a service
|
||||
if err := c.rmServiceBinding(svcName, svcID, nid, eid, containerName, vip, ingressPorts, serviceAliases, taskAliases, ip, "handleEpTableEvent", true); err != nil {
|
||||
logrus.Errorf("failed removing service binding for %s epRec:%v err:%s", eid, epRec, err)
|
||||
logrus.Errorf("failed removing service binding for %s epRec:%v err:%v", eid, epRec, err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
// This is a remote container simply attached to an attachable network
|
||||
if err := c.delContainerNameResolution(nid, eid, containerName, taskAliases, ip, "handleEpTableEvent"); err != nil {
|
||||
logrus.Errorf("failed adding service binding for %s epRec:%v err:%s", eid, epRec, err)
|
||||
logrus.Errorf("failed removing container name resolution for %s epRec:%v err:%v", eid, epRec, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
2
vendor/github.com/docker/libnetwork/circle.yml
generated
vendored
2
vendor/github.com/docker/libnetwork/circle.yml
generated
vendored
@@ -12,3 +12,5 @@ dependencies:
|
||||
test:
|
||||
override:
|
||||
- make circle-ci
|
||||
post:
|
||||
- bash <(curl -s https://codecov.io/bash)
|
||||
|
||||
39
vendor/github.com/docker/libnetwork/common/setmatrix_test.go
generated
vendored
39
vendor/github.com/docker/libnetwork/common/setmatrix_test.go
generated
vendored
@@ -3,6 +3,7 @@ package common
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -66,6 +67,23 @@ func TestSetSerialInsertDelete(t *testing.T) {
|
||||
if !b || i != 4 {
|
||||
t.Fatalf("error in cardinality count %t %d", b, i)
|
||||
}
|
||||
keys := s.Keys()
|
||||
if len(keys) != 1 {
|
||||
t.Fatalf("error in keys %v", keys)
|
||||
}
|
||||
str, b := s.String("a")
|
||||
if !b ||
|
||||
!strings.Contains(str, "1") ||
|
||||
!strings.Contains(str, "2") ||
|
||||
!strings.Contains(str, "3") ||
|
||||
!strings.Contains(str, "4") {
|
||||
t.Fatalf("error in string %t %s", b, str)
|
||||
}
|
||||
|
||||
_, b = s.Get("a")
|
||||
if !b {
|
||||
t.Fatalf("error in get %t", b)
|
||||
}
|
||||
|
||||
b, i = s.Remove("a", "1")
|
||||
if !b || i != 3 {
|
||||
@@ -96,6 +114,27 @@ func TestSetSerialInsertDelete(t *testing.T) {
|
||||
if b || i != 0 {
|
||||
t.Fatalf("error in cardinality count %t %d", b, i)
|
||||
}
|
||||
|
||||
str, b = s.String("a")
|
||||
if b || str != "" {
|
||||
t.Fatalf("error in string %t %s", b, str)
|
||||
}
|
||||
|
||||
keys = s.Keys()
|
||||
if len(keys) > 0 {
|
||||
t.Fatalf("error in keys %v", keys)
|
||||
}
|
||||
|
||||
// Negative tests
|
||||
_, b = s.Get("not exists")
|
||||
if b {
|
||||
t.Fatalf("error should not happen %t", b)
|
||||
}
|
||||
|
||||
b1, b := s.Contains("not exists", "a")
|
||||
if b1 || b {
|
||||
t.Fatalf("error should not happen %t %t", b1, b)
|
||||
}
|
||||
}
|
||||
|
||||
func insertDeleteRotuine(ctx context.Context, endCh chan int, s SetMatrix, key, value string) {
|
||||
|
||||
5
vendor/github.com/docker/libnetwork/drivers/windows/overlay/joinleave_windows.go
generated
vendored
5
vendor/github.com/docker/libnetwork/drivers/windows/overlay/joinleave_windows.go
generated
vendored
@@ -39,6 +39,11 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo,
|
||||
if err := jinfo.AddTableEntry(ovPeerTable, eid, buf); err != nil {
|
||||
logrus.Errorf("overlay: Failed adding table entry to joininfo: %v", err)
|
||||
}
|
||||
|
||||
if ep.disablegateway {
|
||||
jinfo.DisableGatewayService()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
77
vendor/github.com/docker/libnetwork/drivers/windows/overlay/ov_endpoint_windows.go
generated
vendored
77
vendor/github.com/docker/libnetwork/drivers/windows/overlay/ov_endpoint_windows.go
generated
vendored
@@ -6,7 +6,11 @@ import (
|
||||
"net"
|
||||
|
||||
"github.com/Microsoft/hcsshim"
|
||||
"github.com/docker/docker/pkg/system"
|
||||
"github.com/docker/libnetwork/driverapi"
|
||||
"github.com/docker/libnetwork/drivers/windows"
|
||||
"github.com/docker/libnetwork/netlabel"
|
||||
"github.com/docker/libnetwork/types"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@@ -15,12 +19,14 @@ type endpointTable map[string]*endpoint
|
||||
const overlayEndpointPrefix = "overlay/endpoint"
|
||||
|
||||
type endpoint struct {
|
||||
id string
|
||||
nid string
|
||||
profileId string
|
||||
remote bool
|
||||
mac net.HardwareAddr
|
||||
addr *net.IPNet
|
||||
id string
|
||||
nid string
|
||||
profileID string
|
||||
remote bool
|
||||
mac net.HardwareAddr
|
||||
addr *net.IPNet
|
||||
disablegateway bool
|
||||
portMapping []types.PortBinding // Operation port bindings
|
||||
}
|
||||
|
||||
func validateID(nid, eid string) error {
|
||||
@@ -71,7 +77,7 @@ func (n *network) removeEndpointWithAddress(addr *net.IPNet) {
|
||||
|
||||
if networkEndpoint != nil {
|
||||
logrus.Debugf("Removing stale endpoint from HNS")
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", networkEndpoint.profileId, "")
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", networkEndpoint.profileID, "")
|
||||
|
||||
if err != nil {
|
||||
logrus.Debugf("Failed to delete stale overlay endpoint (%s) from hns", networkEndpoint.id[0:7])
|
||||
@@ -96,7 +102,7 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
logrus.Debugf("Deleting stale endpoint %s", eid)
|
||||
n.deleteEndpoint(eid)
|
||||
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileId, "")
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileID, "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -113,17 +119,19 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
return fmt.Errorf("create endpoint was not passed interface IP address")
|
||||
}
|
||||
|
||||
if s := n.getSubnetforIP(ep.addr); s == nil {
|
||||
return fmt.Errorf("no matching subnet for IP %q in network %q\n", ep.addr, nid)
|
||||
s := n.getSubnetforIP(ep.addr)
|
||||
if s == nil {
|
||||
return fmt.Errorf("no matching subnet for IP %q in network %q", ep.addr, nid)
|
||||
}
|
||||
|
||||
// Todo: Add port bindings and qos policies here
|
||||
|
||||
hnsEndpoint := &hcsshim.HNSEndpoint{
|
||||
Name: eid,
|
||||
VirtualNetwork: n.hnsId,
|
||||
VirtualNetwork: n.hnsID,
|
||||
IPAddress: ep.addr.IP,
|
||||
EnableInternalDNS: true,
|
||||
GatewayAddress: s.gwIP.String(),
|
||||
}
|
||||
|
||||
if ep.mac != nil {
|
||||
@@ -141,6 +149,31 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
|
||||
hnsEndpoint.Policies = append(hnsEndpoint.Policies, paPolicy)
|
||||
|
||||
if system.GetOSVersion().Build > 16236 {
|
||||
natPolicy, err := json.Marshal(hcsshim.PaPolicy{
|
||||
Type: "OutBoundNAT",
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hnsEndpoint.Policies = append(hnsEndpoint.Policies, natPolicy)
|
||||
|
||||
epConnectivity, err := windows.ParseEndpointConnectivity(epOptions)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
pbPolicy, err := windows.ConvertPortBindings(epConnectivity.PortBindings)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
hnsEndpoint.Policies = append(hnsEndpoint.Policies, pbPolicy...)
|
||||
|
||||
ep.disablegateway = true
|
||||
}
|
||||
|
||||
configurationb, err := json.Marshal(hnsEndpoint)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -151,7 +184,7 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
return err
|
||||
}
|
||||
|
||||
ep.profileId = hnsresponse.Id
|
||||
ep.profileID = hnsresponse.Id
|
||||
|
||||
if ep.mac == nil {
|
||||
ep.mac, err = net.ParseMAC(hnsresponse.MacAddress)
|
||||
@@ -164,6 +197,12 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
}
|
||||
}
|
||||
|
||||
ep.portMapping, err = windows.ParsePortBindingPolicies(hnsresponse.Policies)
|
||||
if err != nil {
|
||||
hcsshim.HNSEndpointRequest("DELETE", hnsresponse.Id, "")
|
||||
return err
|
||||
}
|
||||
|
||||
n.addEndpoint(ep)
|
||||
|
||||
return nil
|
||||
@@ -186,7 +225,7 @@ func (d *driver) DeleteEndpoint(nid, eid string) error {
|
||||
|
||||
n.deleteEndpoint(eid)
|
||||
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileId, "")
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileID, "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -210,7 +249,17 @@ func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, erro
|
||||
}
|
||||
|
||||
data := make(map[string]interface{}, 1)
|
||||
data["hnsid"] = ep.profileId
|
||||
data["hnsid"] = ep.profileID
|
||||
data["AllowUnqualifiedDNSQuery"] = true
|
||||
|
||||
if ep.portMapping != nil {
|
||||
// Return a copy of the operational data
|
||||
pmc := make([]types.PortBinding, 0, len(ep.portMapping))
|
||||
for _, pm := range ep.portMapping {
|
||||
pmc = append(pmc, pm.GetCopy())
|
||||
}
|
||||
data[netlabel.PortMap] = pmc
|
||||
}
|
||||
|
||||
return data, nil
|
||||
}
|
||||
|
||||
15
vendor/github.com/docker/libnetwork/drivers/windows/overlay/ov_network_windows.go
generated
vendored
15
vendor/github.com/docker/libnetwork/drivers/windows/overlay/ov_network_windows.go
generated
vendored
@@ -37,7 +37,7 @@ type subnetJSON struct {
|
||||
type network struct {
|
||||
id string
|
||||
name string
|
||||
hnsId string
|
||||
hnsID string
|
||||
providerAddress string
|
||||
interfaceName string
|
||||
endpoints endpointTable
|
||||
@@ -108,7 +108,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
|
||||
case "com.docker.network.windowsshim.interface":
|
||||
interfaceName = value
|
||||
case "com.docker.network.windowsshim.hnsid":
|
||||
n.hnsId = value
|
||||
n.hnsID = value
|
||||
case netlabel.OverlayVxlanIDList:
|
||||
vniStrings := strings.Split(value, ",")
|
||||
for _, vniStr := range vniStrings {
|
||||
@@ -181,7 +181,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d
|
||||
if err != nil {
|
||||
d.deleteNetwork(id)
|
||||
} else {
|
||||
genData["com.docker.network.windowsshim.hnsid"] = n.hnsId
|
||||
genData["com.docker.network.windowsshim.hnsid"] = n.hnsID
|
||||
}
|
||||
|
||||
return err
|
||||
@@ -197,7 +197,7 @@ func (d *driver) DeleteNetwork(nid string) error {
|
||||
return types.ForbiddenErrorf("could not find network with id %s", nid)
|
||||
}
|
||||
|
||||
_, err := hcsshim.HNSNetworkRequest("DELETE", n.hnsId, "")
|
||||
_, err := hcsshim.HNSNetworkRequest("DELETE", n.hnsID, "")
|
||||
if err != nil {
|
||||
return types.ForbiddenErrorf(err.Error())
|
||||
}
|
||||
@@ -242,7 +242,7 @@ func (d *driver) network(nid string) *network {
|
||||
// }
|
||||
|
||||
// for _, endpoint := range hnsresponse {
|
||||
// if endpoint.VirtualNetwork != n.hnsId {
|
||||
// if endpoint.VirtualNetwork != n.hnsID {
|
||||
// continue
|
||||
// }
|
||||
|
||||
@@ -260,7 +260,7 @@ func (d *driver) network(nid string) *network {
|
||||
func (n *network) convertToOverlayEndpoint(v *hcsshim.HNSEndpoint) *endpoint {
|
||||
ep := &endpoint{
|
||||
id: v.Name,
|
||||
profileId: v.Id,
|
||||
profileID: v.Id,
|
||||
nid: n.id,
|
||||
remote: v.IsRemoteEndpoint,
|
||||
}
|
||||
@@ -311,6 +311,7 @@ func (d *driver) createHnsNetwork(n *network) error {
|
||||
Type: d.Type(),
|
||||
Subnets: subnets,
|
||||
NetworkAdapterName: n.interfaceName,
|
||||
AutomaticDNS: true,
|
||||
}
|
||||
|
||||
configurationb, err := json.Marshal(network)
|
||||
@@ -326,7 +327,7 @@ func (d *driver) createHnsNetwork(n *network) error {
|
||||
return err
|
||||
}
|
||||
|
||||
n.hnsId = hnsresponse.Id
|
||||
n.hnsID = hnsresponse.Id
|
||||
n.providerAddress = hnsresponse.ManagementIP
|
||||
|
||||
return nil
|
||||
|
||||
2
vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go
generated
vendored
2
vendor/github.com/docker/libnetwork/drivers/windows/overlay/overlay_windows.go
generated
vendored
@@ -104,7 +104,7 @@ func (d *driver) restoreHNSNetworks() error {
|
||||
func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network {
|
||||
n := &network{
|
||||
id: v.Name,
|
||||
hnsId: v.Id,
|
||||
hnsID: v.Id,
|
||||
driver: d,
|
||||
endpoints: endpointTable{},
|
||||
subnets: []*subnet{},
|
||||
|
||||
6
vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go
generated
vendored
6
vendor/github.com/docker/libnetwork/drivers/windows/overlay/peerdb_windows.go
generated
vendored
@@ -33,7 +33,7 @@ func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
||||
|
||||
hnsEndpoint := &hcsshim.HNSEndpoint{
|
||||
Name: eid,
|
||||
VirtualNetwork: n.hnsId,
|
||||
VirtualNetwork: n.hnsID,
|
||||
MacAddress: peerMac.String(),
|
||||
IPAddress: peerIP,
|
||||
IsRemoteEndpoint: true,
|
||||
@@ -78,7 +78,7 @@ func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask,
|
||||
nid: nid,
|
||||
addr: addr,
|
||||
mac: peerMac,
|
||||
profileId: hnsresponse.Id,
|
||||
profileID: hnsresponse.Id,
|
||||
remote: true,
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMas
|
||||
}
|
||||
|
||||
if updateDb {
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileId, "")
|
||||
_, err := hcsshim.HNSEndpointRequest("DELETE", ep.profileID, "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
24
vendor/github.com/docker/libnetwork/drivers/windows/windows.go
generated
vendored
24
vendor/github.com/docker/libnetwork/drivers/windows/windows.go
generated
vendored
@@ -55,7 +55,8 @@ type endpointOption struct {
|
||||
DisableICC bool
|
||||
}
|
||||
|
||||
type endpointConnectivity struct {
|
||||
// EndpointConnectivity stores the port bindings and exposed ports that the user has specified in epOptions.
|
||||
type EndpointConnectivity struct {
|
||||
PortBindings []types.PortBinding
|
||||
ExposedPorts []types.TransportPort
|
||||
}
|
||||
@@ -67,7 +68,7 @@ type hnsEndpoint struct {
|
||||
Type string
|
||||
macAddress net.HardwareAddr
|
||||
epOption *endpointOption // User specified parameters
|
||||
epConnectivity *endpointConnectivity // User specified parameters
|
||||
epConnectivity *EndpointConnectivity // User specified parameters
|
||||
portMapping []types.PortBinding // Operation port bindings
|
||||
addr *net.IPNet
|
||||
gateway net.IP
|
||||
@@ -95,7 +96,7 @@ const (
|
||||
errNotFound = "HNS failed with error : The object identifier does not represent a valid object. "
|
||||
)
|
||||
|
||||
// IsBuiltinWindowsDriver vaidates if network-type is a builtin local-scoped driver
|
||||
// IsBuiltinLocalDriver validates if network-type is a builtin local-scoped driver
|
||||
func IsBuiltinLocalDriver(networkType string) bool {
|
||||
if "l2bridge" == networkType || "l2tunnel" == networkType || "nat" == networkType || "ics" == networkType || "transparent" == networkType {
|
||||
return true
|
||||
@@ -396,7 +397,8 @@ func convertQosPolicies(qosPolicies []types.QosPolicy) ([]json.RawMessage, error
|
||||
return qps, nil
|
||||
}
|
||||
|
||||
func convertPortBindings(portBindings []types.PortBinding) ([]json.RawMessage, error) {
|
||||
// ConvertPortBindings converts PortBindings to JSON for HNS request
|
||||
func ConvertPortBindings(portBindings []types.PortBinding) ([]json.RawMessage, error) {
|
||||
var pbs []json.RawMessage
|
||||
|
||||
// Enumerate through the port bindings specified by the user and convert
|
||||
@@ -431,7 +433,8 @@ func convertPortBindings(portBindings []types.PortBinding) ([]json.RawMessage, e
|
||||
return pbs, nil
|
||||
}
|
||||
|
||||
func parsePortBindingPolicies(policies []json.RawMessage) ([]types.PortBinding, error) {
|
||||
// ParsePortBindingPolicies parses HNS endpoint response message to PortBindings
|
||||
func ParsePortBindingPolicies(policies []json.RawMessage) ([]types.PortBinding, error) {
|
||||
var bindings []types.PortBinding
|
||||
hcsPolicy := &hcsshim.NatPolicy{}
|
||||
|
||||
@@ -505,12 +508,13 @@ func parseEndpointOptions(epOptions map[string]interface{}) (*endpointOption, er
|
||||
return ec, nil
|
||||
}
|
||||
|
||||
func parseEndpointConnectivity(epOptions map[string]interface{}) (*endpointConnectivity, error) {
|
||||
// ParseEndpointConnectivity parses options passed to CreateEndpoint, specifically port bindings, and store in a endpointConnectivity object.
|
||||
func ParseEndpointConnectivity(epOptions map[string]interface{}) (*EndpointConnectivity, error) {
|
||||
if epOptions == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
ec := &endpointConnectivity{}
|
||||
ec := &EndpointConnectivity{}
|
||||
|
||||
if opt, ok := epOptions[netlabel.PortMap]; ok {
|
||||
if bs, ok := opt.([]types.PortBinding); ok {
|
||||
@@ -550,7 +554,7 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
epConnectivity, err := parseEndpointConnectivity(epOptions)
|
||||
epConnectivity, err := ParseEndpointConnectivity(epOptions)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -561,7 +565,7 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
endpointStruct.MacAddress = strings.Replace(macAddress.String(), ":", "-", -1)
|
||||
}
|
||||
|
||||
endpointStruct.Policies, err = convertPortBindings(epConnectivity.PortBindings)
|
||||
endpointStruct.Policies, err = ConvertPortBindings(epConnectivity.PortBindings)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -615,7 +619,7 @@ func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
|
||||
endpoint.profileID = hnsresponse.Id
|
||||
endpoint.epConnectivity = epConnectivity
|
||||
endpoint.epOption = epOption
|
||||
endpoint.portMapping, err = parsePortBindingPolicies(hnsresponse.Policies)
|
||||
endpoint.portMapping, err = ParsePortBindingPolicies(hnsresponse.Policies)
|
||||
|
||||
if err != nil {
|
||||
hcsshim.HNSEndpointRequest("DELETE", hnsresponse.Id, "")
|
||||
|
||||
7
vendor/github.com/docker/libnetwork/ipvs/ipvs.go
generated
vendored
7
vendor/github.com/docker/libnetwork/ipvs/ipvs.go
generated
vendored
@@ -116,6 +116,13 @@ func (i *Handle) DelService(s *Service) error {
|
||||
return i.doCmd(s, nil, ipvsCmdDelService)
|
||||
}
|
||||
|
||||
// Flush deletes all existing services in the passed
|
||||
// handle.
|
||||
func (i *Handle) Flush() error {
|
||||
_, err := i.doCmdWithoutAttr(ipvsCmdFlush)
|
||||
return err
|
||||
}
|
||||
|
||||
// NewDestination creates a new real server in the passed ipvs
|
||||
// service which should already be existing in the passed handle.
|
||||
func (i *Handle) NewDestination(s *Service, d *Destination) error {
|
||||
|
||||
35
vendor/github.com/docker/libnetwork/ipvs/ipvs_test.go
generated
vendored
35
vendor/github.com/docker/libnetwork/ipvs/ipvs_test.go
generated
vendored
@@ -178,6 +178,41 @@ func TestService(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
svcs := []Service{
|
||||
{
|
||||
AddressFamily: nl.FAMILY_V4,
|
||||
SchedName: RoundRobin,
|
||||
Protocol: syscall.IPPROTO_TCP,
|
||||
Port: 80,
|
||||
Address: net.ParseIP("10.20.30.40"),
|
||||
Netmask: 0xFFFFFFFF,
|
||||
},
|
||||
{
|
||||
AddressFamily: nl.FAMILY_V4,
|
||||
SchedName: LeastConnection,
|
||||
Protocol: syscall.IPPROTO_UDP,
|
||||
Port: 8080,
|
||||
Address: net.ParseIP("10.20.30.41"),
|
||||
Netmask: 0xFFFFFFFF,
|
||||
},
|
||||
}
|
||||
// Create services for testing flush
|
||||
for _, svc := range svcs {
|
||||
if !i.IsServicePresent(&svc) {
|
||||
err = i.NewService(&svc)
|
||||
assert.NoError(t, err)
|
||||
checkService(t, i, &svc, true)
|
||||
} else {
|
||||
t.Errorf("svc: %v exists", svc)
|
||||
}
|
||||
}
|
||||
err = i.Flush()
|
||||
assert.NoError(t, err)
|
||||
got, err := i.GetServices()
|
||||
assert.NoError(t, err)
|
||||
if len(got) != 0 {
|
||||
t.Errorf("Unexpected services after flush")
|
||||
}
|
||||
}
|
||||
|
||||
func createDummyInterface(t *testing.T) {
|
||||
|
||||
7
vendor/github.com/docker/libnetwork/ipvs/netlink.go
generated
vendored
7
vendor/github.com/docker/libnetwork/ipvs/netlink.go
generated
vendored
@@ -402,6 +402,13 @@ func (i *Handle) doGetServicesCmd(svc *Service) ([]*Service, error) {
|
||||
return res, nil
|
||||
}
|
||||
|
||||
// doCmdWithoutAttr a simple wrapper of netlink socket execute command
|
||||
func (i *Handle) doCmdWithoutAttr(cmd uint8) ([][]byte, error) {
|
||||
req := newIPVSRequest(cmd)
|
||||
req.Seq = atomic.AddUint32(&i.seq, 1)
|
||||
return execute(i.sock, req, 0)
|
||||
}
|
||||
|
||||
func assembleDestination(attrs []syscall.NetlinkRouteAttr) (*Destination, error) {
|
||||
|
||||
var d Destination
|
||||
|
||||
42
vendor/github.com/docker/libnetwork/portallocator/portallocator_freebsd.go
generated
vendored
Normal file
42
vendor/github.com/docker/libnetwork/portallocator/portallocator_freebsd.go
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
package portallocator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
func getDynamicPortRange() (start int, end int, err error) {
|
||||
portRangeKernelSysctl := []string{"net.inet.ip.portrange.hifirst", "net.ip.portrange.hilast"}
|
||||
portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
|
||||
portRangeLowCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[0])
|
||||
var portRangeLowOut bytes.Buffer
|
||||
portRangeLowCmd.Stdout = &portRangeLowOut
|
||||
cmdErr := portRangeLowCmd.Run()
|
||||
if cmdErr != nil {
|
||||
return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hifirst failed - %s: %v", portRangeFallback, err)
|
||||
}
|
||||
n, err := fmt.Sscanf(portRangeLowOut.String(), "%d", &start)
|
||||
if n != 1 || err != nil {
|
||||
if err == nil {
|
||||
err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
|
||||
}
|
||||
return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range start from %s - %s: %v", portRangeLowOut.String(), portRangeFallback, err)
|
||||
}
|
||||
|
||||
portRangeHighCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[1])
|
||||
var portRangeHighOut bytes.Buffer
|
||||
portRangeHighCmd.Stdout = &portRangeHighOut
|
||||
cmdErr = portRangeHighCmd.Run()
|
||||
if cmdErr != nil {
|
||||
return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hilast failed - %s: %v", portRangeFallback, err)
|
||||
}
|
||||
n, err = fmt.Sscanf(portRangeHighOut.String(), "%d", &end)
|
||||
if n != 1 || err != nil {
|
||||
if err == nil {
|
||||
err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
|
||||
}
|
||||
return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range end from %s - %s: %v", portRangeHighOut.String(), portRangeFallback, err)
|
||||
}
|
||||
return start, end, nil
|
||||
}
|
||||
Reference in New Issue
Block a user