/*
* Copyright (c) 2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.systemservices.utils;
import static com.emc.storageos.model.property.PropertyConstants.ENCRYPTEDSTRING;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import javax.ws.rs.core.Response;
import com.emc.storageos.coordinator.client.model.PropertyInfoExt;
import com.emc.storageos.systemservices.impl.resource.DummyEncryptionProvider;
import org.apache.commons.codec.binary.Base64;
import com.emc.storageos.db.server.util.StubCoordinatorClientImpl;
import com.emc.storageos.security.password.PasswordUtils;
import com.emc.storageos.systemservices.exceptions.CoordinatorClientException;
import com.emc.storageos.systemservices.exceptions.LocalRepositoryException;
import com.emc.storageos.systemservices.impl.resource.ConfigService;
import com.emc.storageos.systemservices.impl.upgrade.CoordinatorClientExt;
import com.emc.storageos.systemservices.impl.upgrade.LocalRepository;
import com.emc.storageos.systemservices.impl.upgrade.UpgradeManager;
import com.emc.storageos.coordinator.client.model.CoordinatorSerializable;
import com.emc.storageos.model.property.PropertyInfoUpdate;
import com.emc.storageos.model.property.PropertyMetadata;
import com.emc.storageos.systemservices.impl.util.LocalPasswordHandler;
import com.emc.storageos.util.DummyDbClient;
public class LocalPasswordHandlerTestBase {
private DummyConfigService _cfg = new DummyConfigService();
private DummyCoordinatorClientExt _coordinator = new DummyCoordinatorClientExt();
public PropertyInfoExt _passwordProps = new PropertyInfoExt();
public Map<String, PropertyMetadata> _propsMetadata = new TreeMap<String, PropertyMetadata>();
public DummyEncryptionProvider _encryptionProvider = new DummyEncryptionProvider();
public LocalPasswordHandler getPasswordHandler() {
PasswordUtils.setDefaultProperties(new Properties());
PasswordUtils utils = new PasswordUtils();
utils.setCoordinator(new StubCoordinatorClientImpl(URI.create("urn:coordinator")));
utils.setDbClient(new DummyDbClient());
LocalPasswordHandler ph = new LocalPasswordHandler();
ph.setConfigService(_cfg);
ph.setPasswordUtils(utils);
return ph;
}
public void setPropsMetaData() {
PropertyMetadata proxyuser_metadata = setPropMetaData("Encrypted password for the 'proxyuser' account",
"Encrypted (SHA-512) password for the local 'proxyuser' account.",
"encryptedstring", 255, "Security", true, true, false, true, false, "", true);
PropertyMetadata sysmonitor_metadata = setPropMetaData("Encrypted password for the 'sysmonitor' account",
"Encrypted password for the 'sysmonitor' account.",
"string", 255, "Security", true, true, false, true, false,
"$6$BIu9aQ6$wBnn9Tn.CUuuoi/JZe.oAOmUDIVCqHpXeem7ZHO5R7dPg2hul8tNCBzwumKrFw8A0qm.LH8YvMJUaN2AL1JVc0", true);
PropertyMetadata root_metadata = setPropMetaData("Encrypted password for the 'root' account",
"Encrypted (SHA-512) password for the local 'root' account.",
"string", 255, "Security", true, true, false, true, false,
"$6$eBIu9aQ6$wBnn9Tn.CUuuoi/JZe.oAOmUDIVCqHpXeem7ZHO5R7dPg2hul8tNCBzwumKrFw8A0qm.LH8YvMJUaN2AL1JVc0", false);
PropertyMetadata svcuser_metadata = setPropMetaData("Encrypted password for the 'svcuser' account",
"Encrypted (SHA-512) password for the local 'svcuser' account.",
"string", 255, "Security", true, true, false, true, false,
"$6$eBIu9aQ6$wBnn9Tn.CUuuoi/JZe.oAOmUDIVCqHpXeem7ZHO5R7dPg2hul8tNCBzwumKrFw8A0qm.LH8YvMJUaN2AL1JVc0", false);
_propsMetadata.put("system_proxyuser_encpassword", proxyuser_metadata);
_propsMetadata.put("system_sysmonitor_encpassword", sysmonitor_metadata);
_propsMetadata.put("system_root_encpassword", root_metadata);
_propsMetadata.put("system_svcuser_encpassword", svcuser_metadata);
}
public PropertyMetadata setPropMetaData(String label, String description, String type, int maxLen, String tag, Boolean advanced,
Boolean userMutable, Boolean userConfigurable, Boolean reconfigRequired, Boolean rebootRequired,
String value, Boolean controlNodeOnly) {
PropertyMetadata metaData = new PropertyMetadata();
metaData.setLabel(label);
metaData.setDescription(description);
metaData.setType(type);
metaData.setMaxLen(maxLen);
metaData.setTag(tag);
metaData.setAdvanced(advanced);
metaData.setUserMutable(userMutable);
metaData.setUserConfigurable(userConfigurable);
metaData.setReconfigRequired(reconfigRequired);
metaData.setRebootRequired(rebootRequired);
metaData.setValue(value);
metaData.setControlNodeOnly(controlNodeOnly);
return metaData;
}
public DummyCoordinatorClientExt getCoordinator() {
return _coordinator;
}
private class DummyCoordinatorClientExt extends CoordinatorClientExt {
public DummyCoordinatorClientExt() {
}
@Override
public boolean isClusterUpgradable() {
return true;
}
@Override
public void setTargetInfo(final CoordinatorSerializable info) throws CoordinatorClientException {
PropertyInfoExt props = (PropertyInfoExt) info;
for (Map.Entry<String, String> e : props.getAllProperties().entrySet()) {
_passwordProps.addProperty(e.getKey(), e.getValue());
}
}
}
private class DummyUpgradeManager extends UpgradeManager {
@Override
public LocalRepository getLocalRepository() {
return new DummyLocalRepository(_passwordProps);
}
@Override
public void wakeupOtherNodes() {
}
@Override
public void wakeup() {
}
}
private class DummyLocalRepository extends LocalRepository {
private PropertyInfoExt _props = null;
public DummyLocalRepository(PropertyInfoExt props) {
super();
_props = props;
}
}
private class DummyConfigService extends ConfigService {
@Override
public Response setProperties(PropertyInfoUpdate setProperty) throws LocalRepositoryException, CoordinatorClientException,
URISyntaxException {
_passwordProps.addProperties(setProperty.getAllProperties());
for (Map.Entry<String, String> entry : setProperty.getAllProperties().entrySet()) {
String validatedPropVal;
final String key = entry.getKey();
final String value = entry.getValue();
PropertyMetadata metaData = _propsMetadata.get(key);
if (metaData != null && ENCRYPTEDSTRING.equalsIgnoreCase(metaData.getType())) {
validatedPropVal = new String(Base64.encodeBase64(_encryptionProvider.encrypt(value)));
_passwordProps.addProperty(key, validatedPropVal);
}
}
return Response.ok().build();
}
}
}