mirror of https://github.com/rancher/dashboard.git
227 lines
5.5 KiB
Vue
227 lines
5.5 KiB
Vue
<script>
|
|
import { TYPES } from '@/models/secret';
|
|
import { base64Decode } from '@/utils/crypto';
|
|
import CreateEditView from '@/mixins/create-edit-view';
|
|
import ResourceTabs from '@/components/form/ResourceTabs';
|
|
import DetailText from '@/components/DetailText';
|
|
import Tab from '@/components/Tabbed/Tab';
|
|
|
|
const types = [
|
|
TYPES.OPAQUE,
|
|
TYPES.DOCKER_JSON,
|
|
TYPES.TLS,
|
|
TYPES.SSH,
|
|
TYPES.BASIC,
|
|
];
|
|
const registryAddresses = [
|
|
'DockerHub', 'Quay.io', 'Artifactory', 'Custom'
|
|
];
|
|
|
|
export default {
|
|
components: {
|
|
ResourceTabs,
|
|
DetailText,
|
|
Tab,
|
|
},
|
|
|
|
mixins: [CreateEditView],
|
|
|
|
props: {
|
|
value: {
|
|
type: Object,
|
|
default: () => {
|
|
return {};
|
|
}
|
|
}
|
|
},
|
|
|
|
data() {
|
|
let username;
|
|
let password;
|
|
let registryURL;
|
|
let registryProvider = 'Custom';
|
|
let key;
|
|
let crt;
|
|
|
|
if (this.value._type === TYPES.DOCKER_JSON) {
|
|
const json = base64Decode(this.value.data['.dockerconfigjson']);
|
|
|
|
const { auths } = JSON.parse(json);
|
|
|
|
registryURL = Object.keys(auths)[0];
|
|
|
|
if (registryURL === 'index.dockerhub.io/v1/') {
|
|
registryProvider = 'DockerHub';
|
|
} else if (registryURL === 'quay.io') {
|
|
registryProvider = 'Quay.io';
|
|
} else if (registryURL.includes('artifactory')) {
|
|
registryProvider = 'Artifactory';
|
|
}
|
|
|
|
username = auths[registryURL].username;
|
|
password = auths[registryURL].password;
|
|
}
|
|
|
|
const data = this.value?.data || {};
|
|
|
|
if (this.value._type === TYPES.TLS) {
|
|
// do not show existing key when editing
|
|
key = this.mode === 'edit' ? '' : base64Decode(data['tls.key']);
|
|
|
|
crt = base64Decode(data['tls.crt']);
|
|
}
|
|
|
|
if (this.value._type === TYPES.SERVICE_ACCT) {
|
|
key = base64Decode(data['token']);
|
|
crt = base64Decode(data['ca.crt']);
|
|
}
|
|
|
|
if ( this.value._type === TYPES.BASIC ) {
|
|
username = base64Decode(data.username || '');
|
|
password = base64Decode(data.password || '');
|
|
}
|
|
|
|
if ( this.value._type === TYPES.SSH ) {
|
|
username = base64Decode(data['ssh-publickey'] || '');
|
|
password = base64Decode(data['ssh-privatekey'] || '');
|
|
}
|
|
|
|
if (!this.value._type) {
|
|
this.$set(this.value, '_type', TYPES.OPAQUE);
|
|
}
|
|
|
|
return {
|
|
types,
|
|
registryAddresses,
|
|
registryProvider,
|
|
username,
|
|
password,
|
|
registryURL,
|
|
key,
|
|
crt,
|
|
relatedServices: [],
|
|
};
|
|
},
|
|
|
|
computed: {
|
|
isCertificate() {
|
|
return this.value._type === TYPES.TLS;
|
|
},
|
|
|
|
isSvcAcctToken() {
|
|
return this.value._type === TYPES.SERVICE_ACCT;
|
|
},
|
|
|
|
isRegistry() {
|
|
return this.value._type === TYPES.DOCKER_JSON;
|
|
},
|
|
|
|
isSsh() {
|
|
return this.value._type === TYPES.SSH;
|
|
},
|
|
|
|
isBasicAuth() {
|
|
return this.value._type === TYPES.BASIC;
|
|
},
|
|
|
|
parsedRows() {
|
|
const rows = [];
|
|
const { data = {} } = this.value;
|
|
|
|
Object.keys(data).forEach((key) => {
|
|
const value = base64Decode(data[key]);
|
|
|
|
rows.push({
|
|
key,
|
|
value
|
|
});
|
|
});
|
|
|
|
return rows;
|
|
},
|
|
|
|
dataLabel() {
|
|
switch (this.value._type) {
|
|
case TYPES.TLS:
|
|
return this.t('secret.certificate.certificate');
|
|
case TYPES.SSH:
|
|
return this.t('secret.ssh.keys');
|
|
case TYPES.BASIC:
|
|
return this.t('secret.authentication');
|
|
default:
|
|
return this.t('secret.data');
|
|
}
|
|
}
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<template>
|
|
<ResourceTabs v-model="value" :mode="mode">
|
|
<Tab name="data" :label="dataLabel">
|
|
<template v-if="isRegistry || isBasicAuth">
|
|
<div v-if="isRegistry" class="row">
|
|
<div class="col span-12">
|
|
<DetailText :value="registryUrl" label-key="secret.registry.domainName">
|
|
</detailtext>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col span-6">
|
|
<DetailText :value="username" label-key="secret.registry.username" />
|
|
</div>
|
|
<div class="col span-6">
|
|
<DetailText :value="password" label-key="secret.registry.password" :conceal="true" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<div v-else-if="isCertificate" class="row">
|
|
<div class="col span-6">
|
|
<DetailText :value="crt" label-key="secret.certificate.certificate" />
|
|
</div>
|
|
<div class="col span-6">
|
|
<DetailText :value="key" label-key="secret.certificate.privateKey" :conceal="true" />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-else-if="isSvcAcctToken" class="row">
|
|
<div class="col span-6">
|
|
<DetailText :value="crt" label-key="secret.serviceAcct.ca" />
|
|
</div>
|
|
<div class="col span-6">
|
|
<DetailText :value="key" label-key="secret.serviceAcct.token" :conceal="true" />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-else-if="isSsh" class="row">
|
|
<div class="col span-6">
|
|
<DetailText :value="username" label-key="secret.ssh.public" />
|
|
</div>
|
|
<div class="col span-6">
|
|
<DetailText :value="password" label-key="secret.ssh.private" :conceal="true" />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-else>
|
|
<div v-for="(row,idx) in parsedRows" :key="idx" class="entry">
|
|
<DetailText :value="row.value" :label="row.key" :conceal="true" />
|
|
</div>
|
|
<div v-if="!parsedRows.length">
|
|
<div v-t="'sortableTable.noRows'" class="m-20 text-center" />
|
|
</div>
|
|
</div>
|
|
</Tab>
|
|
</ResourceTabs>
|
|
</template>
|
|
|
|
<style lang="scss" scoped>
|
|
.entry {
|
|
margin-top: 10px;
|
|
|
|
&:first-of-type {
|
|
margin-top: 0;
|
|
}
|
|
}
|
|
</style>
|