/*
* Copyright (c) 2005-2013, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.registry.security.vault.ui;
import org.apache.axis2.AxisFault;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.registry.common.ui.UIConstants;
import org.wso2.carbon.registry.core.RegistryConstants;
import org.wso2.carbon.registry.core.exceptions.RegistryException;
import org.wso2.carbon.registry.properties.stub.PropertiesAdminServiceRegistryExceptionException;
import org.wso2.carbon.registry.properties.stub.PropertiesAdminServiceStub;
import org.wso2.carbon.registry.properties.stub.beans.xsd.PropertiesBean;
import org.wso2.carbon.registry.properties.stub.beans.xsd.RetentionBean;
import org.wso2.carbon.registry.properties.stub.utils.xsd.Property;
import org.wso2.carbon.registry.security.stub.RegistrySecurityAdminServiceCryptoExceptionException;
import org.wso2.carbon.registry.security.stub.RegistrySecurityAdminServiceStub;
import org.wso2.carbon.registry.security.vault.cipher.tool.CipherTool;
import org.wso2.carbon.registry.security.vault.util.SecureVaultConstants;
import org.wso2.carbon.ui.CarbonUIUtil;
import org.wso2.carbon.utils.ServerConstants;
import java.rmi.RemoteException;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class PropertiesServiceClient {
public static final String NAME = "name";
public static final String VALUE = "value";
public static final String PATH = "path";
private static final Log log = LogFactory.getLog(PropertiesServiceClient.class);
private PropertiesAdminServiceStub propertAdminServicestub;
private RegistrySecurityAdminServiceStub securityAdminServiceStub;
private HttpSession session;
private CipherTool cipherTool;
public PropertiesServiceClient(ServletConfig config, HttpSession session)
throws RegistryException {
this.session = session;
String cookie = (String) session.getAttribute(ServerConstants.ADMIN_SERVICE_COOKIE);
String backendServerURL = CarbonUIUtil.getServerURL(config.getServletContext(), this.session);
ConfigurationContext configContext =
(ConfigurationContext) config.getServletContext()
.getAttribute(CarbonConstants.CONFIGURATION_CONTEXT);
String propertyEPR = backendServerURL + "PropertiesAdminService";
String registrySecurityEPR = backendServerURL + "RegistrySecurityAdminService";
try {
propertAdminServicestub = new PropertiesAdminServiceStub(configContext, propertyEPR);
ServiceClient client = propertAdminServicestub._getServiceClient();
Options option = client.getOptions();
option.setManageSession(true);
option.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, cookie);
//
securityAdminServiceStub = new RegistrySecurityAdminServiceStub(configContext, registrySecurityEPR);
ServiceClient securityclient = propertAdminServicestub._getServiceClient();
Options securityoption = securityclient.getOptions();
securityoption.setManageSession(true);
securityoption.setProperty(org.apache.axis2.transport.http.HTTPConstants.COOKIE_STRING, cookie);
cipherTool = new CipherTool(securityAdminServiceStub);
} catch (AxisFault axisFault) {
String msg = "Failed to initiate resource service client. " + axisFault.getMessage();
log.error(msg, axisFault);
throw new RegistryException(msg, axisFault);
}
}
/**
* Retrieving the length of the properties in selected registry resource
*
* @return
* @throws RegistryException
*/
public int getPropertiesLenght() throws RegistryException {
String path = SecureVaultConstants.ENCRYPTED_PROPERTY_CONFIG_REGISTRY_PATH;
PropertiesBean bean = null;
try {
bean = propertAdminServicestub.getProperties(path, "no");
} catch (Exception axisFault) {
String msg = "Failed to initiate resource service client. " + axisFault.getMessage();
log.error(msg, axisFault);
throw new RegistryException(msg, axisFault);
}
return bean.getSysProperties().length;
}
public PropertiesBean getProperties(HttpServletRequest request, int pageNumber)
throws Exception {
String path = SecureVaultConstants.ENCRYPTED_PROPERTY_CONFIG_REGISTRY_PATH;
Boolean view = (Boolean) request.getSession().getAttribute(UIConstants.SHOW_SYSPROPS_ATTR);
String viewProps;
if (view != null) {
if (view.booleanValue()) {
viewProps = "yes";
} else {
viewProps = "no";
}
} else {
viewProps = "no";
}
PropertiesBean bean = null;
bean = propertAdminServicestub.getProperties(path, viewProps);
int itemPerPage = (int) (RegistryConstants.ITEMS_PER_PAGE * 1.5);
int start = (int) ((pageNumber) * itemPerPage);
if (start >= 0 && bean.getSysProperties() != null && bean.getSysProperties().length > 0) {
int length =
start > 0 ? ((bean.getSysProperties().length - start) - 1)
: bean.getSysProperties().length;
if (length > itemPerPage) {
length = itemPerPage;
}
String[] prams = new String[length > 0 ? length : 1];
for (int i = 0; i <= itemPerPage - 1; i++) {
if (i < prams.length) {
prams[i] = bean.getSysProperties()[i + start];
}
}
bean.setSysProperties(prams);
}
if (bean == null) {
return null;
}
if (bean.getLifecycleProperties() == null) {
bean.setLifecycleProperties(new String[0]);
}
if (bean.getSysProperties() == null) {
bean.setSysProperties(new String[0]);
}
if (bean.getValidationProperties() == null) {
bean.setValidationProperties(new String[0]);
}
if (bean.getProperties() == null) {
bean.setProperties(new Property[0]);
}
return bean;
}
/**
* Method to add a property, if there already exist a property with the same name, this
* will add the value to the existing property name. (So please remove the old property with
* the same name before calling this method).
*
* @param request Http request with parameters.
* @throws RegistryException throws if there is an error.
*/
public void setProperty(HttpServletRequest request) throws RegistryException {
String path = SecureVaultConstants.ENCRYPTED_PROPERTY_CONFIG_REGISTRY_PATH;
String name = (String) Utils.getParameter(request, NAME);
String value = (String) Utils.getParameter(request, VALUE);
try {
// do the encryption..
String encrypted = cipherTool.doEncryption(value);
propertAdminServicestub.setProperty(path, name, encrypted);
} catch (RemoteException | PropertiesAdminServiceRegistryExceptionException e) {
throw new RegistryException("Failed to add property" + name + "to resource at path " + path, e);
} catch (RegistrySecurityAdminServiceCryptoExceptionException e) {
throw new RegistryException("Failed to encrypt the property " + name, e);
}
}
/**
* Method to update a property (This removes the old property with the oldName)
*
* @param request Http request with parameters.
* @throws RegistryException throws if there is an error.
*/
public void updateProperty(HttpServletRequest request) throws RegistryException {
String path = SecureVaultConstants.ENCRYPTED_PROPERTY_CONFIG_REGISTRY_PATH;
String name = (String) Utils.getParameter(request, NAME);
String value = (String) Utils.getParameter(request, VALUE);
String oldName = (String) Utils.getParameter(request, "oldName");
try {
// do the encryption..
String encrypted = cipherTool.doEncryption(value);
propertAdminServicestub.updateProperty(path, name, encrypted, oldName);
} catch (RemoteException | PropertiesAdminServiceRegistryExceptionException e) {
throw new RegistryException("Failed to update the property" + name + "at resource path " + path, e);
} catch (RegistrySecurityAdminServiceCryptoExceptionException e) {
throw new RegistryException("Failed to encrypt the property " + name, e);
}
}
/**
* Method to remove property from a resource.
*
* @param request Http request with parameters.
* @throws RegistryException throws if there is an error.
*/
public void removeProperty(HttpServletRequest request) throws RegistryException {
String path = (String) Utils.getParameter(request, PATH);
String name = (String) Utils.getParameter(request, NAME);
try {
propertAdminServicestub.removeProperty(path, name);
} catch (RemoteException | PropertiesAdminServiceRegistryExceptionException e) {
throw new RegistryException("Failed to remove the property" + name + "at resource path " + path, e);
}
}
/**
* Method to set resource retention properties of a resource.
*
* @param request Http request with parameters.
* @throws RegistryException throws if there is an error
*/
public boolean setRetentionProperties(HttpServletRequest request) throws RegistryException {
String path = request.getParameter(PATH);
try {
RetentionBean bean;
String fromDate = request.getParameter("fromDate");
if (fromDate == null || "".equals(fromDate)) {
bean = null;
} else {
bean = new RetentionBean();
bean.setFromDate(fromDate);
bean.setToDate(request.getParameter("toDate"));
String lockedOperationsParam = request.getParameter("lockedOperations");
bean.setWriteLocked(lockedOperationsParam.contains("write"));
bean.setDeleteLocked(lockedOperationsParam.contains("delete"));
}
propertAdminServicestub.setRetentionProperties(path, bean);
} catch (RemoteException | PropertiesAdminServiceRegistryExceptionException e) {
throw new RegistryException("Failed to add retention to resource at path" + path, e);
}
return true;
}
/**
* Method to get resource retention properties of a given resource.
*
* @param request Http request with parameters.
* @throws RegistryException
*/
public RetentionBean getRetentionProperties(HttpServletRequest request) throws RegistryException {
String path = request.getParameter(PATH);
try {
return propertAdminServicestub.getRetentionProperties(request.getParameter(PATH));
} catch (Exception e) {
throw new RegistryException("Could not retrieve retention details at path" + path, e);
}
}
}