Merge branch 'master' into fix-ou-ordering

This commit is contained in:
Mark Gritter 2019-05-06 14:41:44 -05:00 committed by GitHub
commit a9e8f3e7b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 1563 additions and 284 deletions

173
.circleci/config.yml Normal file
View file

@ -0,0 +1,173 @@
version: 2
references:
images:
go: &GOLANG_IMAGE golang:1.12.4-stretch # Pin Go to patch version (ex: 1.2.3)
node: &NODE_IMAGE node:10-stretch # Pin Node.js to major version (ex: 10)
environment: &ENVIRONMENT
CIRCLECI_CLI_VERSION: 0.1.5546 # Pin CircleCI CLI to patch version (ex: 1.2.3)
GO_VERSION: 1.12.4 # Pin Go to patch version (ex: 1.2.3)
GOTESTSUM_VERSION: 0.3.3 # Pin gotestsum to patch version (ex: 1.2.3)
jobs:
install-ui-dependencies:
docker:
- image: *NODE_IMAGE
working_directory: /src/vault/ui
steps:
- checkout:
path: /src/vault
- restore_cache:
key: yarn-lock-{{ checksum "yarn.lock" }}
- run:
name: Install UI dependencies
command: |
set -eux -o pipefail
yarn install --ignore-optional
npm rebuild node-sass
- save_cache:
key: yarn-lock-{{ checksum "yarn.lock" }}
paths:
- node_modules
- persist_to_workspace:
root: ..
paths:
- ui/node_modules
build-go-dev:
docker:
- image: *GOLANG_IMAGE
working_directory: /go/src/github.com/hashicorp/vault
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Build dev binary
command: |
set -eux -o pipefail
# Move dev UI assets to expected location
rm -rf ./pkg
mkdir ./pkg
# Build dev binary
make bootstrap dev
- persist_to_workspace:
root: .
paths:
- bin
test-ui:
docker:
- image: *NODE_IMAGE
working_directory: /src/vault/ui
resource_class: medium+
steps:
- checkout:
path: /src/vault
- attach_workspace:
at: ..
- run:
name: Test UI
command: |
set -eux -o pipefail
# Install Chrome
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub \
| apt-key add -
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" \
| tee /etc/apt/sources.list.d/google-chrome.list
apt-get update
apt-get -y install google-chrome-stable
rm /etc/apt/sources.list.d/google-chrome.list
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
# Add ./bin to the PATH so vault binary can be run by Ember tests
export PATH="${PWD}"/../bin:${PATH}
# Run Ember tests
mkdir -p test-results/qunit
yarn run test-oss
- store_artifacts:
path: test-results
- store_test_results:
path: test-results
test-go:
machine: true
environment:
<<: *ENVIRONMENT
GO_TAGS:
parallelism: 2
working_directory: ~/go/src/github.com/hashicorp/vault
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Run Go tests
command: |
set -eux -o pipefail
# Install Go
curl -sSLO "https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
rm -f "go${GO_VERSION}.linux-amd64.tar.gz"
export GOPATH="${HOME}/go"
export PATH="${PATH}:${GOPATH}/bin:/usr/local/go/bin"
# Install CircleCI CLI
curl -sSL \
"https://github.com/CircleCI-Public/circleci-cli/releases/download/v${CIRCLECI_CLI_VERSION}/circleci-cli_${CIRCLECI_CLI_VERSION}_linux_amd64.tar.gz" \
| sudo tar --overwrite -xz \
-C /usr/local/bin \
"circleci-cli_${CIRCLECI_CLI_VERSION}_linux_amd64/circleci"
# Split Go tests by prior test times
package_names=$(go list \
-tags "${GO_TAGS}" \
./... \
| grep -v /vendor/ \
| sort \
| circleci tests split --split-by=timings --timings-type=classname)
# Install gotestsum
curl -sSL "https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/gotestsum_${GOTESTSUM_VERSION}_linux_amd64.tar.gz" \
| sudo tar --overwrite -xz -C /usr/local/bin gotestsum
# Run tests
make prep
mkdir -p test-results/go-test
CGO_ENABLED= \
VAULT_ADDR= \
VAULT_TOKEN= \
VAULT_DEV_ROOT_TOKEN_ID= \
VAULT_ACC= \
gotestsum --format=short-verbose --junitfile test-results/go-test/results.xml -- \
-tags "${GO_TAGS}" \
-timeout=40m \
-parallel=20 \
${package_names}
- store_artifacts:
path: test-results
- store_test_results:
path: test-results
workflows:
version: 2
ci:
jobs:
- install-ui-dependencies
- build-go-dev
- test-ui:
requires:
- install-ui-dependencies
- build-go-dev
- test-go:
requires:
- build-go-dev

View file

@ -39,6 +39,7 @@ branches:
env:
- TEST_COMMAND='make dev test-ember'
- TEST_COMMAND='make dev ember-ci-test'
- TEST_COMMAND='travis_wait 75 make testtravis'
- TEST_COMMAND='travis_wait 75 make testracetravis'
- GO111MODULE=on

View file

@ -16,6 +16,8 @@ BUG FIXES:
* auth/okta: Fix handling of group names containing slashes [GH-6665]
* core: Correctly honor non-HMAC request keys when auditing requests [GH-6653]
* core: Fix the `x-vault-unauthenticated` value in OpenAPI for a number of endpoints [GH-6654]
* core: Fix issue where some OpenAPI parameters were incorrectly listed as being sent
as a header [GH-6679]
* pki: fix a panic when a client submits a null value [GH-5679]
* replication: Fix an issue causing startup problems if a namespace policy
wasn't replicated properly

View file

@ -128,6 +128,12 @@ test-ember:
@echo "--> Running ember tests"
@cd ui && yarn run test-oss
ember-ci-test:
@echo "--> Installing JavaScript assets"
@cd ui && yarn --ignore-optional
@echo "--> Running ember tests in Browserstack"
@cd ui && yarn run test:browserstack
ember-dist:
@echo "--> Installing JavaScript assets"
@cd ui && yarn --ignore-optional

View file

@ -21,6 +21,7 @@ import (
"github.com/hashicorp/vault/command/agent/auth/approle"
"github.com/hashicorp/vault/command/agent/auth/aws"
"github.com/hashicorp/vault/command/agent/auth/azure"
"github.com/hashicorp/vault/command/agent/auth/cert"
"github.com/hashicorp/vault/command/agent/auth/gcp"
"github.com/hashicorp/vault/command/agent/auth/jwt"
"github.com/hashicorp/vault/command/agent/auth/kubernetes"
@ -331,6 +332,8 @@ func (c *AgentCommand) Run(args []string) int {
method, err = aws.NewAWSAuthMethod(authConfig)
case "azure":
method, err = azure.NewAzureAuthMethod(authConfig)
case "cert":
method, err = cert.NewCertAuthMethod(authConfig)
case "gcp":
method, err = gcp.NewGCPAuthMethod(authConfig)
case "jwt":

View file

@ -0,0 +1,65 @@
package cert
import (
"context"
"errors"
"fmt"
hclog "github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/api"
"github.com/hashicorp/vault/command/agent/auth"
)
type certMethod struct {
logger hclog.Logger
mountPath string
name string
}
func NewCertAuthMethod(conf *auth.AuthConfig) (auth.AuthMethod, error) {
if conf == nil {
return nil, errors.New("empty config")
}
// Not concerned if the conf.Config is empty as the 'name'
// parameter is optional when using TLS Auth
c := &certMethod{
logger: conf.Logger,
mountPath: conf.MountPath,
name: "",
}
if conf.Config != nil {
nameRaw, ok := conf.Config["name"]
if !ok {
nameRaw = ""
}
c.name, ok = nameRaw.(string)
if !ok {
return nil, errors.New("could not convert 'name' config value to string")
}
}
return c, nil
}
func (c *certMethod) Authenticate(_ context.Context, client *api.Client) (string, map[string]interface{}, error) {
c.logger.Trace("beginning authentication")
authMap := map[string]interface{}{}
if c.name != "" {
authMap["name"] = c.name
}
return fmt.Sprintf("%s/login", c.mountPath), authMap, nil
}
func (c *certMethod) NewCreds() chan struct{} {
return nil
}
func (c *certMethod) CredSuccess() {}
func (c *certMethod) Shutdown() {}

View file

@ -0,0 +1,244 @@
package agent
import (
"context"
"encoding/pem"
"io/ioutil"
"os"
"testing"
"time"
hclog "github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/api"
vaultcert "github.com/hashicorp/vault/builtin/credential/cert"
"github.com/hashicorp/vault/command/agent/auth"
agentcert "github.com/hashicorp/vault/command/agent/auth/cert"
"github.com/hashicorp/vault/command/agent/sink"
"github.com/hashicorp/vault/command/agent/sink/file"
"github.com/hashicorp/vault/helper/dhutil"
vaulthttp "github.com/hashicorp/vault/http"
"github.com/hashicorp/vault/sdk/helper/jsonutil"
"github.com/hashicorp/vault/sdk/helper/logging"
"github.com/hashicorp/vault/sdk/logical"
"github.com/hashicorp/vault/vault"
)
func TestCertWithNameEndToEnd(t *testing.T) {
testCertWithNameEndToEnd(t, false)
testCertWithNameEndToEnd(t, true)
}
func testCertWithNameEndToEnd(t *testing.T, ahWrapping bool) {
logger := logging.NewVaultLogger(hclog.Trace)
coreConfig := &vault.CoreConfig{
Logger: logger,
CredentialBackends: map[string]logical.Factory{
"cert": vaultcert.Factory,
},
}
cluster := vault.NewTestCluster(t, coreConfig, &vault.TestClusterOptions{
HandlerFunc: vaulthttp.Handler,
})
cluster.Start()
defer cluster.Cleanup()
vault.TestWaitActive(t, cluster.Cores[0].Core)
client := cluster.Cores[0].Client
// Setup Vault
err := client.Sys().EnableAuthWithOptions("cert", &api.EnableAuthOptions{
Type: "cert",
})
if err != nil {
t.Fatal(err)
}
certificatePEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cluster.CACert.Raw})
_, err = client.Logical().Write("auth/cert/certs/test", map[string]interface{}{
"name": "test",
"certificate": string(certificatePEM),
"policies": "default",
})
if err != nil {
t.Fatal(err)
}
// Generate encryption params
pub, pri, err := dhutil.GeneratePublicPrivateKey()
if err != nil {
t.Fatal(err)
}
ouf, err := ioutil.TempFile("", "auth.tokensink.test.")
if err != nil {
t.Fatal(err)
}
out := ouf.Name()
ouf.Close()
os.Remove(out)
t.Logf("output: %s", out)
dhpathf, err := ioutil.TempFile("", "auth.dhpath.test.")
if err != nil {
t.Fatal(err)
}
dhpath := dhpathf.Name()
dhpathf.Close()
os.Remove(dhpath)
// Write DH public key to file
mPubKey, err := jsonutil.EncodeJSON(&dhutil.PublicKeyInfo{
Curve25519PublicKey: pub,
})
if err != nil {
t.Fatal(err)
}
if err := ioutil.WriteFile(dhpath, mPubKey, 0600); err != nil {
t.Fatal(err)
} else {
logger.Trace("wrote dh param file", "path", dhpath)
}
ctx, cancelFunc := context.WithCancel(context.Background())
timer := time.AfterFunc(30*time.Second, func() {
cancelFunc()
})
defer timer.Stop()
am, err := agentcert.NewCertAuthMethod(&auth.AuthConfig{
Logger: logger.Named("auth.cert"),
MountPath: "auth/cert",
Config: map[string]interface{}{
"name": "test",
},
})
if err != nil {
t.Fatal(err)
}
ahConfig := &auth.AuthHandlerConfig{
Logger: logger.Named("auth.handler"),
Client: client,
EnableReauthOnNewCredentials: true,
}
if ahWrapping {
ahConfig.WrapTTL = 10 * time.Second
}
ah := auth.NewAuthHandler(ahConfig)
go ah.Run(ctx, am)
defer func() {
<-ah.DoneCh
}()
config := &sink.SinkConfig{
Logger: logger.Named("sink.file"),
AAD: "foobar",
DHType: "curve25519",
DHPath: dhpath,
Config: map[string]interface{}{
"path": out,
},
}
if !ahWrapping {
config.WrapTTL = 10 * time.Second
}
fs, err := file.NewFileSink(config)
if err != nil {
t.Fatal(err)
}
config.Sink = fs
ss := sink.NewSinkServer(&sink.SinkServerConfig{
Logger: logger.Named("sink.server"),
Client: client,
})
go ss.Run(ctx, ah.OutputCh, []*sink.SinkConfig{config})
defer func() {
<-ss.DoneCh
}()
// This has to be after the other defers so it happens first
defer cancelFunc()
cloned, err := client.Clone()
if err != nil {
t.Fatal(err)
}
checkToken := func() string {
timeout := time.Now().Add(5 * time.Second)
for {
if time.Now().After(timeout) {
t.Fatal("did not find a written token after timeout")
}
val, err := ioutil.ReadFile(out)
if err == nil {
os.Remove(out)
if len(val) == 0 {
t.Fatal("written token was empty")
}
// First decrypt it
resp := new(dhutil.Envelope)
if err := jsonutil.DecodeJSON(val, resp); err != nil {
continue
}
aesKey, err := dhutil.GenerateSharedKey(pri, resp.Curve25519PublicKey)
if err != nil {
t.Fatal(err)
}
if len(aesKey) == 0 {
t.Fatal("got empty aes key")
}
val, err = dhutil.DecryptAES(aesKey, resp.EncryptedPayload, resp.Nonce, []byte("foobar"))
if err != nil {
t.Fatalf("error: %v\nresp: %v", err, string(val))
}
// Now unwrap it
wrapInfo := new(api.SecretWrapInfo)
if err := jsonutil.DecodeJSON(val, wrapInfo); err != nil {
t.Fatal(err)
}
switch {
case wrapInfo.TTL != 10:
t.Fatalf("bad wrap info: %v", wrapInfo.TTL)
case !ahWrapping && wrapInfo.CreationPath != "sys/wrapping/wrap":
t.Fatalf("bad wrap path: %v", wrapInfo.CreationPath)
case ahWrapping && wrapInfo.CreationPath != "auth/cert/login":
t.Fatalf("bad wrap path: %v", wrapInfo.CreationPath)
case wrapInfo.Token == "":
t.Fatal("wrap token is empty")
}
cloned.SetToken(wrapInfo.Token)
secret, err := cloned.Logical().Unwrap("")
if err != nil {
t.Fatal(err)
}
if ahWrapping {
switch {
case secret.Auth == nil:
t.Fatal("unwrap secret auth is nil")
case secret.Auth.ClientToken == "":
t.Fatal("unwrap token is nil")
}
return secret.Auth.ClientToken
} else {
switch {
case secret.Data == nil:
t.Fatal("unwrap secret data is nil")
case secret.Data["token"] == nil:
t.Fatal("unwrap token is nil")
}
return secret.Data["token"].(string)
}
}
time.Sleep(250 * time.Millisecond)
}
}
checkToken()
}

View file

@ -0,0 +1,241 @@
package agent
import (
"context"
"encoding/pem"
"io/ioutil"
"os"
"testing"
"time"
hclog "github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/api"
vaultcert "github.com/hashicorp/vault/builtin/credential/cert"
"github.com/hashicorp/vault/command/agent/auth"
agentcert "github.com/hashicorp/vault/command/agent/auth/cert"
"github.com/hashicorp/vault/command/agent/sink"
"github.com/hashicorp/vault/command/agent/sink/file"
"github.com/hashicorp/vault/helper/dhutil"
vaulthttp "github.com/hashicorp/vault/http"
"github.com/hashicorp/vault/sdk/helper/jsonutil"
"github.com/hashicorp/vault/sdk/helper/logging"
"github.com/hashicorp/vault/sdk/logical"
"github.com/hashicorp/vault/vault"
)
func TestCertWithNoNAmeEndToEnd(t *testing.T) {
testCertWithNoNAmeEndToEnd(t, false)
testCertWithNoNAmeEndToEnd(t, true)
}
func testCertWithNoNAmeEndToEnd(t *testing.T, ahWrapping bool) {
logger := logging.NewVaultLogger(hclog.Trace)
coreConfig := &vault.CoreConfig{
Logger: logger,
CredentialBackends: map[string]logical.Factory{
"cert": vaultcert.Factory,
},
}
cluster := vault.NewTestCluster(t, coreConfig, &vault.TestClusterOptions{
HandlerFunc: vaulthttp.Handler,
})
cluster.Start()
defer cluster.Cleanup()
vault.TestWaitActive(t, cluster.Cores[0].Core)
client := cluster.Cores[0].Client
// Setup Vault
err := client.Sys().EnableAuthWithOptions("cert", &api.EnableAuthOptions{
Type: "cert",
})
if err != nil {
t.Fatal(err)
}
certificatePEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: cluster.CACert.Raw})
_, err = client.Logical().Write("auth/cert/certs/test", map[string]interface{}{
"name": "test",
"certificate": string(certificatePEM),
"policies": "default",
})
if err != nil {
t.Fatal(err)
}
// Generate encryption params
pub, pri, err := dhutil.GeneratePublicPrivateKey()
if err != nil {
t.Fatal(err)
}
ouf, err := ioutil.TempFile("", "auth.tokensink.test.")
if err != nil {
t.Fatal(err)
}
out := ouf.Name()
ouf.Close()
os.Remove(out)
t.Logf("output: %s", out)
dhpathf, err := ioutil.TempFile("", "auth.dhpath.test.")
if err != nil {
t.Fatal(err)
}
dhpath := dhpathf.Name()
dhpathf.Close()
os.Remove(dhpath)
// Write DH public key to file
mPubKey, err := jsonutil.EncodeJSON(&dhutil.PublicKeyInfo{
Curve25519PublicKey: pub,
})
if err != nil {
t.Fatal(err)
}
if err := ioutil.WriteFile(dhpath, mPubKey, 0600); err != nil {
t.Fatal(err)
} else {
logger.Trace("wrote dh param file", "path", dhpath)
}
ctx, cancelFunc := context.WithCancel(context.Background())
timer := time.AfterFunc(30*time.Second, func() {
cancelFunc()
})
defer timer.Stop()
am, err := agentcert.NewCertAuthMethod(&auth.AuthConfig{
Logger: logger.Named("auth.cert"),
MountPath: "auth/cert",
})
if err != nil {
t.Fatal(err)
}
ahConfig := &auth.AuthHandlerConfig{
Logger: logger.Named("auth.handler"),
Client: client,
EnableReauthOnNewCredentials: true,
}
if ahWrapping {
ahConfig.WrapTTL = 10 * time.Second
}
ah := auth.NewAuthHandler(ahConfig)
go ah.Run(ctx, am)
defer func() {
<-ah.DoneCh
}()
config := &sink.SinkConfig{
Logger: logger.Named("sink.file"),
AAD: "foobar",
DHType: "curve25519",
DHPath: dhpath,
Config: map[string]interface{}{
"path": out,
},
}
if !ahWrapping {
config.WrapTTL = 10 * time.Second
}
fs, err := file.NewFileSink(config)
if err != nil {
t.Fatal(err)
}
config.Sink = fs
ss := sink.NewSinkServer(&sink.SinkServerConfig{
Logger: logger.Named("sink.server"),
Client: client,
})
go ss.Run(ctx, ah.OutputCh, []*sink.SinkConfig{config})
defer func() {
<-ss.DoneCh
}()
// This has to be after the other defers so it happens first
defer cancelFunc()
cloned, err := client.Clone()
if err != nil {
t.Fatal(err)
}
checkToken := func() string {
timeout := time.Now().Add(5 * time.Second)
for {
if time.Now().After(timeout) {
t.Fatal("did not find a written token after timeout")
}
val, err := ioutil.ReadFile(out)
if err == nil {
os.Remove(out)
if len(val) == 0 {
t.Fatal("written token was empty")
}
// First decrypt it
resp := new(dhutil.Envelope)
if err := jsonutil.DecodeJSON(val, resp); err != nil {
continue
}
aesKey, err := dhutil.GenerateSharedKey(pri, resp.Curve25519PublicKey)
if err != nil {
t.Fatal(err)
}
if len(aesKey) == 0 {
t.Fatal("got empty aes key")
}
val, err = dhutil.DecryptAES(aesKey, resp.EncryptedPayload, resp.Nonce, []byte("foobar"))
if err != nil {
t.Fatalf("error: %v\nresp: %v", err, string(val))
}
// Now unwrap it
wrapInfo := new(api.SecretWrapInfo)
if err := jsonutil.DecodeJSON(val, wrapInfo); err != nil {
t.Fatal(err)
}
switch {
case wrapInfo.TTL != 10:
t.Fatalf("bad wrap info: %v", wrapInfo.TTL)
case !ahWrapping && wrapInfo.CreationPath != "sys/wrapping/wrap":
t.Fatalf("bad wrap path: %v", wrapInfo.CreationPath)
case ahWrapping && wrapInfo.CreationPath != "auth/cert/login":
t.Fatalf("bad wrap path: %v", wrapInfo.CreationPath)
case wrapInfo.Token == "":
t.Fatal("wrap token is empty")
}
cloned.SetToken(wrapInfo.Token)
secret, err := cloned.Logical().Unwrap("")
if err != nil {
t.Fatal(err)
}
if ahWrapping {
switch {
case secret.Auth == nil:
t.Fatal("unwrap secret auth is nil")
case secret.Auth.ClientToken == "":
t.Fatal("unwrap token is nil")
}
return secret.Auth.ClientToken
} else {
switch {
case secret.Data == nil:
t.Fatal("unwrap secret data is nil")
case secret.Data["token"] == nil:
t.Fatal("unwrap token is nil")
}
return secret.Data["token"].(string)
}
}
time.Sleep(250 * time.Millisecond)
}
}
checkToken()
}

View file

@ -1,6 +1,7 @@
package command
import (
"errors"
"fmt"
"io"
"path"
@ -69,6 +70,9 @@ func kvPreflightVersionRequest(client *api.Client, path string) (string, int, er
if err != nil {
return "", 0, err
}
if secret == nil {
return "", 0, errors.New("nil response from pre-flight request")
}
var mountPath string
if mountPathRaw, ok := secret.Data["path"]; ok {
mountPath = mountPathRaw.(string)

View file

@ -30,6 +30,7 @@ type OperatorInitCommand struct {
flagRecoveryShares int
flagRecoveryThreshold int
flagRecoveryPGPKeys []string
flagStoredShares int
// Consul
flagConsulAuto bool
@ -139,6 +140,13 @@ func (c *OperatorInitCommand) Flags() *FlagSets {
"key.",
})
f.IntVar(&IntVar{
Name: "stored-shares",
Target: &c.flagStoredShares,
Default: -1,
Usage: "DEPRECATED: This flag does nothing. It will be removed in Vault 1.3.",
})
// Consul Options
f = set.NewFlagSet("Consul Options")
@ -220,6 +228,10 @@ func (c *OperatorInitCommand) Run(args []string) int {
return 1
}
if c.flagStoredShares != -1 {
c.UI.Warn("-stored-shares has no effect and will be removed in Vault 1.3.\n")
}
// Build the initial init request
initReq := &api.InitRequest{
SecretShares: c.flagKeyShares,

View file

@ -158,9 +158,9 @@ func NewBackend(c map[string]string, logger log.Logger) (physical.Backend, error
}
return &Backend{
bucket: bucket,
haEnabled: haEnabled,
bucket: bucket,
haEnabled: haEnabled,
chunkSize: chunkSize,
client: client,
permitPool: physical.NewPermitPool(maxParallel),
logger: logger,

View file

@ -5,6 +5,7 @@ import (
"fmt"
"math/rand"
"os"
"strconv"
"testing"
"time"
@ -57,6 +58,17 @@ func TestBackend(t *testing.T) {
t.Fatal(err)
}
// Verify chunkSize is set correctly on the Backend
be := backend.(*Backend)
expectedChunkSize, err := strconv.Atoi(defaultChunkSize)
if err != nil {
t.Fatalf("failed to convert defaultChunkSize to int: %s", err)
}
expectedChunkSize = expectedChunkSize * 1024
if be.chunkSize != expectedChunkSize {
t.Fatalf("expected chunkSize to be %d. got=%d", expectedChunkSize, be.chunkSize)
}
physical.ExerciseBackend(t, backend)
physical.ExerciseBackend_ListPrefix(t, backend)
}

View file

@ -61,7 +61,11 @@ vault secrets enable ssh
vault secrets enable totp
vault secrets enable transit
curl -H "X-Vault-Token: root" "http://127.0.0.1:8200/v1/sys/internal/specs/openapi" > openapi.json
if [ "$1" == "-p" ]; then
curl -H "X-Vault-Token: root" "http://127.0.0.1:8200/v1/sys/internal/specs/openapi" | jq > openapi.json
else
curl -H "X-Vault-Token: root" "http://127.0.0.1:8200/v1/sys/internal/specs/openapi" > openapi.json
fi
kill $VAULT_PID
sleep 1

View file

@ -257,13 +257,6 @@ func documentPath(p *Path, specialPaths *logical.Paths, backendType logical.Back
required = false
}
// Header parameters are part of the Parameters group but with
// a dedicated "header" location, a header parameter is not required.
if field.Type == TypeHeader {
location = "header"
required = false
}
t := convertType(field.Type)
p := OASParameter{
Name: name,
@ -608,8 +601,7 @@ func splitFields(allFields map[string]*FieldSchema, pattern string) (pathFields,
for name, field := range allFields {
if _, ok := pathFields[name]; !ok {
// Header fields are in "parameters" with other path fields
if field.Type == TypeHeader || field.Query {
if field.Query {
pathFields[name] = field
} else {
bodyFields[name] = field

View file

@ -151,8 +151,8 @@ func TestOpenAPI_Regex(t *testing.T) {
func TestOpenAPI_ExpandPattern(t *testing.T) {
tests := []struct {
in_pattern string
out_pathlets []string
inPattern string
outPathlets []string
}{
{"rekey/backup", []string{"rekey/backup"}},
{"rekey/backup$", []string{"rekey/backup"}},
@ -203,10 +203,10 @@ func TestOpenAPI_ExpandPattern(t *testing.T) {
}
for i, test := range tests {
out := expandPattern(test.in_pattern)
out := expandPattern(test.inPattern)
sort.Strings(out)
if !reflect.DeepEqual(out, test.out_pathlets) {
t.Fatalf("Test %d: Expected %v got %v", i, test.out_pathlets, out)
if !reflect.DeepEqual(out, test.outPathlets) {
t.Fatalf("Test %d: Expected %v got %v", i, test.outPathlets, out)
}
}
}
@ -266,7 +266,10 @@ func TestOpenAPI_SpecialPaths(t *testing.T) {
Root: test.rootPaths,
Unauthenticated: test.unauthPaths,
}
documentPath(&path, sp, logical.TypeLogical, doc)
err := documentPath(&path, sp, logical.TypeLogical, doc)
if err != nil {
t.Fatal(err)
}
result := test.root
if doc.Paths["/"+test.pattern].Sudo != result {
t.Fatalf("Test (root) %d: Expected %v got %v", i, test.root, result)
@ -288,11 +291,11 @@ func TestOpenAPI_Paths(t *testing.T) {
Pattern: "lookup/" + GenericNameRegex("id"),
Fields: map[string]*FieldSchema{
"id": &FieldSchema{
"id": {
Type: TypeString,
Description: "My id parameter",
},
"token": &FieldSchema{
"token": {
Type: TypeString,
Description: "My token",
},
@ -442,8 +445,14 @@ func TestOpenAPI_OperationID(t *testing.T) {
for _, context := range []string{"", "bar"} {
doc := NewOASDocument()
documentPath(path1, nil, logical.TypeLogical, doc)
documentPath(path2, nil, logical.TypeLogical, doc)
err := documentPath(path1, nil, logical.TypeLogical, doc)
if err != nil {
t.Fatal(err)
}
err = documentPath(path2, nil, logical.TypeLogical, doc)
if err != nil {
t.Fatal(err)
}
doc.CreateOperationIDs(context)
tests := []struct {
@ -500,7 +509,10 @@ func TestOpenAPI_CustomDecoder(t *testing.T) {
}
docOrig := NewOASDocument()
documentPath(p, nil, logical.TypeLogical, docOrig)
err := documentPath(p, nil, logical.TypeLogical, docOrig)
if err != nil {
t.Fatal(err)
}
docJSON := mustJSONMarshal(t, docOrig)

View file

@ -31,15 +31,6 @@
"type": "string"
},
"required": true
},
{
"name": "x-abc-token",
"description": "a header value",
"in": "header",
"schema": {
"type": "string",
"enum": ["a", "b", "c"]
}
}
],
"get": {
@ -95,6 +86,11 @@
"description": "the name",
"default": "Larry",
"pattern": "\\w([\\w-.]*\\w)?"
},
"x-abc-token": {
"type": "string",
"description": "a header value",
"enum": ["a", "b", "c"]
}
}
}

View file

@ -7,6 +7,8 @@
- [Running / Development](#running--development)
- [Code Generators](#code-generators)
- [Running Tests](#running-tests)
- [Automated Cross-Browser Testing](#automated-cross-browser-testing)
- [Running Browserstack Locally](#running-browserstack-locally)
- [Linting](#linting)
- [Building Vault UI into a Vault Binary](#building-vault-ui-into-a-vault-binary)
- [Vault Storybook](#vault-storybook)
@ -71,6 +73,17 @@ acceptance tests then run, proxing requests back to that server.
- `yarn run test-oss -s` to keep the test server running after the initial run.
- `yarn run test -f="policies"` to filter the tests that are run. `-f` gets passed into
[QUnit's `filter` config](https://api.qunitjs.com/config/QUnit.config#qunitconfigfilter-string--default-undefined)
- `yarn run test:browserstack` to run the kv acceptance tests in Browserstack
#### Automated Cross-Browser Testing
Vault uses [Browserstack Automate](https://automate.browserstack.com/) to run all the kv acceptance tests on various browsers. You can view the list of browsers we test by viewing `testem.browserstack.js`.
##### Running Browserstack Locally
To run the Browserstack tests locally you will need to add your `BROWSERSTACK_USERNAME` and `BROWSERSTACK_ACCESS_KEY` to your environment. Then run `yarn run test:browserstack`. You can view the currently running tests at `localhost:7357` or log in to [Browserstack Automate](https://automate.browserstack.com/) to view a previous build.
To run the tests locally in a browser other than IE11, swap out `launch_in_ci: ['BS_IE_11']` inside `testem.browserstack.js`.
### Linting
@ -157,3 +170,4 @@ It is important to add all new components into Storybook and to keep the story a
- [Storybook for Ember Live Example](https://storybooks-ember.netlify.com/?path=/story/addon-centered--button)
- [Storybook Addons](https://github.com/storybooks/storybook/tree/master/addons/)
- [Storybook Docs](https://storybook.js.org/docs/basics/introduction/)
- [Browserstack Automate](https://automate.browserstack.com/)

View file

@ -198,7 +198,7 @@ export default Component.extend(DEFAULTS, {
let transition = this.router.transitionTo(targetRoute, { queryParams: { namespace } });
// returning this w/then because if we keep it
// in the task, it will get cancelled when the component in un-rendered
return transition.followRedirects().then(() => {
yield transition.followRedirects().then(() => {
if (isRoot) {
this.flashMessages.warning(
'You have logged in with a root token. As a security precaution, this root token will not be stored by your browser and you will need to re-authenticate after the window is closed or refreshed.'

View file

@ -1,7 +1,7 @@
import Ember from 'ember';
import { inject as service } from '@ember/service';
import Component from './outer-html';
import { next, later } from '@ember/runloop';
import { later } from '@ember/runloop';
import { task, timeout, waitForEvent } from 'ember-concurrency';
import { computed } from '@ember/object';
@ -27,18 +27,16 @@ export default Component.extend({
onNamespace() {},
didReceiveAttrs() {
next(() => {
let { oldSelectedAuthPath, selectedAuthPath } = this;
let shouldDebounce = !oldSelectedAuthPath && !selectedAuthPath;
if (oldSelectedAuthPath !== selectedAuthPath) {
this.set('role', null);
this.onRoleName(this.roleName);
this.fetchRole.perform(null, { debounce: false });
} else if (shouldDebounce) {
this.fetchRole.perform(this.roleName);
}
this.set('oldSelectedAuthPath', selectedAuthPath);
});
let { oldSelectedAuthPath, selectedAuthPath } = this;
let shouldDebounce = !oldSelectedAuthPath && !selectedAuthPath;
if (oldSelectedAuthPath !== selectedAuthPath) {
this.set('role', null);
this.onRoleName(this.roleName);
this.fetchRole.perform(null, { debounce: false });
} else if (shouldDebounce) {
this.fetchRole.perform(this.roleName);
}
this.set('oldSelectedAuthPath', selectedAuthPath);
},
// OIDC roles in the JWT/OIDC backend are those with an authUrl,
@ -68,7 +66,9 @@ export default Component.extend({
}
}
this.set('role', role);
}).restartable(),
})
.restartable()
.withTestWaiter(),
handleOIDCError(err) {
this.onLoading(false);

View file

@ -107,7 +107,8 @@ export default Component.extend({
if (!pem) {
return [];
}
const pemFile = new File([pem], { type: 'text/plain' });
const pemFile = new Blob([pem], { type: 'text/plain' });
const links = [
{
display: 'Download CA Certificate in PEM format',
@ -121,7 +122,7 @@ export default Component.extend({
},
];
if (caChain) {
const caChainFile = new File([caChain], { type: 'text/plain' });
const caChainFile = new Blob([caChain], { type: 'text/plain' });
links.push({
display: 'Download CA Certificate Chain',
name: `${backend}_ca_chain.pem`,

View file

@ -1,5 +1,6 @@
import Component from '@ember/component';
import { set } from '@ember/object';
import { task } from 'ember-concurrency';
const BASE_64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gi;
export default Component.extend({
@ -34,12 +35,12 @@ export default Component.extend({
readFile(file) {
const reader = new FileReader();
reader.onload = () => this.setPGPKey(reader.result, file.name);
reader.onload = () => this.setPGPKey.perform(reader.result, file.name);
// this gives us a base64-encoded string which is important in the onload
reader.readAsDataURL(file);
},
setPGPKey(dataURL, filename) {
setPGPKey: task(function*(dataURL, filename) {
const b64File = dataURL.split(',')[1].trim();
const decoded = atob(b64File).trim();
@ -48,8 +49,8 @@ export default Component.extend({
// If after decoding it's not b64, we want
// the original as it was only encoded when we used `readAsDataURL`.
const fileData = decoded.match(BASE_64_REGEX) ? decoded : b64File;
this.get('onChange')(this.get('index'), { value: fileData, fileName: filename });
},
yield this.get('onChange')(this.get('index'), { value: fileData, fileName: filename });
}).withTestWaiter(),
actions: {
pickedFile(e) {

View file

@ -21,6 +21,8 @@ export function linkParams({ mode, secret, queryParams }) {
export default Component.extend({
tagName: '',
// so that ember-test-selectors doesn't log a warning
supportsDataTestProperties: true,
mode: 'list',
secret: null,

View file

@ -2,6 +2,7 @@ import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { FEATURE_MACHINE_STEPS, INIT_STEPS } from 'vault/helpers/wizard-constants';
import { htmlSafe } from '@ember/template';
export default Component.extend({
wizard: service(),
@ -66,25 +67,25 @@ export default Component.extend({
let bar = [];
if (this.currentTutorialProgress) {
bar.push({
style: `width:${this.currentTutorialProgress.percentage}%;`,
style: htmlSafe(`width:${this.currentTutorialProgress.percentage}%;`),
completed: false,
showIcon: true,
});
} else {
if (this.currentFeatureProgress) {
this.completedFeatures.forEach(feature => {
bar.push({ style: 'width:100%;', completed: true, feature: feature, showIcon: true });
bar.push({ style: htmlSafe('width:100%;'), completed: true, feature: feature, showIcon: true });
});
this.wizard.featureList.forEach(feature => {
if (feature === this.currentMachine) {
bar.push({
style: `width:${this.currentFeatureProgress.percentage}%;`,
style: htmlSafe(`width:${this.currentFeatureProgress.percentage}%;`),
completed: this.currentFeatureProgress.percentage == 100 ? true : false,
feature: feature,
showIcon: true,
});
} else {
bar.push({ style: 'width:0%;', completed: false, feature: feature, showIcon: true });
bar.push({ style: htmlSafe('width:0%;'), completed: false, feature: feature, showIcon: true });
}
});
}

View file

@ -2,6 +2,7 @@ import { inject as service } from '@ember/service';
import Component from '@ember/component';
import { computed } from '@ember/object';
import { FEATURE_MACHINE_TIME } from 'vault/helpers/wizard-constants';
import { htmlSafe } from '@ember/template';
export default Component.extend({
wizard: service(),
@ -48,10 +49,10 @@ export default Component.extend({
}),
selectProgress: computed('selectedFeatures', function() {
let bar = this.selectedFeatures.map(feature => {
return { style: 'width:0%;', completed: false, showIcon: true, feature: feature };
return { style: htmlSafe('width:0%;'), completed: false, showIcon: true, feature: feature };
});
if (bar.length === 0) {
bar = [{ style: 'width:0%;', showIcon: false }];
bar = [{ style: htmlSafe('width:0%;'), showIcon: false }];
}
return bar;
}),

View file

@ -2,7 +2,7 @@ import Route from '@ember/routing/route';
export default Route.extend({
renderTemplate() {
let { targetName } = this.router.currentState.routerJs.activeTransition;
let { targetName } = this._router.currentState.routerJs.activeTransition;
let isCallback =
targetName === 'vault.cluster.oidc-callback' || targetName === 'vault.cluster.oidc-callback-namespace';
if (isCallback) {

View file

@ -2,6 +2,8 @@ import DS from 'ember-data';
import IdentitySerializer from './_base';
export default IdentitySerializer.extend(DS.EmbeddedRecordsMixin, {
// we don't need to serialize relationships here
serializeHasMany() {},
attrs: {
aliases: { embedded: 'always' },
},

View file

@ -12,7 +12,7 @@ import { supportedAuthBackends } from 'vault/helpers/supported-auth-backends';
import { task, timeout } from 'ember-concurrency';
const TOKEN_SEPARATOR = '☃';
const TOKEN_PREFIX = 'vault-';
const ROOT_PREFIX = '🗝';
const ROOT_PREFIX = '_root_';
const BACKENDS = supportedAuthBackends();
export { TOKEN_SEPARATOR, TOKEN_PREFIX, ROOT_PREFIX };
@ -296,29 +296,23 @@ export default Service.extend({
if (this.environment() === 'development') {
return;
}
this.getTokensFromStorage().forEach(key => {
const data = this.getTokenData(key);
if (data.policies.includes('root')) {
if (data && data.policies.includes('root')) {
this.removeTokenData(key);
}
});
},
authenticate(/*{clusterId, backend, data}*/) {
async authenticate(/*{clusterId, backend, data}*/) {
const [options] = arguments;
const adapter = this.clusterAdapter();
return adapter.authenticate(options).then(resp => {
return this.persistAuthData(options, resp.auth || resp.data, this.get('namespace.path')).then(
authData => {
return this.get('permissions')
.getPaths.perform()
.then(() => {
return authData;
});
}
);
});
let resp = await adapter.authenticate(options);
let authData = await this.persistAuthData(options, resp.auth || resp.data, this.get('namespace.path'));
await this.get('permissions').getPaths.perform();
return authData;
},
deleteCurrentToken() {

View file

@ -1,6 +1,6 @@
<div class="level is-mobile">
<div class="level-left">
<label class="is-label" data-test-pgp-label=true>
<label class="is-label" data-test-pgp-label>
{{#if label}}
{{label}}
{{else}}
@ -11,7 +11,7 @@
<div class="level-right">
<div class="control is-flex">
<input
data-test-text-toggle=true
data-test-text-toggle
id={{concat "useText-" elementId}}
type="checkbox"
name={{concat "useText-" elementId}}

View file

@ -0,0 +1,11 @@
/* global self */
self.deprecationWorkflow = self.deprecationWorkflow || {};
self.deprecationWorkflow.config = {
workflow: [
// ivy-codemirror and ember-radio-button still use send-action
{ handler: 'silence', matchId: 'ember-component.send-action' },
{ handler: 'silence', matchId: 'ember-runtime.deprecate-copy-copyable' },
// ember-cli-page-object uses jquery's this.$() by default - this will change when we remove jquery
{ handler: 'silence', matchId: 'ember-test-helpers.rendering-context.jquery-element' },
],
};

View file

@ -30,7 +30,6 @@ module.exports = function(environment) {
flashMessageDefaults: {
timeout: 7000,
sticky: false,
preventDuplicates: true,
},
};
if (environment === 'development') {
@ -39,26 +38,16 @@ module.exports = function(environment) {
ENV.APP.LOG_TRANSITIONS = true;
// ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
// ENV.APP.LOG_VIEW_LOOKUPS = true;
//ENV['ember-cli-mirage'] = {
//enabled: true
//};
}
if (environment === 'test') {
// Testem prefers this...
ENV.locationType = 'none';
// keep test console output quieter
ENV.APP.LOG_ACTIVE_GENERATION = false;
ENV.APP.LOG_VIEW_LOOKUPS = false;
ENV.APP.rootElement = '#ember-testing';
ENV['ember-cli-mirage'] = {
enabled: false,
};
ENV.APP.autoboot = false;
ENV.flashMessageDefaults.timeout = 50;
}
if (environment !== 'production') {

View file

@ -6,6 +6,7 @@ const EmberApp = require('ember-cli/lib/broccoli/ember-app');
const environment = EmberApp.env();
const isProd = environment === 'production';
const isTest = environment === 'test';
const isCI = !!process.env.CI;
module.exports = function(defaults) {
var app = new EmberApp(defaults, {
@ -17,7 +18,7 @@ module.exports = function(defaults) {
plugins: ['transform-object-rest-spread'],
},
'ember-cli-babel': {
includePolyfill: isTest || isProd,
includePolyfill: isTest || isProd || isCI,
},
hinting: isTest,
tests: isTest,

View file

@ -13,13 +13,16 @@
"build-dev": "ember build",
"lint:hbs": "ember-template-lint .",
"lint:js": "eslint .",
"start": "export VAULT_ADDR=http://localhost:8200; ember server --proxy=$VAULT_ADDR",
"test": "node scripts/start-vault.js & yarn run lint:js && ember test",
"start2": "ember server --proxy=http://localhost:8202 --port=4202",
"test-oss": "yarn run lint:js && yarn run test -f='!enterprise'",
"fmt": "yarn run fmt-js && yarn run fmt-styles",
"fmt-js": "prettier-eslint --single-quote --no-use-tabs --trailing-comma es5 --print-width=110 --write '{app,tests,config,lib}/**/*.js'",
"fmt-styles": "prettier --write app/styles/**/*.*",
"fmt": "yarn run fmt-js && yarn run fmt-styles",
"start": "export VAULT_ADDR=http://localhost:8200; ember server --proxy=$VAULT_ADDR",
"start2": "ember server --proxy=http://localhost:8202 --port=4202",
"test": "node scripts/start-vault.js & yarn run lint:js & ember test",
"test:browserstack": "export CI=true; node scripts/start-vault.js & node scripts/run-browserstack-tests.js",
"test-oss": "yarn run test -f='!enterprise'",
"test-quick": "node scripts/start-vault.js & ember test",
"test-quick-oss": "yarn run test-quick -f='!enterprise'",
"build-storybook": "build-storybook -s ../pkg/web_ui",
"storybook": "start-storybook -p 6006 -s ../pkg/web_ui",
"gen-story-md": "node scripts/gen-story-md.js"
@ -61,16 +64,17 @@
"ember-cli": "~3.5.1",
"ember-cli-autoprefixer": "^0.8.1",
"ember-cli-babel": "^6.16.0",
"ember-cli-browserstack": "^0.0.7",
"ember-cli-clipboard": "^0.8.0",
"ember-cli-content-security-policy": "^1.0.0",
"ember-cli-dependency-checker": "^3.0.0",
"ember-cli-deprecation-workflow": "^1.0.1",
"ember-cli-flash": "1.7.1",
"ember-cli-htmlbars": "^3.0.0",
"ember-cli-htmlbars-inline-precompile": "^1.0.3",
"ember-cli-inject-live-reload": "^1.8.2",
"ember-cli-page-object": "1.15.0-beta.3",
"ember-cli-page-object": "^1.15.3",
"ember-cli-pretender": "^1.0.1",
"ember-cli-qunit": "^4.3.2",
"ember-cli-sass": "^9.0.0",
"ember-cli-sri": "meirish/ember-cli-sri#rooturl",
"ember-cli-string-helpers": "^1.5.0",
@ -78,7 +82,7 @@
"ember-cli-uglify": "^2.1.0",
"ember-composable-helpers": "^2.0.3",
"ember-computed-query": "^0.1.1",
"ember-concurrency": "^0.8.14",
"ember-concurrency": "^0.10.0",
"ember-concurrency-test-waiter": "^0.3.1",
"ember-copy": "^1.0.0",
"ember-data": "~3.4.0",
@ -91,12 +95,13 @@
"ember-maybe-import-regenerator": "^0.1.6",
"ember-maybe-in-element": "^0.1.3",
"ember-power-select": "^2.0.12",
"ember-qunit": "^4.4.1",
"ember-radio-button": "^1.1.1",
"ember-resolver": "^5.0.1",
"ember-responsive": "^3.0.0-beta.3",
"ember-sinon": "^1.0.1",
"ember-source": "~3.4.0",
"ember-test-selectors": "^1.0.0",
"ember-test-selectors": "^2.1.0",
"ember-truth-helpers": "^2.1.0",
"escape-string-regexp": "^1.0.5",
"eslint": "^5.16.0",

View file

@ -0,0 +1,37 @@
#!/usr/bin/env node
/* eslint-env node */
/* eslint-disable no-console */
const execa = require('execa');
const chalk = require('chalk');
function run(command, args = []) {
console.log(chalk.dim('$ ' + command + ' ' + args.join(' ')));
let p = execa(command, args);
p.stdout.pipe(process.stdout);
p.stderr.pipe(process.stderr);
return p;
}
(async function() {
await run('ember', ['browserstack:connect']);
try {
try {
await run('ember', ['test', '-f=secrets/secret/create', '-c', 'testem.browserstack.js']);
console.log('success');
process.exit(0);
} finally {
if (process.env.TRAVIS_JOB_NUMBER) {
await run('ember', ['browserstack:results']);
}
await run('ember', ['browserstack:disconnect']);
}
} catch (error) {
console.log('error');
console.log(error);
process.exit(1);
}
})();

92
ui/testem.browserstack.js Normal file
View file

@ -0,0 +1,92 @@
/* eslint-env node */
module.exports = {
framework: 'qunit',
test_page: 'tests/index.html?hidepassed&nolint',
tap_quiet_logs: true,
disable_watching: true,
timeout: 1200,
browser_start_timeout: 2000,
parallel: 4,
launchers: {
BS_Chrome_Current: {
exe: 'node_modules/.bin/browserstack-launch',
args: [
'--os',
'Windows',
'--osv',
'10',
'--b',
'chrome',
'--bv',
'latest',
'-t',
'1200',
'--u',
'<url>',
],
protocol: 'browser',
},
BS_Firefox_Current: {
exe: 'node_modules/.bin/browserstack-launch',
args: [
'--os',
'Windows',
'--osv',
'10',
'--b',
'firefox',
'--bv',
'latest',
'-t',
'1200',
'--u',
'<url>',
],
protocol: 'browser',
},
BS_Safari_Current: {
exe: 'node_modules/.bin/browserstack-launch',
args: [
'--os',
'OS X',
'--osv',
'Mojave',
'--b',
'safari',
'--bv',
'latest',
'-t',
'1200',
'--u',
'<url>',
],
protocol: 'browser',
},
BS_IE_11: {
exe: 'node_modules/.bin/browserstack-launch',
args: [
'--os',
'Windows',
'--osv',
'10',
'--b',
'ie',
'--bv',
'11.0',
'-t',
'1200',
'--u',
'<url>&legacy=true',
],
protocol: 'browser',
},
},
launch_in_dev: [],
launch_in_ci: ['BS_IE_11'],
proxies: {
'/v1': {
target: 'http://localhost:9200',
},
},
};

View file

@ -30,7 +30,7 @@ const config = {
if (process.env.CI) {
config.reporter = 'xunit';
config.report_file = 'test-reports/ember.xml';
config.report_file = 'test-results/qunit/results.xml';
config.xunit_intermediate_output = true;
}

View file

@ -28,10 +28,7 @@ module('Acceptance | secrets/generic/create', function(hooks) {
test('it creates and can view a secret with the generic backend', async function(assert) {
const path = `generic-${new Date().getTime()}`;
const kvPath = `generic-kv-${new Date().getTime()}`;
cli.consoleInput(`write sys/mounts/${path} type=generic`);
cli.enter();
cli.consoleInput(`write ${path}/foo bar=baz`);
cli.enter();
await cli.runCommands([`write sys/mounts/${path} type=generic`, `write ${path}/foo bar=baz`]);
await listPage.visitRoot({ backend: path });
assert.equal(currentRouteName(), 'vault.cluster.secrets.backend.list-root', 'navigates to the list page');
assert.equal(listPage.secrets.length, 1, 'lists one secret in the backend');
@ -45,13 +42,12 @@ module('Acceptance | secrets/generic/create', function(hooks) {
test('upgrading generic to version 2 lists all existing secrets, and CRUD continues to work', async function(assert) {
const path = `generic-${new Date().getTime()}`;
const kvPath = `generic-kv-${new Date().getTime()}`;
cli.consoleInput(`write sys/mounts/${path} type=generic`);
cli.enter();
cli.consoleInput(`write ${path}/foo bar=baz`);
cli.enter();
// upgrade to version 2 generic mount
cli.consoleInput(`write sys/mounts/${path}/tune options=version=2`);
cli.enter();
await cli.runCommands([
`write sys/mounts/${path} type=generic`,
`write ${path}/foo bar=baz`,
// upgrade to version 2 generic mount
`write sys/mounts/${path}/tune options=version=2`,
]);
await listPage.visitRoot({ backend: path });
assert.equal(currentRouteName(), 'vault.cluster.secrets.backend.list-root', 'navigates to the list page');
assert.equal(listPage.secrets.length, 1, 'lists the old secret in the backend');

View file

@ -110,7 +110,7 @@ module('Acceptance | secrets/secret/create', function(hooks) {
assert.ok(secretLink, 'link to the 3/ branch displays properly');
await listPage.secrets.filterBy('text', '3/')[0].click();
await listPage.secrets[0].menuToggle();
await listPage.secrets.objectAt(0).menuToggle();
await settled();
await listPage.delete();
await listPage.confirmDelete();
@ -118,7 +118,7 @@ module('Acceptance | secrets/secret/create', function(hooks) {
assert.equal(currentRouteName(), 'vault.cluster.secrets.backend.list');
assert.equal(currentURL(), `/vault/secrets/${enginePath}/list/1/2/3/`, 'remains on the page');
await listPage.secrets[0].menuToggle();
await listPage.secrets.objectAt(0).menuToggle();
await listPage.delete();
await listPage.confirmDelete();
await settled();
@ -319,7 +319,7 @@ module('Acceptance | secrets/secret/create', function(hooks) {
assert.equal(listPage.secrets.length, 3, 'renders three secrets');
await listPage.filterInput('filter/foo1');
assert.equal(listPage.secrets.length, 1, 'renders only one secret');
await listPage.secrets[0].click();
await listPage.secrets.objectAt(0).click();
await showPage.breadcrumbs.filterBy('text', 'filter')[0].click();
assert.equal(listPage.secrets.length, 3, 'renders three secrets');
assert.equal(listPage.filterInputValue, 'filter/', 'pageFilter has been reset');

View file

@ -1,13 +1,14 @@
import { later, run } from '@ember/runloop';
import { run } from '@ember/runloop';
import EmberObject, { computed } from '@ember/object';
import Evented from '@ember/object/evented';
import Service from '@ember/service';
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, settled } from '@ember/test-helpers';
import { render, settled, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
import sinon from 'sinon';
import Pretender from 'pretender';
import { resolve } from 'rsvp';
import { create } from 'ember-cli-page-object';
import form from '../../pages/components/auth-jwt';
import { ERROR_WINDOW_CLOSED, ERROR_MISSING_PARAMS } from 'vault/components/auth-jwt';
@ -40,7 +41,7 @@ fakeWindow.reopen({
},
close() {
fakeWindow.prototype.trigger('close');
fakeWindow.proto().trigger('close');
},
});
@ -50,6 +51,8 @@ const OIDC_AUTH_RESPONSE = {
},
};
const WAIT_TIME = 50;
const routerStub = Service.extend({
urlFor() {
return 'http://example.com';
@ -59,9 +62,9 @@ const routerStub = Service.extend({
const renderIt = async (context, path = 'jwt') => {
let handler = (data, e) => {
if (e && e.preventDefault) e.preventDefault();
return resolve();
};
let fake = fakeWindow.create();
sinon.spy(fake, 'open');
context.set('window', fake);
context.set('handler', sinon.spy(handler));
context.set('roleName', '');
@ -86,6 +89,7 @@ module('Integration | Component | auth jwt', function(hooks) {
setupRenderingTest(hooks);
hooks.beforeEach(function() {
this.openSpy = sinon.spy(fakeWindow.proto(), 'open');
this.owner.register('service:router', routerStub);
this.server = new Pretender(function() {
this.get('/v1/auth/:path/oidc/callback', function() {
@ -121,6 +125,7 @@ module('Integration | Component | auth jwt', function(hooks) {
});
hooks.afterEach(function() {
this.openSpy.restore();
this.server.shutdown();
});
@ -172,22 +177,16 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
run.cancelTimers();
await settled();
let call = this.window.open.getCall(0);
assert.deepEqual(
call.args,
[
'http://example.com',
'vaultOIDCWindow',
'width=500,height=600,resizable,scrollbars=yes,top=0,left=0',
],
'called with expected args'
);
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
run.cancelTimers();
let call = this.openSpy.getCall(0);
assert.deepEqual(
call.args,
['http://example.com', 'vaultOIDCWindow', 'width=500,height=600,resizable,scrollbars=yes,top=0,left=0'],
'called with expected args'
);
});
test('oidc: it calls error handler when popup is closed', async function(assert) {
@ -195,13 +194,12 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.close();
await settled();
assert.equal(this.error, ERROR_WINDOW_CLOSED, 'calls onError with error string');
}, 50);
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.close();
await settled();
assert.equal(this.error, ERROR_WINDOW_CLOSED, 'calls onError with error string');
});
test('oidc: storage event fires with wrong key', async function(assert) {
@ -209,12 +207,12 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
run.cancelTimers();
this.window.trigger('storage', { key: 'wrongThing' });
assert.equal(this.window.localStorage.removeItem.callCount, 0, 'never calls removeItem');
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', { key: 'wrongThing' });
run.cancelTimers();
assert.equal(this.window.localStorage.removeItem.callCount, 0, 'never calls removeItem');
});
test('oidc: storage event fires with correct key, wrong params', async function(assert) {
@ -222,13 +220,13 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.trigger('storage', { key: 'oidcState', newValue: JSON.stringify({}) });
await settled();
assert.equal(this.window.localStorage.removeItem.callCount, 1, 'calls removeItem');
assert.equal(this.error, ERROR_MISSING_PARAMS, 'calls onError with params missing error');
}, 50);
await settled();
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', { key: 'oidcState', newValue: JSON.stringify({}) });
run.cancelTimers();
assert.equal(this.window.localStorage.removeItem.callCount, 1, 'calls removeItem');
assert.equal(this.error, ERROR_MISSING_PARAMS, 'calls onError with params missing error');
});
test('oidc: storage event fires with correct key, correct params', async function(assert) {
@ -236,20 +234,20 @@ module('Integration | Component | auth jwt', function(hooks) {
this.set('selectedAuthPath', 'foo');
await component.role('test');
component.login();
later(async () => {
this.window.trigger('storage', {
key: 'oidcState',
newValue: JSON.stringify({
path: 'foo',
state: 'state',
code: 'code',
}),
});
await settled();
assert.equal(this.selectedAuth, 'token', 'calls onSelectedAuth with token');
assert.equal(this.token, 'token', 'calls onToken with token');
assert.ok(this.handler.calledOnce, 'calls the onSubmit handler');
}, 50);
await waitUntil(() => {
return this.openSpy.calledOnce;
});
this.window.trigger('storage', {
key: 'oidcState',
newValue: JSON.stringify({
path: 'foo',
state: 'state',
code: 'code',
}),
});
await settled();
assert.equal(this.selectedAuth, 'token', 'calls onSelectedAuth with token');
assert.equal(this.token, 'token', 'calls onToken with token');
assert.ok(this.handler.calledOnce, 'calls the onSubmit handler');
});
});

View file

@ -45,7 +45,7 @@ module('Integration | Component | config pki ca', function(hooks) {
pem: pem,
backend: 'pki',
caChain: 'caChain',
der: new File(['der'], { type: 'text/plain' }),
der: new Blob(['der'], { type: 'text/plain' }),
});
};

View file

@ -36,16 +36,19 @@ module('Integration | Component | form field', function(hooks) {
this.set('model', model);
await render(hbs`{{form-field attr=attr model=model}}`);
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.notOk(component.hasInput, 'renders only the label');
});
test('it renders: string', async function(assert) {
let [model, spy] = await setup.call(this, createAttr('foo', 'string', { defaultValue: 'default' }));
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.equal(component.fields[0].inputValue, 'default', 'renders default value');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.equal(component.fields.objectAt(0).inputValue, 'default', 'renders default value');
assert.ok(component.hasInput, 'renders input for string');
await component.fields[0].input('bar').change();
await component.fields
.objectAt(0)
.input('bar')
.change();
assert.equal(model.get('foo'), 'bar');
assert.ok(spy.calledWith('foo', 'bar'), 'onChange called with correct args');
@ -53,10 +56,10 @@ module('Integration | Component | form field', function(hooks) {
test('it renders: boolean', async function(assert) {
let [model, spy] = await setup.call(this, createAttr('foo', 'boolean', { defaultValue: false }));
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.notOk(component.fields[0].inputChecked, 'renders default value');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.notOk(component.fields.objectAt(0).inputChecked, 'renders default value');
assert.ok(component.hasCheckbox, 'renders a checkbox for boolean');
await component.fields[0].clickLabel();
await component.fields.objectAt(0).clickLabel();
assert.equal(model.get('foo'), true);
assert.ok(spy.calledWith('foo', true), 'onChange called with correct args');
@ -64,10 +67,13 @@ module('Integration | Component | form field', function(hooks) {
test('it renders: number', async function(assert) {
let [model, spy] = await setup.call(this, createAttr('foo', 'number', { defaultValue: 5 }));
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.equal(component.fields[0].inputValue, 5, 'renders default value');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.equal(component.fields.objectAt(0).inputValue, 5, 'renders default value');
assert.ok(component.hasInput, 'renders input for number');
await component.fields[0].input(8).change();
await component.fields
.objectAt(0)
.input(8)
.change();
assert.equal(model.get('foo'), 8);
assert.ok(spy.calledWith('foo', '8'), 'onChange called with correct args');
@ -75,7 +81,7 @@ module('Integration | Component | form field', function(hooks) {
test('it renders: object', async function(assert) {
await setup.call(this, createAttr('foo', 'object'));
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.ok(component.hasJSONEditor, 'renders the json editor');
});
@ -84,10 +90,10 @@ module('Integration | Component | form field', function(hooks) {
this,
createAttr('foo', 'string', { defaultValue: 'goodbye', editType: 'textarea' })
);
assert.equal(component.fields[0].labelText, 'Foo', 'renders a label');
assert.equal(component.fields.objectAt(0).labelText, 'Foo', 'renders a label');
assert.ok(component.hasTextarea, 'renders a textarea');
assert.equal(component.fields[0].textareaValue, 'goodbye', 'renders default value');
await component.fields[0].textarea('hello');
assert.equal(component.fields.objectAt(0).textareaValue, 'goodbye', 'renders default value');
await component.fields.objectAt(0).textarea('hello');
assert.equal(model.get('foo'), 'hello');
assert.ok(spy.calledWith('foo', 'hello'), 'onChange called with correct args');
@ -101,8 +107,11 @@ module('Integration | Component | form field', function(hooks) {
test('it renders: editType ttl', async function(assert) {
let [model, spy] = await setup.call(this, createAttr('foo', null, { editType: 'ttl' }));
assert.ok(component.hasTTLPicker, 'renders the ttl-picker component');
await component.fields[0].input('3');
await component.fields[0].select('h').change();
await component.fields.objectAt(0).input('3');
await component.fields
.objectAt(0)
.select('h')
.change();
assert.equal(model.get('foo'), '3h');
assert.ok(spy.calledWith('foo', '3h'), 'onChange called with correct args');
@ -112,7 +121,10 @@ module('Integration | Component | form field', function(hooks) {
let [model, spy] = await setup.call(this, createAttr('foo', 'string', { editType: 'stringArray' }));
assert.ok(component.hasStringList, 'renders the string-list component');
await component.fields[0].input('array').change();
await component.fields
.objectAt(0)
.input('array')
.change();
assert.deepEqual(model.get('foo'), ['array'], 'sets the value on the model');
assert.deepEqual(spy.args[0], ['foo', ['array']], 'onChange called with correct args');
});
@ -120,14 +132,14 @@ module('Integration | Component | form field', function(hooks) {
test('it renders: sensitive', async function(assert) {
let [model, spy] = await setup.call(this, createAttr('password', 'string', { sensitive: true }));
assert.ok(component.hasMaskedInput, 'renders the masked-input component');
await component.fields[0].textarea('secret');
await component.fields.objectAt(0).textarea('secret');
assert.equal(model.get('password'), 'secret');
assert.ok(spy.calledWith('password', 'secret'), 'onChange called with correct args');
});
test('it uses a passed label', async function(assert) {
await setup.call(this, createAttr('foo', 'string', { label: 'Not Foo' }));
assert.equal(component.fields[0].labelText, 'Not Foo', 'renders the label from options');
assert.equal(component.fields.objectAt(0).labelText, 'Not Foo', 'renders the label from options');
});
test('it renders a help tooltip', async function(assert) {

View file

@ -30,15 +30,19 @@ module('Integration | Component | license info', function(hooks) {
assert.equal(component.hasSaveButton, true, 'it renders the save button');
assert.equal(component.hasTextInput, true, 'it renders text input for new license');
assert.equal(component.featureRows.length, FEATURES.length, 'it renders all of the features');
assert.equal(component.featureRows[0].featureName, 'HSM', 'it renders HSM feature');
assert.equal(component.featureRows[0].featureStatus, 'Active', 'it renders Active for HSM feature');
assert.equal(component.featureRows.objectAt(0).featureName, 'HSM', 'it renders HSM feature');
assert.equal(
component.featureRows[1].featureName,
component.featureRows.objectAt(0).featureStatus,
'Active',
'it renders Active for HSM feature'
);
assert.equal(
component.featureRows.objectAt(1).featureName,
'Performance Replication',
'it renders Performance Replication feature name'
);
assert.equal(
component.featureRows[1].featureStatus,
component.featureRows.objectAt(1).featureStatus,
'Not Active',
'it renders Not Active for Performance Replication'
);

View file

@ -1,13 +1,14 @@
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render, click, fillIn, findAll, find, triggerEvent, waitUntil } from '@ember/test-helpers';
import { settled, render, click, fillIn, findAll, find, triggerEvent, waitUntil } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile';
let file;
const fileEvent = () => {
const data = { some: 'content' };
file = new File([JSON.stringify(data, null, 2)], 'file.json', { type: 'application/json' });
return ['change', [file]];
file = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' });
file.name = 'file.json';
return ['change', { files: [file] }];
};
module('Integration | Component | pgp file', function(hooks) {
@ -81,6 +82,7 @@ module('Integration | Component | pgp file', function(hooks) {
await render(hbs`{{pgp-file index=index key=key onChange=(action change)}}`);
await triggerEvent('[data-test-pgp-file-input]', ...event);
await settled();
await click('[data-test-text-toggle]');
assert.equal(findAll('[data-test-pgp-file-textarea]').length, 1, 'renders the textarea on toggle');
assert.equal(

View file

@ -19,7 +19,9 @@ module('Integration | Component | radial progress', function(hooks) {
});
test('it renders', async function(assert) {
let circumference = (19 / 2) * Math.PI * 2;
// We have to manually round the circumference, strokeDash, and strokeDashOffset because
// ie11 truncates decimals differently than other browsers.
let circumference = ((19 / 2) * Math.PI * 2).toFixed(2);
await render(hbs`{{radial-progress progressDecimal=0.5}}`);
assert.equal(component.viewBox, '0 0 20 20');
@ -29,7 +31,7 @@ module('Integration | Component | radial progress', function(hooks) {
assert.equal(component.r, 19 / 2);
assert.equal(component.cx, 10);
assert.equal(component.cy, 10);
assert.equal(component.strokeDash, circumference);
assert.equal(component.strokeDashOffset, circumference * 0.5);
assert.equal(Number(component.strokeDash).toFixed(2), circumference);
assert.equal(Number(component.strokeDashOffset).toFixed(3), (circumference * 0.5).toFixed(3));
});
});

View file

@ -67,7 +67,11 @@ module('Integration | Component | search select', function(hooks) {
await render(hbs`{{search-select label="foo" models=models onChange=onChange}}`);
await clickTrigger();
assert.equal(component.options.length, 3, 'shows all options');
assert.equal(component.options[0].text, component.selectedOptionText, 'first object in list is focused');
assert.equal(
component.options.objectAt(0).text,
component.selectedOptionText,
'first object in list is focused'
);
});
test('it filters options when text is entered', async function(assert) {
@ -114,7 +118,7 @@ module('Integration | Component | search select', function(hooks) {
this.set('inputValue', ['8']);
await render(hbs`{{search-select label="foo" inputValue=inputValue models=models onChange=onChange}}`);
assert.equal(component.selectedOptions.length, 1, 'there is 1 selected option');
await component.deleteButtons[0].click();
await component.deleteButtons.objectAt(0).click();
assert.equal(component.selectedOptions.length, 0, 'there are no selected options');
assert.ok(this.onChange.calledOnce);
assert.ok(this.onChange.calledWith([]));
@ -141,7 +145,11 @@ module('Integration | Component | search select', function(hooks) {
);
await clickTrigger();
assert.equal(component.options.length, 1, 'has the disabled no results option');
assert.equal(component.options[0].text, 'No results found', 'text of option shows No results found');
assert.equal(
component.options.objectAt(0).text,
'No results found',
'text of option shows No results found'
);
});
test('it shows both name and smaller id for identity endpoints', async function(assert) {

View file

@ -1,4 +1,4 @@
import { clickable, collection, fillable, text, value } from 'ember-cli-page-object';
import { clickable, collection, fillable, text, value, attribute } from 'ember-cli-page-object';
import fields from './form-field';
import errorText from './alert-banner';
@ -14,11 +14,11 @@ export default {
pathValue: value('[data-test-input="path"]'),
types: collection('[data-test-mount-type-radio] input', {
select: clickable(),
mountType: value(),
id: attribute('id'),
}),
type: fillable('[name="mount-type"]'),
async selectType(type) {
return this.types.filterBy('mountType', type)[0].select();
return this.types.filterBy('id', type)[0].select();
},
async mount(type, path) {
await this.selectType(type);

View file

@ -6,4 +6,6 @@ import './helpers/flash-message';
setApplication(Application.create(config.APP));
start();
start({
setupTestIsolationValidation: true,
});

View file

@ -71,6 +71,17 @@
source-map "^0.5.0"
trim-right "^1.0.1"
"@babel/generator@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041"
integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==
dependencies:
"@babel/types" "^7.4.4"
jsesc "^2.5.1"
lodash "^4.17.11"
source-map "^0.5.0"
trim-right "^1.0.1"
"@babel/helper-annotate-as-pure@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
@ -107,6 +118,18 @@
"@babel/helper-replace-supers" "^7.3.4"
"@babel/helper-split-export-declaration" "^7.0.0"
"@babel/helper-create-class-features-plugin@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba"
integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==
dependencies:
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-member-expression-to-functions" "^7.0.0"
"@babel/helper-optimise-call-expression" "^7.0.0"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/helper-replace-supers" "^7.4.4"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/helper-define-map@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c"
@ -223,6 +246,16 @@
"@babel/traverse" "^7.3.4"
"@babel/types" "^7.3.4"
"@babel/helper-replace-supers@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27"
integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==
dependencies:
"@babel/helper-member-expression-to-functions" "^7.0.0"
"@babel/helper-optimise-call-expression" "^7.0.0"
"@babel/traverse" "^7.4.4"
"@babel/types" "^7.4.4"
"@babel/helper-simple-access@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
@ -238,6 +271,13 @@
dependencies:
"@babel/types" "^7.0.0"
"@babel/helper-split-export-declaration@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
dependencies:
"@babel/types" "^7.4.4"
"@babel/helper-wrap-function@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz#8cf54e9190706067f016af8f75cb3df829cc8c66"
@ -285,6 +325,11 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c"
integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==
"@babel/parser@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.4.tgz#5977129431b8fe33471730d255ce8654ae1250b6"
integrity sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==
"@babel/plugin-proposal-async-generator-functions@^7.1.0":
version "7.1.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz#41c1a702e10081456e23a7b74d891922dd1bb6ce"
@ -311,6 +356,23 @@
"@babel/helper-create-class-features-plugin" "^7.3.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-class-properties@^7.3.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce"
integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.4.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-decorators@^7.3.0":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0"
integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==
dependencies:
"@babel/helper-create-class-features-plugin" "^7.4.4"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-decorators" "^7.2.0"
"@babel/plugin-proposal-json-strings@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e"
@ -391,6 +453,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-decorators@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b"
integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-dynamic-import@^7.2.0":
version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
@ -1047,6 +1116,21 @@
globals "^11.1.0"
lodash "^4.17.11"
"@babel/traverse@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.4.tgz#0776f038f6d78361860b6823887d4f3937133fe8"
integrity sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/generator" "^7.4.4"
"@babel/helper-function-name" "^7.1.0"
"@babel/helper-split-export-declaration" "^7.4.4"
"@babel/parser" "^7.4.4"
"@babel/types" "^7.4.4"
debug "^4.1.0"
globals "^11.1.0"
lodash "^4.17.11"
"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d"
@ -1065,6 +1149,15 @@
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@babel/types@^7.4.4":
version "7.4.4"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0"
integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==
dependencies:
esutils "^2.0.2"
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@ember/jquery@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.5.2.tgz#fe312c03ada0022fa092d23f7cd7e2eb0374b53a"
@ -1097,16 +1190,7 @@
ember-cli-babel "^6.16.0"
ember-compatibility-helpers "^1.0.0"
"@ember/test-helpers@^0.7.18":
version "0.7.25"
resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.25.tgz#b4014c108b40ffaf74f3c4d5918800917541541d"
integrity sha1-tAFMEItA/69088TVkYgAkXVBVB0=
dependencies:
broccoli-funnel "^2.0.1"
ember-cli-babel "^6.12.0"
ember-cli-htmlbars-inline-precompile "^1.0.0"
"@ember/test-helpers@^1.3.1":
"@ember/test-helpers@^1.3.1", "@ember/test-helpers@^1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.5.0.tgz#a480181c412778294e317c256d04ca52e63c813a"
integrity sha512-RrS0O3VlDASMsI6v9nxUgO0k8EJGy1nzz/1HgiScbu8LbCpPj4Mp8S82yT/olXA3TShu7c/RfLZHjlN/iRW2OA==
@ -3107,6 +3191,13 @@ babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11:
dependencies:
semver "^5.3.0"
babel-plugin-debug-macros@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz#0120ac20ce06ccc57bf493b667cf24b85c28da7a"
integrity sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA==
dependencies:
semver "^5.3.0"
babel-plugin-debug-macros@^0.2.0-beta.6:
version "0.2.0-beta.6"
resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0-beta.6.tgz#ecdf6e408d5c863ab21740d7ad7f43f027d2f912"
@ -4396,7 +4487,7 @@ broccoli-merge-trees@^3.0.0:
broccoli-plugin "^1.3.0"
merge-trees "^2.0.0"
broccoli-merge-trees@^3.0.2:
broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-3.0.2.tgz#f33b451994225522b5c9bcf27d59decfd8ba537d"
integrity sha512-ZyPAwrOdlCddduFbsMyyFzJUrvW6b04pMvDiAQZrCwghlvgowJDY+EfoXn+eR1RRA5nmGHJ+B68T63VnpRiT1A==
@ -4743,6 +4834,24 @@ browserslist@^4.3.4, browserslist@^4.4.2:
electron-to-chromium "^1.3.113"
node-releases "^1.1.8"
browserstack-local@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.4.0.tgz#d979cac056f57b9af159b3bcd7fdc09b4354537c"
integrity sha512-BUJWxIsJkJxqfTPJIvGWTsf+IYSqSFUeFNW9tnuyTG7va/0LkXLhIi/ErFGDle1urQkol48HlQUXj4QrliXFpg==
dependencies:
https-proxy-agent "^2.2.1"
is-running "^2.0.0"
ps-tree "=1.1.1"
sinon "^1.17.6"
temp-fs "^0.9.9"
browserstack@^1.5.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.2.tgz#17d8bb76127a1cc0ea416424df80d218f803673f"
integrity sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==
dependencies:
https-proxy-agent "^2.2.1"
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@ -6619,7 +6728,7 @@ duplexer3@^0.1.4:
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
duplexer@^0.1.1:
duplexer@^0.1.1, duplexer@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
@ -6795,6 +6904,11 @@ ember-cli-autoprefixer@^0.8.1:
broccoli-autoprefixer "^5.0.0"
lodash "^4.0.0"
ember-cli-babel-plugin-helpers@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac"
integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA==
ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.0.0-beta.9, ember-cli-babel@^6.10.0, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0, ember-cli-babel@^6.9.2:
version "6.17.0"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.17.0.tgz#1f3e8ed9f4e2338caef6bc2c3d08d3c9928d0ddd"
@ -6903,6 +7017,33 @@ ember-cli-babel@^7.4.3:
ensure-posix-path "^1.0.2"
semver "^5.5.0"
ember-cli-babel@^7.5.0:
version "7.7.3"
resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0"
integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg==
dependencies:
"@babel/core" "^7.0.0"
"@babel/plugin-proposal-class-properties" "^7.3.4"
"@babel/plugin-proposal-decorators" "^7.3.0"
"@babel/plugin-transform-modules-amd" "^7.0.0"
"@babel/plugin-transform-runtime" "^7.2.0"
"@babel/polyfill" "^7.0.0"
"@babel/preset-env" "^7.0.0"
"@babel/runtime" "^7.2.0"
amd-name-resolver "^1.2.1"
babel-plugin-debug-macros "^0.3.0"
babel-plugin-ember-modules-api-polyfill "^2.8.0"
babel-plugin-module-resolver "^3.1.1"
broccoli-babel-transpiler "^7.1.2"
broccoli-debug "^0.6.4"
broccoli-funnel "^2.0.1"
broccoli-source "^1.1.0"
clone "^2.1.2"
ember-cli-babel-plugin-helpers "^1.1.0"
ember-cli-version-checker "^2.1.2"
ensure-posix-path "^1.0.2"
semver "^5.5.0"
ember-cli-broccoli-sane-watcher@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.1.1.tgz#1687adada9022de26053fba833dc7dd10f03dd08"
@ -6914,6 +7055,16 @@ ember-cli-broccoli-sane-watcher@^2.1.1:
rsvp "^3.0.18"
sane "^2.4.1"
ember-cli-browserstack@^0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/ember-cli-browserstack/-/ember-cli-browserstack-0.0.7.tgz#79327eff1d2330f8baadada440413d5c7af22862"
integrity sha512-7uWk0hdqCVKpjT2CG5CAKl/NCnL3bE1ITMoNGixx2QNzRUfq4TWQ+1geLpvObzmMLTY0PWlG1Rx152fXRxtTAw==
dependencies:
browserstack "^1.5.0"
browserstack-local "^1.3.0"
rsvp "^4.7.0"
yargs "^10.0.3"
ember-cli-clipboard@^0.8.0:
version "0.8.1"
resolved "https://registry.yarnpkg.com/ember-cli-clipboard/-/ember-cli-clipboard-0.8.1.tgz#59f8eb6ba471a7668dff592fcebb7b06014240dd"
@ -6944,6 +7095,16 @@ ember-cli-dependency-checker@^3.0.0:
resolve "^1.5.0"
semver "^5.3.0"
ember-cli-deprecation-workflow@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ember-cli-deprecation-workflow/-/ember-cli-deprecation-workflow-1.0.1.tgz#3305a6879af7f074216a54963d92491c411ce7e0"
integrity sha512-tns8l4FLz8zmhmNRH7ywihs4XNTTuQysl+POYTpiyjb4zPNKv0cUJBCT/MklYFWBCo/5DcVzabhLODJZcScUfg==
dependencies:
broccoli-funnel "^2.0.1"
broccoli-merge-trees "^3.0.1"
broccoli-plugin "^1.3.1"
ember-debug-handlers-polyfill "^1.1.1"
ember-cli-flash@1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/ember-cli-flash/-/ember-cli-flash-1.7.1.tgz#0b9d2464d80144df0c65e928b6fc006259ef6a58"
@ -6958,7 +7119,7 @@ ember-cli-get-component-path-option@^1.0.0:
resolved "https://registry.yarnpkg.com/ember-cli-get-component-path-option/-/ember-cli-get-component-path-option-1.0.0.tgz#0d7b595559e2f9050abed804f1d8eff1b08bc771"
integrity sha1-DXtZVVni+QUKvtgE8djv8bCLx3E=
ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3:
ember-cli-htmlbars-inline-precompile@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.3.tgz#332ff96c06fc522965162f1090d78a615379c3c2"
integrity sha1-My/5bAb8UillFi8QkNeKYVN5w8I=
@ -7052,15 +7213,15 @@ ember-cli-normalize-entity-name@^1.0.0:
dependencies:
silent-error "^1.0.0"
ember-cli-page-object@1.15.0-beta.3:
version "1.15.0-beta.3"
resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.0-beta.3.tgz#e41f3a33e35a6717c507b1a4c13fc990950c7d35"
integrity sha512-RuFhCuz32Ww4oguG0DdF4pxrqoxfmE1RMQ3aXw/IyzpAEKe9cPWY7ZZovW7zPKEoeu9hNQ9qRttH/vnlVMGalg==
ember-cli-page-object@^1.15.3:
version "1.15.3"
resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.3.tgz#4b1814e270367a455353aeb81019fb8d8c641886"
integrity sha512-wGZqQnsyFHcJilf0xcWa53my/bprtZWHXg7m6wZPbWbnJCXNf1aAouj9uwH77r3PnE+/uYt0MIKMfX3Cnd607g==
dependencies:
broccoli-file-creator "^2.1.1"
broccoli-merge-trees "^2.0.0"
ceibo "~2.0.0"
ember-cli-babel "^6.12.0"
ember-cli-babel "^6.16.0"
ember-cli-node-assets "^0.2.2"
ember-native-dom-helpers "^0.5.3"
jquery "^3.2.1"
@ -7094,14 +7255,6 @@ ember-cli-pretender@^1.0.1:
pretender "^1.4.2"
resolve "^1.2.0"
ember-cli-qunit@^4.3.2:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.3.2.tgz#cfd89ad3b0dbc28a9c2223d532b52eeade7c602c"
integrity sha1-z9ia07DbwoqcIiPVMrUu6t58YCw=
dependencies:
ember-cli-babel "^6.11.0"
ember-qunit "^3.3.2"
ember-cli-sass@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-9.0.0.tgz#d68e972d6a77b5837face7c03cfd5d1674bb1941"
@ -7192,6 +7345,14 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve
resolve "^1.3.3"
semver "^5.3.0"
ember-cli-version-checker@^3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c"
integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg==
dependencies:
resolve-package-path "^1.2.6"
semver "^5.6.0"
ember-cli@~3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.5.1.tgz#a1c7295eed935726891d40a81e0cc389f2d15fdf"
@ -7296,6 +7457,15 @@ ember-compatibility-helpers@^1.0.0:
ember-cli-version-checker "^2.1.1"
semver "^5.4.1"
ember-compatibility-helpers@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.0.tgz#feee16c5e9ef1b1f1e53903b241740ad4b01097e"
integrity sha512-pUW4MzJdcaQtwGsErYmitFRs0rlCYBAnunVzlFFUBr4xhjlCjgHJo0b53gFnhTgenNM3d3/NqLarzRhDTjXRTg==
dependencies:
babel-plugin-debug-macros "^0.2.0"
ember-cli-version-checker "^2.1.1"
semver "^5.4.1"
ember-composable-helpers@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.1.0.tgz#71f75ab2de1c696d21939b5f9dcc62eaf2c947e5"
@ -7318,13 +7488,14 @@ ember-concurrency-test-waiter@^0.3.1:
dependencies:
ember-cli-babel "^6.6.0"
ember-concurrency@^0.8.14:
version "0.8.20"
resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.8.20.tgz#2c4f84ed3eb86cd0c7be9c2d21dd23f560757ac7"
integrity sha512-pZ0+F6UoGvDWL6boRLoQ0/qrEw3K8CHZcRRswOLdsPIGboYwquPD8pStm6haS7QIaEd+gfYxXYpdGfBo3fIUmg==
ember-concurrency@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.10.0.tgz#9c7c79dca411e01466119f02d7197c0a4ff0df08"
integrity sha512-KhNNkUqnAN0isuAwSHaTJtmY/MdHJogSSAj7lCigzfJn2+21yafQcwzoVqf5LdMOn2+owWYURr1YiwzuOvlGyQ==
dependencies:
babel-core "^6.24.1"
ember-cli-babel "^6.8.2"
ember-compatibility-helpers "^1.2.0"
ember-maybe-import-regenerator "^0.1.5"
ember-concurrency@^0.8.19:
@ -7388,6 +7559,11 @@ ember-data@~3.4.0:
semver "^5.5.0"
silent-error "^1.1.0"
ember-debug-handlers-polyfill@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ember-debug-handlers-polyfill/-/ember-debug-handlers-polyfill-1.1.1.tgz#e9ae0a720271a834221179202367421b580002ef"
integrity sha512-lO7FBAqJjzbL+IjnWhVfQITypPOJmXdZngZR/Vdn513W4g/Q6Sjicao/mDzeDCb48Y70C4Facwk0LjdIpSZkRg==
ember-export-application-global@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2"
@ -7469,18 +7645,18 @@ ember-power-select@^2.0.12:
ember-text-measurer "^0.4.0"
ember-truth-helpers "^2.0.0"
ember-qunit@^3.3.2:
version "3.4.1"
resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.4.1.tgz#204a2d39a5d44d494c56bf17cf3fd12f06210359"
integrity sha512-WuWan6duE/HfygQHrgU77okTnt7B3lWcGn+N7NkBXR86pk2s+qxbX9p98uqSc0ISNt2Vg6Opz++RZn+fomHkBw==
ember-qunit@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-4.4.1.tgz#3654cadf9fa7e2287fe7b61fc7f19c3eb06222b5"
integrity sha512-RYyEqn3UpwLri4+lL9sFdDp1uPa0AfN587661iKm7r3kTAzYHxZE7jRsBDIejhgSH2kVSky0+Q9Y7oLULYiM/Q==
dependencies:
"@ember/test-helpers" "^0.7.18"
broccoli-funnel "^2.0.1"
broccoli-merge-trees "^2.0.0"
"@ember/test-helpers" "^1.5.0"
broccoli-funnel "^2.0.2"
broccoli-merge-trees "^3.0.2"
common-tags "^1.4.0"
ember-cli-babel "^6.8.2"
ember-cli-babel "^7.5.0"
ember-cli-test-loader "^2.2.0"
qunit "^2.5.0"
qunit "^2.9.2"
ember-radio-button@^1.1.1:
version "1.2.4"
@ -7592,13 +7768,13 @@ ember-template-lint@^1.0.0-beta.5:
resolve "^1.1.3"
strip-bom "^3.0.0"
ember-test-selectors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-1.0.0.tgz#a2f8cd86f4fb4c320004a2bf0e4c450d41668a21"
integrity sha1-ovjNhvT7TDIABKK/DkxFDUFmiiE=
ember-test-selectors@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-test-selectors/-/ember-test-selectors-2.1.0.tgz#faebdf06702aaa0bc510d55eb721ce54d2e85793"
integrity sha512-c5HmvefmeABH8hg380TSNZiE9VAK1CBeXWrgyXy+IXHtsew4lZHHw7GnqCAqsakxwvmaMARbAKY9KfSAE91s1g==
dependencies:
ember-cli-babel "^6.8.2"
ember-cli-version-checker "^2.0.0"
ember-cli-version-checker "^3.1.2"
ember-text-measurer@^0.4.0:
version "0.4.1"
@ -8062,6 +8238,19 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
event-stream@=3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=
dependencies:
duplexer "~0.1.1"
from "~0"
map-stream "~0.1.0"
pause-stream "0.0.11"
split "0.3"
stream-combiner "~0.0.4"
through "~2.3.1"
eventemitter3@^3.0.0, eventemitter3@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
@ -8183,11 +8372,6 @@ exenv@^1.2.0:
resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=
exists-stat@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529"
integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk=
exists-sync@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879"
@ -8689,7 +8873,7 @@ find-yarn-workspace-root@^1.1.0:
fs-extra "^4.0.3"
micromatch "^3.1.4"
findup-sync@2.0.0, findup-sync@^2.0.0:
findup-sync@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc"
integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=
@ -8808,6 +8992,13 @@ format@^0.2.2:
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
formatio@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9"
integrity sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=
dependencies:
samsam "~1.1"
formatio@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb"
@ -8848,6 +9039,11 @@ from2@^2.1.0, from2@^2.1.1:
inherits "^2.0.1"
readable-stream "^2.0.0"
from@~0:
version "0.1.7"
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
fs-extra@^0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952"
@ -10183,6 +10379,11 @@ is-alphanumerical@^1.0.0:
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
is-arguments@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@ -10353,6 +10554,11 @@ is-function@^1.0.1:
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
is-generator-function@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
is-git-url@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b"
@ -10513,6 +10719,11 @@ is-root@2.0.0:
resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.0.0.tgz#838d1e82318144e5a6f77819d90207645acc7019"
integrity sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==
is-running@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-running/-/is-running-2.1.0.tgz#30a73ff5cc3854e4fc25490809e9f5abf8de09e0"
integrity sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=
is-ssh@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.0.tgz#ebea1169a2614da392a63740366c3ce049d8dff6"
@ -11856,6 +12067,11 @@ loglevel@^1.4.1:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=
lolex@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31"
integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE=
lolex@^2.1.2, lolex@^2.3.2:
version "2.7.4"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.4.tgz#6514de2c3291e9d6f09d49ddce4a95f7d4d5a93f"
@ -12011,6 +12227,11 @@ map-or-similar@^1.5.0:
resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08"
integrity sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=
map-stream@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=
map-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
@ -12822,6 +13043,11 @@ node-version@^1.0.0:
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d"
integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==
node-watch@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.0.tgz#ab0703b60cd270783698e57a428faa0010ed8fd0"
integrity sha512-XAgTL05z75ptd7JSVejH1a2Dm1zmXYhuDr9l230Qk6Z7/7GPcnAs/UyJJ4ggsXSvWil8iOzwQLW0zuGUvHpG8g==
"nomnom@>= 1.5.x":
version "1.8.1"
resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
@ -13236,7 +13462,7 @@ object-visit@^1.0.0:
dependencies:
isobject "^3.0.0"
object.entries@^1.0.4:
object.entries@^1.0.4, object.entries@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.0.tgz#2024fc6d6ba246aee38bdb0ffd5cfbcf371b7519"
integrity sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==
@ -13778,6 +14004,13 @@ path-type@^3.0.0:
dependencies:
pify "^3.0.0"
pause-stream@0.0.11:
version "0.0.11"
resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=
dependencies:
through "~2.3"
pbkdf2@^3.0.3:
version "3.0.16"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
@ -14239,6 +14472,13 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
ps-tree@=1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.1.tgz#5f1ba35455b8c25eeb718d04c37de1555d96d3db"
integrity sha512-kef7fYYSKVqQffmzTMsVcUD1ObNJMp8sNSmHGlGKsZQyL/ht9MZKk86u0Rd1NhpTOAuhqwKCLLpktwkqz+MF8A==
dependencies:
event-stream "=3.3.4"
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@ -14370,18 +14610,16 @@ qunit-dom@^0.7.1:
broccoli-funnel "^2.0.0"
broccoli-merge-trees "^2.0.0"
qunit@^2.5.0:
version "2.6.2"
resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c"
integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg==
qunit@^2.9.2:
version "2.9.2"
resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.9.2.tgz#97919440c9c0ae838bcd3c33a2ee42f35c5ef4a0"
integrity sha512-wTOYHnioWHcx5wa85Wl15IE7D6zTZe2CQlsodS14yj7s2FZ3MviRnQluspBZsueIDEO7doiuzKlv05yfky1R7w==
dependencies:
commander "2.12.2"
exists-stat "1.0.0"
findup-sync "2.0.0"
js-reporters "1.2.1"
resolve "1.5.0"
sane "^2.5.2"
walk-sync "0.3.2"
minimatch "3.0.4"
node-watch "0.6.0"
resolve "1.9.0"
qw@~1.0.1:
version "1.0.1"
@ -15314,6 +15552,14 @@ resolve-package-path@^1.0.11:
path-root "^0.1.1"
resolve "^1.10.0"
resolve-package-path@^1.2.6:
version "1.2.7"
resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e"
integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==
dependencies:
path-root "^0.1.1"
resolve "^1.10.0"
resolve-path@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
@ -15332,12 +15578,12 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
resolve@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==
resolve@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
dependencies:
path-parse "^1.0.5"
path-parse "^1.0.6"
resolve@^1.1.3, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1:
version "1.8.1"
@ -15403,6 +15649,13 @@ rimraf@~2.2.6:
resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=
rimraf@~2.5.2:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
integrity sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=
dependencies:
glob "^7.0.5"
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@ -15550,12 +15803,22 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
samsam@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
integrity sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=
samsam@1.3.0, samsam@1.x, samsam@^1.1.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50"
integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==
sane@^2.4.1, sane@^2.5.2:
samsam@~1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621"
integrity sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE=
sane@^2.4.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa"
integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o=
@ -15906,6 +16169,16 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
sinon@^1.17.6:
version "1.17.7"
resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
integrity sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=
dependencies:
formatio "1.1.1"
lolex "1.3.2"
samsam "1.1.2"
util ">=0.10.3 <1"
sinon@^3.2.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/sinon/-/sinon-3.3.0.tgz#9132111b4bbe13c749c2848210864250165069b1"
@ -16303,6 +16576,13 @@ split2@~1.0.0:
dependencies:
through2 "~2.0.0"
split@0.3:
version "0.3.3"
resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
dependencies:
through "2"
split@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
@ -16416,6 +16696,13 @@ stream-combiner2@~1.1.1:
duplexer2 "~0.1.0"
readable-stream "^2.0.2"
stream-combiner@~0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=
dependencies:
duplexer "~0.1.1"
stream-connect@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97"
@ -16826,6 +17113,13 @@ telejson@^2.1.0, telejson@^2.1.1:
memoizerific "^1.11.3"
safe-eval "^0.4.1"
temp-fs@^0.9.9:
version "0.9.9"
resolved "https://registry.yarnpkg.com/temp-fs/-/temp-fs-0.9.9.tgz#8071730437870720e9431532fe2814364f8803d7"
integrity sha1-gHFzBDeHByDpQxUy/igUNk+IA9c=
dependencies:
rimraf "~2.5.2"
temp-path@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b"
@ -16973,7 +17267,7 @@ through2@^2.0.0, through2@^2.0.2, through2@~2.0.0:
readable-stream "^2.1.5"
xtend "~4.0.1"
through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8:
through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@ -17630,6 +17924,17 @@ util@0.10.3:
dependencies:
inherits "2.0.1"
"util@>=0.10.3 <1":
version "0.12.0"
resolved "https://registry.yarnpkg.com/util/-/util-0.12.0.tgz#bb5e3d29ba2703c7add0ad337003be3ca477798a"
integrity sha512-pPSOFl7VLhZ7LO/SFABPraZEEurkJUWSMn3MuA/r3WQZc+Z1fqou2JqLSOZbCLl73EUIxuUVX8X4jkX2vfJeAA==
dependencies:
inherits "2.0.3"
is-arguments "^1.0.4"
is-generator-function "^1.0.7"
object.entries "^1.1.0"
safe-buffer "^5.1.2"
util@^0.10.3:
version "0.10.4"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
@ -17737,14 +18042,6 @@ walk-back@^3.0.0:
resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-3.0.1.tgz#0c0012694725604960d6c2f75aaf1a1e7d455d35"
integrity sha512-umiNB2qLO731Sxbp6cfZ9pwURJzTnftxE4Gc7hq8n/ehkuXC//s9F65IEIJA2ZytQZ1ZOsm/Fju4IWx0bivkUQ==
walk-sync@0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75"
integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==
dependencies:
ensure-posix-path "^1.0.0"
matcher-collection "^1.0.0"
walk-sync@^0.2.5, walk-sync@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969"
@ -18189,7 +18486,7 @@ yargs-parser@^5.0.0:
dependencies:
camelcase "^3.0.0"
yargs-parser@^8.0.0:
yargs-parser@^8.0.0, yargs-parser@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
@ -18221,6 +18518,24 @@ yargs@10.0.3:
y18n "^3.2.1"
yargs-parser "^8.0.0"
yargs@^10.0.3:
version "10.1.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
dependencies:
cliui "^4.0.0"
decamelize "^1.1.1"
find-up "^2.1.0"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^8.1.0"
yargs@^11.0.0:
version "11.1.0"
resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"

View file

@ -0,0 +1,22 @@
---
layout: "docs"
page_title: "Vault Agent Auto-Auth Cert Method"
sidebar_title: "Cert"
sidebar_current: "docs-agent-autoauth-methods-cert"
description: |-
Cert Method for Vault Agent Auto-Auth
---
# Vault Agent Auto-Auth Cert Method
The `cert` method uses the configured TLS certificates from the `vault` stanza of
the agent configuration and takes an optional `name` parameter. There is no option
to use certificates which differ from those used in the `vault` stanza.
See TLS settings in the [`vault` Stanza](https://vaultproject.io/docs/agent/index.html#vault-stanza)
## Configuration
* `name` `(string: optional)` - The trusted certificate role which should be used
when authenticating with TLS. If a `name` is not specified, the auth method will
try to authenticate against [all trusted certificates](https://www.vaultproject.io/docs/auth/cert.html#authentication).

View file

@ -271,10 +271,10 @@ If provided, Vault output will not include ANSI color escape sequence characters
### `VAULT_RATE_LIMIT`
This enviroment variable will limit the rate at which the `vault` command
This environment variable will limit the rate at which the `vault` command
sends requests to Vault.
This enviroment variable has the format `rate[:burst]` (where items in `[]` are
This environment variable has the format `rate[:burst]` (where items in `[]` are
optional). If not specified, the burst value defaults to rate. Both rate and
burst are specified in "operations per second". If the environment variable is
not specified, then the rate and burst will be unlimited *i.e.* rate
@ -282,7 +282,7 @@ limiting is off by default.
*Note:* The rate is limited for each invocation of the `vault` CLI. Since
each invocation of the `vault` CLI typically only makes a few requests,
this enviroment variable is most useful when using the Go
this environment variable is most useful when using the Go
[Vault client API](https://www.vaultproject.io/api/libraries.html#go).
### `VAULT_NAMESPACE`

View file

@ -109,7 +109,7 @@ and [`cluster_addr`][cluster-addr] ([example][listener-example]).
lesser value.
- `lock_wait_time` `(string: "15s")` - Specifies the wait time before a lock
lock acquisition is made. This affects the minimum time it takes to cancel a
acquisition is made. This affects the minimum time it takes to cancel a
lock acquisition.
The following settings apply when communicating with Consul via an encrypted

View file

@ -262,7 +262,7 @@ The following parameters are set for the `consul` storage stanza:
The `telemetry` stanza specifies various configurations for Vault to publish metrics to upstream systems.
If you decide to configure Vault to publish telemtery data, you should review the [telemetry configuration section](/docs/configuration/telemetry.html) of our documentation.
If you decide to configure Vault to publish telemetry data, you should review the [telemetry configuration section](/docs/configuration/telemetry.html) of our documentation.
### High Availability Parameters