Decrypt zone, cluster, storage details for configuration values (#10237)

Co-authored-by: dahn <daan.hoogland@gmail.com>
Co-authored-by: Bryan Lima <42067040+BryanMLima@users.noreply.github.com>
This commit is contained in:
Harikrishna 2025-02-03 18:00:57 +05:30 committed by GitHub
parent 0d5047b8b7
commit 60af31c9c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 97 additions and 69 deletions

View File

@ -19,8 +19,9 @@ package com.cloud.dc;
import java.util.Map; import java.util.Map;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
public interface ClusterDetailsDao extends GenericDao<ClusterDetailsVO, Long> { public interface ClusterDetailsDao extends GenericDao<ClusterDetailsVO, Long>, ResourceDetailsDao<ClusterDetailsVO> {
Map<String, String> findDetails(long clusterId); Map<String, String> findDetails(long clusterId);
void persist(long clusterId, Map<String, String> details); void persist(long clusterId, Map<String, String> details);

View File

@ -26,12 +26,13 @@ import org.apache.cloudstack.framework.config.ConfigKey.Scope;
import org.apache.cloudstack.framework.config.ScopedConfigStorage; import org.apache.cloudstack.framework.config.ScopedConfigStorage;
import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionLegacy;
import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
public class ClusterDetailsDaoImpl extends ResourceDetailsDaoBase<ClusterDetailsVO> implements ClusterDetailsDao, ScopedConfigStorage {
public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long> implements ClusterDetailsDao, ScopedConfigStorage {
protected final SearchBuilder<ClusterDetailsVO> ClusterSearch; protected final SearchBuilder<ClusterDetailsVO> ClusterSearch;
protected final SearchBuilder<ClusterDetailsVO> DetailSearch; protected final SearchBuilder<ClusterDetailsVO> DetailSearch;
@ -42,11 +43,11 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
protected ClusterDetailsDaoImpl() { protected ClusterDetailsDaoImpl() {
ClusterSearch = createSearchBuilder(); ClusterSearch = createSearchBuilder();
ClusterSearch.and("clusterId", ClusterSearch.entity().getClusterId(), SearchCriteria.Op.EQ); ClusterSearch.and("clusterId", ClusterSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
ClusterSearch.done(); ClusterSearch.done();
DetailSearch = createSearchBuilder(); DetailSearch = createSearchBuilder();
DetailSearch.and("clusterId", DetailSearch.entity().getClusterId(), SearchCriteria.Op.EQ); DetailSearch.and("clusterId", DetailSearch.entity().getResourceId(), SearchCriteria.Op.EQ);
DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ); DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
DetailSearch.done(); DetailSearch.done();
} }
@ -66,6 +67,11 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
return detail; return detail;
} }
@Override
public void addDetail(long resourceId, String key, String value, boolean display) {
super.addDetail(new ClusterDetailsVO(resourceId, key, value));
}
@Override @Override
public Map<String, String> findDetails(long clusterId) { public Map<String, String> findDetails(long clusterId) {
SearchCriteria<ClusterDetailsVO> sc = ClusterSearch.create(); SearchCriteria<ClusterDetailsVO> sc = ClusterSearch.create();
@ -138,7 +144,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
@Override @Override
public String getConfigValue(long id, ConfigKey<?> key) { public String getConfigValue(long id, ConfigKey<?> key) {
ClusterDetailsVO vo = findDetail(id, key.key()); ClusterDetailsVO vo = findDetail(id, key.key());
return vo == null ? null : vo.getValue(); return vo == null ? null : getActualValue(vo);
} }
@Override @Override

View File

@ -23,11 +23,11 @@ import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.ResourceDetail;
@Entity @Entity
@Table(name = "cluster_details") @Table(name = "cluster_details")
public class ClusterDetailsVO implements InternalIdentity { public class ClusterDetailsVO implements ResourceDetail {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@ -35,7 +35,7 @@ public class ClusterDetailsVO implements InternalIdentity {
private long id; private long id;
@Column(name = "cluster_id") @Column(name = "cluster_id")
private long clusterId; private long resourceId;
@Column(name = "name") @Column(name = "name")
private String name; private String name;
@ -47,13 +47,14 @@ public class ClusterDetailsVO implements InternalIdentity {
} }
public ClusterDetailsVO(long clusterId, String name, String value) { public ClusterDetailsVO(long clusterId, String name, String value) {
this.clusterId = clusterId; this.resourceId = clusterId;
this.name = name; this.name = name;
this.value = value; this.value = value;
} }
public long getClusterId() { @Override
return clusterId; public long getResourceId() {
return resourceId;
} }
public String getName() { public String getName() {
@ -64,6 +65,11 @@ public class ClusterDetailsVO implements InternalIdentity {
return value; return value;
} }
@Override
public boolean isDisplay() {
return true;
}
public void setValue(String value) { public void setValue(String value) {
this.value = value; this.value = value;
} }

View File

@ -16,7 +16,6 @@
// under the License. // under the License.
package com.cloud.dc.dao; package com.cloud.dc.dao;
import org.apache.cloudstack.api.ResourceDetail;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ConfigKey.Scope;
import org.apache.cloudstack.framework.config.ScopedConfigStorage; import org.apache.cloudstack.framework.config.ScopedConfigStorage;
@ -45,8 +44,8 @@ public class DataCenterDetailsDaoImpl extends ResourceDetailsDaoBase<DataCenterD
@Override @Override
public String getConfigValue(long id, ConfigKey<?> key) { public String getConfigValue(long id, ConfigKey<?> key) {
ResourceDetail vo = findDetail(id, key.key()); DataCenterDetailVO vo = findDetail(id, key.key());
return vo == null ? null : vo.getValue(); return vo == null ? null : getActualValue(vo);
} }
@Override @Override

View File

@ -23,18 +23,18 @@ import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.ResourceDetail;
@Entity @Entity
@Table(name = "domain_details") @Table(name = "domain_details")
public class DomainDetailVO implements InternalIdentity { public class DomainDetailVO implements ResourceDetail {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id") @Column(name = "id")
private long id; private long id;
@Column(name = "domain_id") @Column(name = "domain_id")
private long domainId; private long resourceId;
@Column(name = "name") @Column(name = "name")
private String name; private String name;
@ -46,13 +46,14 @@ public class DomainDetailVO implements InternalIdentity {
} }
public DomainDetailVO(long domainId, String name, String value) { public DomainDetailVO(long domainId, String name, String value) {
this.domainId = domainId; this.resourceId = domainId;
this.name = name; this.name = name;
this.value = value; this.value = value;
} }
public long getDomainId() { @Override
return domainId; public long getResourceId() {
return resourceId;
} }
public String getName() { public String getName() {
@ -63,6 +64,11 @@ public class DomainDetailVO implements InternalIdentity {
return value; return value;
} }
@Override
public boolean isDisplay() {
return true;
}
public void setValue(String value) { public void setValue(String value) {
this.value = value; this.value = value;
} }

View File

@ -20,8 +20,9 @@ import java.util.Map;
import com.cloud.domain.DomainDetailVO; import com.cloud.domain.DomainDetailVO;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
public interface DomainDetailsDao extends GenericDao<DomainDetailVO, Long> { public interface DomainDetailsDao extends GenericDao<DomainDetailVO, Long>, ResourceDetailsDao<DomainDetailVO> {
Map<String, String> findDetails(long domainId); Map<String, String> findDetails(long domainId);
void persist(long domainId, Map<String, String> details); void persist(long domainId, Map<String, String> details);
@ -31,6 +32,4 @@ public interface DomainDetailsDao extends GenericDao<DomainDetailVO, Long> {
void deleteDetails(long domainId); void deleteDetails(long domainId);
void update(long domainId, Map<String, String> details); void update(long domainId, Map<String, String> details);
String getActualValue(DomainDetailVO domainDetailVO);
} }

View File

@ -24,8 +24,6 @@ import javax.inject.Inject;
import com.cloud.domain.DomainDetailVO; import com.cloud.domain.DomainDetailVO;
import com.cloud.domain.DomainVO; import com.cloud.domain.DomainVO;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
@ -35,9 +33,9 @@ import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ConfigKey.Scope;
import org.apache.cloudstack.framework.config.ScopedConfigStorage; import org.apache.cloudstack.framework.config.ScopedConfigStorage;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO; import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
public class DomainDetailsDaoImpl extends GenericDaoBase<DomainDetailVO, Long> implements DomainDetailsDao, ScopedConfigStorage { public class DomainDetailsDaoImpl extends ResourceDetailsDaoBase<DomainDetailVO> implements DomainDetailsDao, ScopedConfigStorage {
protected final SearchBuilder<DomainDetailVO> domainSearch; protected final SearchBuilder<DomainDetailVO> domainSearch;
@Inject @Inject
@ -47,14 +45,14 @@ public class DomainDetailsDaoImpl extends GenericDaoBase<DomainDetailVO, Long> i
protected DomainDetailsDaoImpl() { protected DomainDetailsDaoImpl() {
domainSearch = createSearchBuilder(); domainSearch = createSearchBuilder();
domainSearch.and("domainId", domainSearch.entity().getDomainId(), Op.EQ); domainSearch.and("domainId", domainSearch.entity().getResourceId(), Op.EQ);
domainSearch.done(); domainSearch.done();
} }
@Override @Override
public Map<String, String> findDetails(long domainId) { public Map<String, String> findDetails(long domainId) {
QueryBuilder<DomainDetailVO> sc = QueryBuilder.create(DomainDetailVO.class); QueryBuilder<DomainDetailVO> sc = QueryBuilder.create(DomainDetailVO.class);
sc.and(sc.entity().getDomainId(), Op.EQ, domainId); sc.and(sc.entity().getResourceId(), Op.EQ, domainId);
List<DomainDetailVO> results = sc.list(); List<DomainDetailVO> results = sc.list();
Map<String, String> details = new HashMap<String, String>(results.size()); Map<String, String> details = new HashMap<String, String>(results.size());
for (DomainDetailVO r : results) { for (DomainDetailVO r : results) {
@ -80,11 +78,16 @@ public class DomainDetailsDaoImpl extends GenericDaoBase<DomainDetailVO, Long> i
@Override @Override
public DomainDetailVO findDetail(long domainId, String name) { public DomainDetailVO findDetail(long domainId, String name) {
QueryBuilder<DomainDetailVO> sc = QueryBuilder.create(DomainDetailVO.class); QueryBuilder<DomainDetailVO> sc = QueryBuilder.create(DomainDetailVO.class);
sc.and(sc.entity().getDomainId(), Op.EQ, domainId); sc.and(sc.entity().getResourceId(), Op.EQ, domainId);
sc.and(sc.entity().getName(), Op.EQ, name); sc.and(sc.entity().getName(), Op.EQ, name);
return sc.find(); return sc.find();
} }
@Override
public void addDetail(long resourceId, String key, String value, boolean display) {
super.addDetail(new DomainDetailVO(resourceId, key, value));
}
@Override @Override
public void deleteDetails(long domainId) { public void deleteDetails(long domainId) {
SearchCriteria<DomainDetailVO> sc = domainSearch.create(); SearchCriteria<DomainDetailVO> sc = domainSearch.create();
@ -129,13 +132,4 @@ public class DomainDetailsDaoImpl extends GenericDaoBase<DomainDetailVO, Long> i
} }
return vo == null ? null : getActualValue(vo); return vo == null ? null : getActualValue(vo);
} }
@Override
public String getActualValue(DomainDetailVO domainDetailVO) {
ConfigurationVO configurationVO = _configDao.findByName(domainDetailVO.getName());
if (configurationVO != null && configurationVO.isEncrypted()) {
return DBEncryptionUtil.decrypt(domainDetailVO.getValue());
}
return domainDetailVO.getValue();
}
} }

View File

@ -45,7 +45,7 @@ public class StoragePoolDetailsDaoImpl extends ResourceDetailsDaoBase<StoragePoo
@Override @Override
public String getConfigValue(long id, ConfigKey<?> key) { public String getConfigValue(long id, ConfigKey<?> key) {
StoragePoolDetailVO vo = findDetail(id, key.key()); StoragePoolDetailVO vo = findDetail(id, key.key());
return vo == null ? null : vo.getValue(); return vo == null ? null : getActualValue(vo);
} }
@Override @Override

View File

@ -23,18 +23,18 @@ import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.ResourceDetail;
@Entity @Entity
@Table(name = "account_details") @Table(name = "account_details")
public class AccountDetailVO implements InternalIdentity { public class AccountDetailVO implements ResourceDetail {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id") @Column(name = "id")
private long id; private long id;
@Column(name = "account_id") @Column(name = "account_id")
private long accountId; private long resourceId;
@Column(name = "name") @Column(name = "name")
private String name; private String name;
@ -46,13 +46,14 @@ public class AccountDetailVO implements InternalIdentity {
} }
public AccountDetailVO(long accountId, String name, String value) { public AccountDetailVO(long accountId, String name, String value) {
this.accountId = accountId; this.resourceId = accountId;
this.name = name; this.name = name;
this.value = value; this.value = value;
} }
public long getAccountId() { @Override
return accountId; public long getResourceId() {
return resourceId;
} }
public String getName() { public String getName() {
@ -63,6 +64,11 @@ public class AccountDetailVO implements InternalIdentity {
return value; return value;
} }
@Override
public boolean isDisplay() {
return true;
}
public void setValue(String value) { public void setValue(String value) {
this.value = value; this.value = value;
} }

View File

@ -19,8 +19,9 @@ package com.cloud.user;
import java.util.Map; import java.util.Map;
import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.GenericDao;
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
public interface AccountDetailsDao extends GenericDao<AccountDetailVO, Long> { public interface AccountDetailsDao extends GenericDao<AccountDetailVO, Long>, ResourceDetailsDao<AccountDetailVO> {
Map<String, String> findDetails(long accountId); Map<String, String> findDetails(long accountId);
void persist(long accountId, Map<String, String> details); void persist(long accountId, Map<String, String> details);
@ -34,6 +35,4 @@ public interface AccountDetailsDao extends GenericDao<AccountDetailVO, Long> {
* they will get created * they will get created
*/ */
void update(long accountId, Map<String, String> details); void update(long accountId, Map<String, String> details);
String getActualValue(AccountDetailVO accountDetailVO);
} }

View File

@ -23,7 +23,6 @@ import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.utils.crypt.DBEncryptionUtil;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ConfigKey.Scope;
import org.apache.cloudstack.framework.config.ScopedConfigStorage; import org.apache.cloudstack.framework.config.ScopedConfigStorage;
@ -34,16 +33,15 @@ import com.cloud.domain.dao.DomainDetailsDao;
import com.cloud.domain.dao.DomainDao; import com.cloud.domain.dao.DomainDao;
import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.AccountDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionLegacy;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO; import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long> implements AccountDetailsDao, ScopedConfigStorage { public class AccountDetailsDaoImpl extends ResourceDetailsDaoBase<AccountDetailVO> implements AccountDetailsDao, ScopedConfigStorage {
protected final SearchBuilder<AccountDetailVO> accountSearch; protected final SearchBuilder<AccountDetailVO> accountSearch;
@Inject @Inject
@ -57,14 +55,14 @@ public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long>
protected AccountDetailsDaoImpl() { protected AccountDetailsDaoImpl() {
accountSearch = createSearchBuilder(); accountSearch = createSearchBuilder();
accountSearch.and("accountId", accountSearch.entity().getAccountId(), Op.EQ); accountSearch.and("accountId", accountSearch.entity().getResourceId(), Op.EQ);
accountSearch.done(); accountSearch.done();
} }
@Override @Override
public Map<String, String> findDetails(long accountId) { public Map<String, String> findDetails(long accountId) {
QueryBuilder<AccountDetailVO> sc = QueryBuilder.create(AccountDetailVO.class); QueryBuilder<AccountDetailVO> sc = QueryBuilder.create(AccountDetailVO.class);
sc.and(sc.entity().getAccountId(), Op.EQ, accountId); sc.and(sc.entity().getResourceId(), Op.EQ, accountId);
List<AccountDetailVO> results = sc.list(); List<AccountDetailVO> results = sc.list();
Map<String, String> details = new HashMap<String, String>(results.size()); Map<String, String> details = new HashMap<String, String>(results.size());
for (AccountDetailVO r : results) { for (AccountDetailVO r : results) {
@ -90,11 +88,16 @@ public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long>
@Override @Override
public AccountDetailVO findDetail(long accountId, String name) { public AccountDetailVO findDetail(long accountId, String name) {
QueryBuilder<AccountDetailVO> sc = QueryBuilder.create(AccountDetailVO.class); QueryBuilder<AccountDetailVO> sc = QueryBuilder.create(AccountDetailVO.class);
sc.and(sc.entity().getAccountId(), Op.EQ, accountId); sc.and(sc.entity().getResourceId(), Op.EQ, accountId);
sc.and(sc.entity().getName(), Op.EQ, name); sc.and(sc.entity().getName(), Op.EQ, name);
return sc.find(); return sc.find();
} }
@Override
public void addDetail(long resourceId, String key, String value, boolean display) {
super.addDetail(new AccountDetailVO(resourceId, key, value));
}
@Override @Override
public void deleteDetails(long accountId) { public void deleteDetails(long accountId) {
SearchCriteria<AccountDetailVO> sc = accountSearch.create(); SearchCriteria<AccountDetailVO> sc = accountSearch.create();
@ -154,13 +157,4 @@ public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long>
} }
return value; return value;
} }
@Override
public String getActualValue(AccountDetailVO accountDetailVO) {
ConfigurationVO configurationVO = _configDao.findByName(accountDetailVO.getName());
if (configurationVO != null && configurationVO.isEncrypted()) {
return DBEncryptionUtil.decrypt(accountDetailVO.getValue());
}
return accountDetailVO.getValue();
}
} }

View File

@ -97,4 +97,6 @@ public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao
public void addDetail(long resourceId, String key, String value, boolean display); public void addDetail(long resourceId, String key, String value, boolean display);
public List<Long> findResourceIdsByNameAndValueIn(String name, Object[] values); public List<Long> findResourceIdsByNameAndValueIn(String name, Object[] values);
String getActualValue(ResourceDetail resourceDetail);
} }

View File

@ -20,6 +20,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.cloud.utils.crypt.DBEncryptionUtil;
import org.apache.cloudstack.api.ResourceDetail; import org.apache.cloudstack.api.ResourceDetail;
import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericDaoBase;
@ -28,8 +29,16 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.SearchCriteria.Op;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
import javax.inject.Inject;
public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long> implements ResourceDetailsDao<R> { public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends GenericDaoBase<R, Long> implements ResourceDetailsDao<R> {
@Inject
private ConfigurationDao configDao;
private SearchBuilder<R> AllFieldsSearch; private SearchBuilder<R> AllFieldsSearch;
public ResourceDetailsDaoBase() { public ResourceDetailsDaoBase() {
@ -201,4 +210,13 @@ public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends G
return customSearch(sc, null); return customSearch(sc, null);
} }
@Override
public String getActualValue(ResourceDetail resourceDetail) {
ConfigurationVO configurationVO = configDao.findByName(resourceDetail.getName());
if (configurationVO != null && configurationVO.isEncrypted()) {
return DBEncryptionUtil.decrypt(resourceDetail.getValue());
}
return resourceDetail.getValue();
}
} }

View File

@ -37,7 +37,6 @@ import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
@Component @Component
public class ImageStoreDetailsDaoImpl extends ResourceDetailsDaoBase<ImageStoreDetailVO> implements ImageStoreDetailsDao, ScopedConfigStorage { public class ImageStoreDetailsDaoImpl extends ResourceDetailsDaoBase<ImageStoreDetailVO> implements ImageStoreDetailsDao, ScopedConfigStorage {
protected final SearchBuilder<ImageStoreDetailVO> storeSearch; protected final SearchBuilder<ImageStoreDetailVO> storeSearch;
public ImageStoreDetailsDaoImpl() { public ImageStoreDetailsDaoImpl() {
@ -108,12 +107,11 @@ public class ImageStoreDetailsDaoImpl extends ResourceDetailsDaoBase<ImageStoreD
@Override @Override
public String getConfigValue(long id, ConfigKey<?> key) { public String getConfigValue(long id, ConfigKey<?> key) {
ImageStoreDetailVO vo = findDetail(id, key.key()); ImageStoreDetailVO vo = findDetail(id, key.key());
return vo == null ? null : vo.getValue(); return vo == null ? null : getActualValue(vo);
} }
@Override @Override
public void addDetail(long resourceId, String key, String value, boolean display) { public void addDetail(long resourceId, String key, String value, boolean display) {
super.addDetail(new ImageStoreDetailVO(resourceId, key, value, display)); super.addDetail(new ImageStoreDetailVO(resourceId, key, value, display));
} }
} }