blob: 67ff56f00a9f4119d6a082b62a7d41b581a69ca0 [file] [log] [blame]
<template>
<div>
<div class="w-100">
<h2>Secrets</h2>
</div>
<b-container class="w-100 mt-5">
<div v-if="this.secretsLoading" class="d-flex justify-content-center mb-3">
<b-spinner variant="primary" label="Text Centered"></b-spinner>
</div>
<b-table small striped hover responsive :items="secItems" :fields="fields" selectable
select-mode="single" @row-selected="onRowSelected" caption-top>
<template v-slot:head(owner_id)>Owner</template>
</b-table>
<div class="w-100">
<b-button variant="outline-primary" v-on:click="addSec">Add Secret</b-button>
</div>
</b-container>
<b-modal ref="addSecmodel" id="add-secret-modal" scrollable title="Add Secret">
<div>
<div class="p-2">
<label class="form-input-label" for="form-input-secret-type">Type</label>
<b-form-select id="form-input-secret-type" size="sm" v-model="defaultMemType">
<option v-for="(selectOption, indexOpt) in secretTypes"
:key="indexOpt"
:value="selectOption"
>
{{ selectOption }}
</option>
</b-form-select>
</div>
<div class="p-2">
<label class="form-input-label" for="form-input-secret-description">Description</label>
<b-form-input id="form-input-secret-description" size="sm"
v-model="selectedDescription"></b-form-input>
</div>
<div v-if="defaultMemType==='Password'" class="p-2">
<label class="form-input-label" for="form-input-secret-password">Password</label>
<Password id="form-input-secret-password" size="sm" v-model="selectedPassword">
</Password>
</div>
</div>
<template slot="modal-footer">
<b-button size="sm" class="mr-2" @click="$bvModal.hide('add-secret-modal')">
Cancel
</b-button>
<b-button size="sm" variant="primary" v-on:click="addSecOKButtonPressed"
:disabled="defaultMemType === 'Password' && !selectedPassword"
@click="$bvModal.hide('add-secret-modal')">
Add Secret
</b-button>
</template>
</b-modal>
<b-modal ref="updateSecmodel" id="view-secret-modal" scrollable title="View Secret">
<div>
<div class="secformItem">
<label class="form-input-label" for="form-input-secret-token">Token</label>
<b-form-input id="form-input-secret-token" size="sm" v-model="selectedExId"
disabled></b-form-input>
</div>
<div class="secFormItem">
<label class="form-input-label" for="form-input-secret-type">Type</label>
<b-form-input id="form-input-secret-type" size="sm" v-model="selectedExType"
disabled></b-form-input>
</div>
<div class="secformItem">
<label class="form-input-label" for="form-input-secret-description">Description</label>
<b-form-input id="form-input-secret-description" size="sm" v-model="selectedExDescription"
disabled></b-form-input>
</div>
<div class="secformItem">
<label class="form-input-label" for="form-input-secret-owner">Owner</label>
<b-form-input id="form-input-secret-owner" size="sm" v-model="selectedExOwnerId"
disabled></b-form-input>
</div>
<div v-if="selectedExType ==='PASSWORD'" class="secformItem">
<label class="form-input-label" for="form-input-secret-password">Password</label>
<Password id="form-input-secret-password" size="sm" v-model="selectedExPassword" disabled>
</Password>
</div>
<div v-if="selectedExType ==='SSH'" class="secformItem">
<label class="form-input-label" for="form-input-secret-public-key">Public Key</label>
<b-textarea id="form-input-secret-public-key" size="sm" v-model="selectedExPubKey"
disabled></b-textarea>
</div>
<div v-if="selectedExType ==='SSH'" class="secformItem">
<label class="form-input-label" for="form-input-secret-private-key">Private Key</label>
<b-textarea id="form-input-secret-private-key" size="sm" v-model="selectedExPrivKey"
disabled></b-textarea>
</div>
</div>
<template slot="modal-footer">
<b-button size="sm" class="mr-2" @click="$bvModal.hide('view-secret-modal')">
Cancel
</b-button>
<b-button size="sm" variant="danger" v-on:click="secDeleteButtonPressed"
@click="$bvModal.hide('view-secret-modal')">
Delete
</b-button>
</template>
</b-modal>
</div>
</template>
<script>
import config from "@/config";
import Password from "../Password";
export default {
name: "Secrets",
components: {Password},
data: function () {
return {
fields: ['token', 'description', 'type', 'owner_id'],
secItems: [],
selectedSecret: null,
secretTypes: ['SSH', 'Password'],
defaultMemType: 'SSH',
selectedDescription: null,
selectedPassword: null,
selectedExType: null,
selectedExId: null,
selectedExDescription: null,
selectedExPassword: null,
selectedExPubKey: null,
selectedExPrivKey: null,
selectedExOwnerId: null,
currentUserName: null,
secretsLoading: false,
passwordEmptyError: false
}
},
methods: {
async onRowSelected(items) {
if (items != null && items.length > 0) {
this.selectedSecret = items
this.selectedExDescription = this.selectedSecret[0].description
this.selectedExType = this.selectedSecret[0].type
this.selectedExId = this.selectedSecret[0].token
this.selectedExOwnerId = this.selectedSecret[0].owner_id
if (this.selectedExType === "SSH") {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
token: this.selectedExId
}
let response = await this.$store.dispatch('secret/getSSHCredential', data)
this.selectedExPubKey = response.public_key
this.selectedExPrivKey = response.private_key
} else {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
token: this.selectedExId
}
let response = await this.$store.dispatch('secret/getPasswordCredential', data)
this.selectedExPassword = response.password
}
this.$refs.updateSecmodel.show()
}
},
addSec: function () {
this.selectedDescription = null
this.selectedPassword = null
this.defaultMemType = 'SSH'
this.$refs.addSecmodel.show()
},
async addSecOKButtonPressed() {
this.secretsLoading = true
if (this.defaultMemType === 'SSH') {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
metadata: {
client_id: this.custosId,
description: this.selectedDescription,
owner_id: this.currentUserName
}
}
}
let response = await this.$store.dispatch('secret/addSSHCredential', data)
let dataEn = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
entity: {
id: response.token,
name: 'SSH token',
description: 'SSH credential created for ' + this.selectedDescription,
type: 'SECRET',
owner_id: this.currentUserName
}
}
}
await this.$store.dispatch('sharing/createEntity', dataEn)
} else {
if (this.selectedPassword == null || this.selectedPassword == '') {
this.passwordEmptyError = true
} else {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
metadata: {
client_id: this.custosId,
description: this.selectedDescription,
owner_id: this.currentUserName
},
password: this.selectedPassword
}
}
let response = await this.$store.dispatch('secret/addPasswordCredential', data)
let dataEN = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
entity: {
id: response.token,
name: 'Password token',
description: 'Password credential created for ' + this.selectedDescription,
type: 'SECRET',
owner_id: this.currentUserName
}
}
}
await this.$store.dispatch('sharing/createEntity', dataEN)
}
this.secItems = await this.getAllCredentials()
this.secretsLoading = false
}
},
async secDeleteButtonPressed() {
this.secretsLoading = true
if (this.defaultMemType === 'SSH') {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
token: this.selectedExId
}
let response = await this.$store.dispatch('secret/deleteSSHCredential', data)
if (response) {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
entity: {
id: this.selectedExId,
owner_id: this.currentUserName
}
}
}
await this.$store.dispatch('sharing/deleteEntity', data)
}
} else {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
token: this.selectedExId
}
let response = await this.$store.dispatch('secret/deletePassswordCredential', data)
if (response) {
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
entity: {
id: this.selectedExId,
owner_id: this.currentUserName
}
}
}
await this.$store.dispatch('sharing/deleteEntity', data)
}
}
this.secItems = await this.getAllCredentials()
this.secretsLoading = false
this.secretsLoading = false
},
async getAllCredentials() {
let searchEntitiesData = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
owner_id: this.currentUserName,
search_criteria: [
{
search_field: "ENTITY_TYPE_ID",
value: 'SECRET',
condition: "EQUAL"
}
]
}
}
let response = await this.$store.dispatch('sharing/getEntities', searchEntitiesData)
let accessible_token = []
if (response != null && response.length > 0) {
response.forEach(a => {
accessible_token.push(a.id)
})
}
let data = {
client_id: this.custosId,
client_sec: this.custosSec,
accessible_tokens: accessible_token
}
return await this.$store.dispatch('secret/getAllCredentials', data)
},
async goToWorkspace() {
await this.$router.push('/workspace')
},
},
async mounted() {
this.secretsLoading = true
this.custosId = config.value('clientId')
this.custosSec = config.value('clientSec')
this.currentUserName = await this.$store.dispatch('identity/getCurrentUserName')
this.secItems = await this.getAllCredentials()
this.secretsLoading = false
let permTypesData = {
client_id: this.custosId,
client_sec: this.custosSec
}
let entityTypes = await this.$store.dispatch('sharing/getEntityTypes', permTypesData)
let created = false
entityTypes.forEach(ent => {
if (ent.id === 'SECRET') {
created = true
}
})
if (!created) {
let dat = {
client_id: this.custosId,
client_sec: this.custosSec,
body: {
client_id: this.custosId,
entity_type: {
id: 'SECRET',
name: 'SECRET',
description: 'This is secret entity type of demo gateway'
}
}
}
this.entityTypes = await this.$store.dispatch('sharing/createEntityType', dat)
}
}
}
</script>
<style scoped>
h2 {
font-family: Avenir;
font-size: 20px;
font-weight: 600;
text-align: left;
color: #203a43;
}
</style>