Merge branch 'master' into fix-ou-ordering
This commit is contained in:
commit
a9e8f3e7b1
173
.circleci/config.yml
Normal file
173
.circleci/config.yml
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
6
Makefile
6
Makefile
|
@ -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
|
||||
|
|
|
@ -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":
|
||||
|
|
65
command/agent/auth/cert/cert.go
Normal file
65
command/agent/auth/cert/cert.go
Normal 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() {}
|
244
command/agent/cert_with_name_end_to_end_test.go
Normal file
244
command/agent/cert_with_name_end_to_end_test.go
Normal 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()
|
||||
}
|
241
command/agent/cert_with_no_name_end_to_end_test.go
Normal file
241
command/agent/cert_with_no_name_end_to_end_test.go
Normal 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()
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
14
sdk/framework/testdata/operations.json
vendored
14
sdk/framework/testdata/operations.json
vendored
|
@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
14
ui/README.md
14
ui/README.md
|
@ -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/)
|
||||
|
|
|
@ -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.'
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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`,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}),
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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' },
|
||||
},
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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}}
|
||||
|
|
11
ui/config/deprecation-workflow.js
Normal file
11
ui/config/deprecation-workflow.js
Normal 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' },
|
||||
],
|
||||
};
|
|
@ -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') {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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",
|
||||
|
|
37
ui/scripts/run-browserstack-tests.js
Normal file
37
ui/scripts/run-browserstack-tests.js
Normal 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
92
ui/testem.browserstack.js
Normal 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',
|
||||
},
|
||||
},
|
||||
};
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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' }),
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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'
|
||||
);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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));
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -6,4 +6,6 @@ import './helpers/flash-message';
|
|||
|
||||
setApplication(Application.create(config.APP));
|
||||
|
||||
start();
|
||||
start({
|
||||
setupTestIsolationValidation: true,
|
||||
});
|
||||
|
|
467
ui/yarn.lock
467
ui/yarn.lock
|
@ -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"
|
||||
|
|
22
website/source/docs/agent/autoauth/methods/cert.md
Normal file
22
website/source/docs/agent/autoauth/methods/cert.md
Normal 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).
|
|
@ -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`
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue