diff --git a/internal/bsr/bsr.go b/internal/bsr/bsr.go index f87b5d71f..e682f2e24 100644 --- a/internal/bsr/bsr.go +++ b/internal/bsr/bsr.go @@ -48,8 +48,16 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { s := &SessionMeta{} user := &User{Scope: Scope{}} target := &Target{Scope: Scope{}} + worker := &Worker{} sHost := &StaticHost{Catalog: StaticHostCatalog{}} dHost := &DynamicHost{Catalog: DynamicHostCatalog{}} + staticCredStore := make(map[string]StaticCredentialStore) + scStoreToJsonCreds := make(map[string]StaticJsonCredential) + scStoreToUPCreds := make(map[string]StaticUsernamePasswordCredential) + scStoreToSshCreds := make(map[string]StaticSshPrivateKeyCredential) + vaultCredStore := make(map[string]VaultCredentialStore) + vsStoreToVaultLib := make(map[string]VaultLibrary) + vsStoreToVaultSshCertLib := make(map[string]VaultSshCertLibrary) scanner := bufio.NewScanner(r) for scanner.Scan() { @@ -91,8 +99,6 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { // Target case k == "target_publicId": target.PublicId = v - case k == "target_projectId": - target.ProjectId = v case k == "target_name": target.Name = v case k == "target_description": @@ -134,6 +140,14 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { case k == "target_scope_primaryAuthMethod": target.Scope.PrimaryAuthMethodId = v + // Worker + case k == "worker_publicId": + worker.PublicId = v + case k == "worker_version": + worker.Version = v + case k == "worker_sha": + worker.Sha = v + // Static Host case k == "staticHost_publicId": sHost.PublicId = v @@ -174,6 +188,202 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { case k == "dynamicHostCatalog_attributes": dHost.Catalog.Attributes = v + // Static Credential Store + case strings.Contains(k, "staticCredentialStore_"): + idx := strings.Index(k, "_staticCredentialStore") + sId := k[:idx] + scs, ok := staticCredStore[sId] + if !ok { + scs = StaticCredentialStore{ + PublicId: sId, + } + } + switch { + case strings.Contains(k, "staticJsonCredential"): + idxEnd := strings.Index(k, "_staticJsonCredential") + idxStart := strings.Index(k, "_credential_") + len("_credential_") + credId := k[idxStart:idxEnd] + // credstoreid - staticJsonCredentialid in the map + mapId := fmt.Sprintf("%s-%s", sId, credId) + c, ok := scStoreToJsonCreds[mapId] + if !ok { + c = StaticJsonCredential{ + PublicId: credId, + } + } + switch { + case strings.Contains(k, "_projectId"): + c.ProjectId = v + case strings.Contains(k, "_name"): + c.Name = v + case strings.Contains(k, "_description"): + c.Description = v + case strings.Contains(k, "_objectHmac"): + c.ObjectHmac = []byte(v) + } + scStoreToJsonCreds[mapId] = c + case strings.Contains(k, "staticUsernamePasswordCredential"): + idxEnd := strings.Index(k, "_staticJUsernamePasswordCredential") + idxStart := strings.Index(k, "_credential_") + len("_credential_") + credId := k[idxStart:idxEnd] + // credstoreid - UsernamePasswordCredentialid in the map + mapId := fmt.Sprintf("%s-%s", sId, credId) + c, ok := scStoreToUPCreds[mapId] + if !ok { + c = StaticUsernamePasswordCredential{ + PublicId: credId, + } + } + switch { + case strings.Contains(k, "_projectId"): + c.ProjectId = v + case strings.Contains(k, "_name"): + c.Name = v + case strings.Contains(k, "_description"): + c.Description = v + case strings.Contains(k, "_passwordHmac"): + c.PasswordHmac = []byte(v) + } + scStoreToUPCreds[mapId] = c + case strings.Contains(k, "staticSshPrivateKeyCredential"): + idxEnd := strings.Index(k, "_staticSshPrivateKeyCredential") + idxStart := strings.Index(k, "_credential_") + len("_credential_") + credId := k[idxStart:idxEnd] + // credstoreid - staticSshPrivateKeyid in the map + mapId := fmt.Sprintf("%s-%s", sId, credId) + c, ok := scStoreToSshCreds[mapId] + if !ok { + c = StaticSshPrivateKeyCredential{ + PublicId: credId, + } + } + switch { + case strings.Contains(k, "_projectId"): + c.ProjectId = v + case strings.Contains(k, "_name"): + c.Name = v + case strings.Contains(k, "_description"): + c.Description = v + case strings.Contains(k, "_privateKeyHmac"): + c.PrivateKeyHmac = []byte(v) + case strings.Contains(k, "_privateKeyPassphraseHmac"): + c.PrivateKeyPassphraseHmac = []byte(v) + } + scStoreToSshCreds[mapId] = c + case strings.Contains(k, "_projectId"): + scs.ProjectId = v + case strings.Contains(k, "_name"): + scs.Name = v + case strings.Contains(k, "_description"): + scs.Description = v + } + staticCredStore[sId] = scs + + // Vault Credential Store + case strings.Contains(k, "vaultCredentialStore_"): + idx := strings.Index(k, "_vaultCredentialStore") + vId := k[:idx] + vcs, ok := vaultCredStore[vId] + if !ok { + vcs = VaultCredentialStore{ + PublicId: vId, + } + } + switch { + case strings.Contains(k, "vaultLibrary"): + idxEnd := strings.Index(k, "_vaultLibrary") + idxStart := strings.Index(k, "_credential_") + len("_credential_") + credId := k[idxStart:idxEnd] + // credstoreid - vaultLibraryid in the map + mapId := fmt.Sprintf("%s-%s", vId, credId) + c, ok := vsStoreToVaultLib[mapId] + if !ok { + c = VaultLibrary{ + PublicId: credId, + } + } + switch { + case strings.Contains(k, "_projectId"): + c.ProjectId = v + case strings.Contains(k, "_name"): + c.Name = v + case strings.Contains(k, "_description"): + c.Description = v + case strings.Contains(k, "_vaultPath"): + c.VaultPath = v + case strings.Contains(k, "_httpMethod"): + c.HttpMethod = v + case strings.Contains(k, "_httpRequestBody"): + c.HttpRequestBody = []byte(v) + case strings.Contains(k, "_credentialType"): + c.CredentialType = v + } + vsStoreToVaultLib[mapId] = c + case strings.Contains(k, "vaultSshCertLibrary"): + idxEnd := strings.Index(k, "_vaultSshCertLibrary") + idxStart := strings.Index(k, "_credential_") + len("_credential_") + credId := k[idxStart:idxEnd] + // credstoreid - vaultSshCertLibraryid in the map + mapId := fmt.Sprintf("%s-%s", vId, credId) + c, ok := vsStoreToVaultSshCertLib[mapId] + if !ok { + c = VaultSshCertLibrary{ + PublicId: credId, + } + } + switch { + case strings.Contains(k, "_projectId"): + c.ProjectId = v + case strings.Contains(k, "_username"): + c.Username = v + case strings.Contains(k, "_name"): + c.Name = v + case strings.Contains(k, "_description"): + c.Description = v + case strings.Contains(k, "_vaultPath"): + c.VaultPath = v + case strings.Contains(k, "_keyType"): + c.KeyType = v + case strings.Contains(k, "_keyBits"): + var err error + c.KeyBits, err = strconv.Atoi(v) + if err != nil { + return nil, err + } + case strings.Contains(k, "_ttl"): + c.Ttl = v + case strings.Contains(k, "_criticalOptions"): + c.CriticalOptions = []byte(v) + case strings.Contains(k, "_extensions"): + c.Extensions = []byte(v) + case strings.Contains(k, "_credentialType"): + c.CredentialType = v + } + vsStoreToVaultSshCertLib[mapId] = c + case strings.Contains(k, "_projectId"): + vcs.ProjectId = v + case strings.Contains(k, "_namespace"): + vcs.Namespace = v + case strings.Contains(k, "_name"): + vcs.Name = v + case strings.Contains(k, "_description"): + vcs.Description = v + case strings.Contains(k, "_vaultAddress"): + vcs.VaultAddress = v + + case strings.Contains(k, "_tlsServerName"): + vcs.TlsServerName = v + case strings.Contains(k, "_tlsSkipVerify"): + var err error + vcs.TlsSkipVerify, err = strconv.ParseBool(v) + if err != nil { + return nil, err + } + case strings.Contains(k, "_workerFilter"): + vcs.WorkerFilter = v + } + vaultCredStore[vId] = vcs + // connections case k == "connection": connections[v] = true @@ -181,6 +391,7 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { } s.Target = target + s.Worker = worker s.User = user if sHost.PublicId != "" { s.StaticHost = sHost @@ -188,6 +399,59 @@ func decodeSessionMeta(ctx context.Context, r io.Reader) (*SessionMeta, error) { if dHost.PublicId != "" { s.DynamicHost = dHost } + + for k, v := range scStoreToJsonCreds { + scId, _, ok := strings.Cut(k, "-") + if ok { + staticCred := staticCredStore[scId] + staticCred.Credentials = append(staticCred.Credentials, v) + staticCredStore[scId] = staticCred + } + } + for k, v := range scStoreToUPCreds { + scId, _, ok := strings.Cut(k, "-") + if ok { + staticCred := staticCredStore[scId] + staticCred.Credentials = append(staticCred.Credentials, v) + staticCredStore[scId] = staticCred + } + } + for k, v := range scStoreToSshCreds { + scId, _, ok := strings.Cut(k, "-") + if ok { + staticCred := staticCredStore[scId] + staticCred.Credentials = append(staticCred.Credentials, v) + staticCredStore[scId] = staticCred + } + } + scStores := make([]StaticCredentialStore, 0) + for _, v := range staticCredStore { + scStores = append(scStores, v) + } + + for k, v := range vsStoreToVaultSshCertLib { + vlId, _, ok := strings.Cut(k, "-") + if ok { + vaultLib := vaultCredStore[vlId] + vaultLib.CredentialLibraries = append(vaultLib.CredentialLibraries, v) + vaultCredStore[vlId] = vaultLib + } + } + for k, v := range vsStoreToVaultLib { + vlId, _, ok := strings.Cut(k, "-") + if ok { + vaultLib := vaultCredStore[vlId] + vaultLib.CredentialLibraries = append(vaultLib.CredentialLibraries, v) + vaultCredStore[vlId] = vaultLib + } + } + vcStores := make([]VaultCredentialStore, 0) + for _, v := range vaultCredStore { + vcStores = append(vcStores, v) + } + + s.StaticCredentialStore = scStores + s.VaultCredentialStore = vcStores s.connections = connections return s, nil diff --git a/internal/bsr/bsr_open_test.go b/internal/bsr/bsr_open_test.go index b9dfbb7ec..53baf244d 100644 --- a/internal/bsr/bsr_open_test.go +++ b/internal/bsr/bsr_open_test.go @@ -112,18 +112,18 @@ func TestOpenBSRMethods(t *testing.T) { require.NoError(t, err) require.NotNil(t, opSesh) sesh.Meta.connections = opSesh.Meta.connections - require.Equal(t, opSesh.Meta, sesh.Meta) + require.Equal(t, sesh.Meta, opSesh.Meta) opConn, err := opSesh.OpenConnection(ctx, fmt.Sprintf("connection.%s", connectionId)) require.NoError(t, err) require.NotNil(t, opConn) conn.Meta.channels = opConn.Meta.channels - require.Equal(t, opConn.Meta, conn.Meta) + require.Equal(t, conn.Meta, opConn.Meta) opChan, err := opConn.OpenChannel(ctx, fmt.Sprintf("channel.%s", channelId)) require.NoError(t, err) require.NotNil(t, opChan) - require.Equal(t, opChan.Meta, ch.Meta) + require.Equal(t, ch.Meta, opChan.Meta) } func TestOpenSession(t *testing.T) { diff --git a/internal/bsr/meta.go b/internal/bsr/meta.go index 00d3e5819..9f77189ae 100644 --- a/internal/bsr/meta.go +++ b/internal/bsr/meta.go @@ -365,8 +365,9 @@ func (s StaticCredentialStore) writeMeta(ctx context.Context, c *container) erro } } if len(s.Credentials) > 0 { + credentialPrefix := fmt.Sprintf("%s_credential", prefix) for _, sc := range s.Credentials { - err = sc.writeStaticCredentialMeta(ctx, c, prefix) + err = sc.writeStaticCredentialMeta(ctx, c, credentialPrefix) if err != nil { return err } @@ -560,8 +561,9 @@ func (v VaultCredentialStore) writeMeta(ctx context.Context, c *container) error } } if len(v.CredentialLibraries) > 0 { + credentialPrefix := fmt.Sprintf("%s_credential", prefix) for _, cl := range v.CredentialLibraries { - err = cl.writeDynamicCredentialLibraryMeta(ctx, c, prefix) + err = cl.writeDynamicCredentialLibraryMeta(ctx, c, credentialPrefix) if err != nil { return err } diff --git a/internal/bsr/testdata/TestBsr/session_multiplexed/closed/SHA256SUM b/internal/bsr/testdata/TestBsr/session_multiplexed/closed/SHA256SUM index c23501475..0dd161724 100644 --- a/internal/bsr/testdata/TestBsr/session_multiplexed/closed/SHA256SUM +++ b/internal/bsr/testdata/TestBsr/session_multiplexed/closed/SHA256SUM @@ -3,5 +3,5 @@ .* wrappedPrivKey .* pubKeyBsrSignature.sign .* pubKeySelfSignature.sign -579ecb88b936d12dd5f8ba9091151372e9dcd8cf7c696dc650c26fe968eaf852 session.meta +1aac36a2c36e4de69c5bf3522ada1c7f080ac807f2182c013ec8ddf60bedae10 session.meta e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 session.summary diff --git a/internal/bsr/testdata/TestBsr/session_multiplexed/closed/session.meta b/internal/bsr/testdata/TestBsr/session_multiplexed/closed/session.meta index 2c94027a2..cb1e86b02 100644 --- a/internal/bsr/testdata/TestBsr/session_multiplexed/closed/session.meta +++ b/internal/bsr/testdata/TestBsr/session_multiplexed/closed/session.meta @@ -19,18 +19,18 @@ staticHostCatalog_projectId: proj123 staticHost_address: 127.0.0.1 scs123_staticCredentialStore_publicId: scs123 scs123_staticCredentialStore_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_publicId: scjson123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_objectHmac: hmac +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_publicId: scjson123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_projectId: proj123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_objectHmac: hmac vcs123_vaultCredentialStore_publicId: vcs123 vcs123_vaultCredentialStore_projectId: proj123 vcs123_vaultCredentialStore_vaultAddress: an/address vcs123_vaultCredentialStore_namespace: name vcs123_vaultCredentialStore_tlsServerName: imaserver vcs123_vaultCredentialStore_tlsSkipVerify: false -vcs123_vaultCredentialStore_vl123_vaultLibrary_publicId: vl123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_projectId: proj123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_vaultPath: /a/path -vcs123_vaultCredentialStore_vl123_vaultLibrary_httpMethod: GET -vcs123_vaultCredentialStore_vl123_vaultLibrary_credentialType: magic +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_publicId: vl123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_projectId: proj123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_vaultPath: /a/path +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_httpMethod: GET +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_credentialType: magic connection: conn_1.connection diff --git a/internal/bsr/testdata/TestBsr/session_multiplexed/opened/session.meta b/internal/bsr/testdata/TestBsr/session_multiplexed/opened/session.meta index 95be69988..ca2f4b0c5 100644 --- a/internal/bsr/testdata/TestBsr/session_multiplexed/opened/session.meta +++ b/internal/bsr/testdata/TestBsr/session_multiplexed/opened/session.meta @@ -19,17 +19,17 @@ staticHostCatalog_projectId: proj123 staticHost_address: 127.0.0.1 scs123_staticCredentialStore_publicId: scs123 scs123_staticCredentialStore_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_publicId: scjson123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_objectHmac: hmac +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_publicId: scjson123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_projectId: proj123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_objectHmac: hmac vcs123_vaultCredentialStore_publicId: vcs123 vcs123_vaultCredentialStore_projectId: proj123 vcs123_vaultCredentialStore_vaultAddress: an/address vcs123_vaultCredentialStore_namespace: name vcs123_vaultCredentialStore_tlsServerName: imaserver vcs123_vaultCredentialStore_tlsSkipVerify: false -vcs123_vaultCredentialStore_vl123_vaultLibrary_publicId: vl123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_projectId: proj123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_vaultPath: /a/path -vcs123_vaultCredentialStore_vl123_vaultLibrary_httpMethod: GET -vcs123_vaultCredentialStore_vl123_vaultLibrary_credentialType: magic +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_publicId: vl123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_projectId: proj123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_vaultPath: /a/path +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_httpMethod: GET +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_credentialType: magic diff --git a/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/SHA256SUM b/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/SHA256SUM index c23501475..0dd161724 100644 --- a/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/SHA256SUM +++ b/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/SHA256SUM @@ -3,5 +3,5 @@ .* wrappedPrivKey .* pubKeyBsrSignature.sign .* pubKeySelfSignature.sign -579ecb88b936d12dd5f8ba9091151372e9dcd8cf7c696dc650c26fe968eaf852 session.meta +1aac36a2c36e4de69c5bf3522ada1c7f080ac807f2182c013ec8ddf60bedae10 session.meta e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 session.summary diff --git a/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/session.meta b/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/session.meta index 2c94027a2..cb1e86b02 100644 --- a/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/session.meta +++ b/internal/bsr/testdata/TestBsr/session_not_multiplexed/closed/session.meta @@ -19,18 +19,18 @@ staticHostCatalog_projectId: proj123 staticHost_address: 127.0.0.1 scs123_staticCredentialStore_publicId: scs123 scs123_staticCredentialStore_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_publicId: scjson123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_objectHmac: hmac +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_publicId: scjson123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_projectId: proj123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_objectHmac: hmac vcs123_vaultCredentialStore_publicId: vcs123 vcs123_vaultCredentialStore_projectId: proj123 vcs123_vaultCredentialStore_vaultAddress: an/address vcs123_vaultCredentialStore_namespace: name vcs123_vaultCredentialStore_tlsServerName: imaserver vcs123_vaultCredentialStore_tlsSkipVerify: false -vcs123_vaultCredentialStore_vl123_vaultLibrary_publicId: vl123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_projectId: proj123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_vaultPath: /a/path -vcs123_vaultCredentialStore_vl123_vaultLibrary_httpMethod: GET -vcs123_vaultCredentialStore_vl123_vaultLibrary_credentialType: magic +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_publicId: vl123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_projectId: proj123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_vaultPath: /a/path +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_httpMethod: GET +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_credentialType: magic connection: conn_1.connection diff --git a/internal/bsr/testdata/TestBsr/session_not_multiplexed/opened/session.meta b/internal/bsr/testdata/TestBsr/session_not_multiplexed/opened/session.meta index 95be69988..ca2f4b0c5 100644 --- a/internal/bsr/testdata/TestBsr/session_not_multiplexed/opened/session.meta +++ b/internal/bsr/testdata/TestBsr/session_not_multiplexed/opened/session.meta @@ -19,17 +19,17 @@ staticHostCatalog_projectId: proj123 staticHost_address: 127.0.0.1 scs123_staticCredentialStore_publicId: scs123 scs123_staticCredentialStore_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_publicId: scjson123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_projectId: proj123 -scs123_staticCredentialStore_scjson123_staticJsonCredential_objectHmac: hmac +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_publicId: scjson123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_projectId: proj123 +scs123_staticCredentialStore_credential_scjson123_staticJsonCredential_objectHmac: hmac vcs123_vaultCredentialStore_publicId: vcs123 vcs123_vaultCredentialStore_projectId: proj123 vcs123_vaultCredentialStore_vaultAddress: an/address vcs123_vaultCredentialStore_namespace: name vcs123_vaultCredentialStore_tlsServerName: imaserver vcs123_vaultCredentialStore_tlsSkipVerify: false -vcs123_vaultCredentialStore_vl123_vaultLibrary_publicId: vl123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_projectId: proj123 -vcs123_vaultCredentialStore_vl123_vaultLibrary_vaultPath: /a/path -vcs123_vaultCredentialStore_vl123_vaultLibrary_httpMethod: GET -vcs123_vaultCredentialStore_vl123_vaultLibrary_credentialType: magic +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_publicId: vl123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_projectId: proj123 +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_vaultPath: /a/path +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_httpMethod: GET +vcs123_vaultCredentialStore_credential_vl123_vaultLibrary_credentialType: magic