package org.ovirt.engine.core.config.entity.helper; import java.util.StringTokenizer; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.config.EngineConfigCLIParser; import org.ovirt.engine.core.config.entity.ConfigKey; /** * This value helper is for values in the form of key:password. The helper can strip down and encrypt or decrypt the * password only. The actual value may be a comma delimited list of key-val pair. e.g: example.com:123456, * ovirt.org:0o9i8u, A.B.C:clearTextPass */ public class CompositePasswordValueHelper implements ValueHelper { private final PasswordValueHelper pwdValueHelper = new PasswordValueHelper(); private static enum ReformatType { ENCRYPT, DECRYPT } @Override public String getValue(String value) throws Exception { return reformatKeyVal(value, ReformatType.DECRYPT); } @Override public String setValue(String value) throws Exception { value = pwdValueHelper.extractPasswordValue(value); // Happens only when deleting password value if (StringUtils.isBlank(value)) { return StringUtils.EMPTY; } return reformatKeyVal(value, ReformatType.ENCRYPT); } private String reformatKeyVal(String value, ReformatType type) throws Exception { StringBuilder sb = new StringBuilder(); StringTokenizer tokenizer = new StringTokenizer(value, ","); // extract key:val pair format and encrypt/decrypt the val section while (tokenizer.hasMoreElements()) { String token = (String) tokenizer.nextElement(); String[] pair = token.split(":", -1); sb.append(pair[0]).append(":"); // append key // now append the value if (type == ReformatType.ENCRYPT) { sb.append(pwdValueHelper.encrypt(pair[1])); } else { try { sb.append(pwdValueHelper.decrypt(pair[1])); } catch (Exception e) { // password wasn't encrypted in first place - ignore and append as is. sb.append(pair[1]); } } if (tokenizer.hasMoreElements()) { sb.append(","); } } return sb.toString(); } @Override public ValidationResult validate(ConfigKey key, String value) { StringTokenizer tokenizer = new StringTokenizer(value, ","); while (tokenizer.hasMoreElements()) { String token = (String) tokenizer.nextElement(); String[] pair = token.split(":", -1); String password = pair[1]; ValidationResult validationResult = pwdValueHelper.validate(null, password); if (!validationResult.isOk()) { return validationResult; } } return new ValidationResult(true); } @Override public void setParser(EngineConfigCLIParser parser) { this.pwdValueHelper.setParser(parser); } @Override public String getHelpNote(ConfigKey key) { return pwdValueHelper.getHelpNote(key); } }