/*
* eGov suite of products aim to improve the internal efficiency,transparency,
* accountability and the service delivery of the government organizations.
*
* Copyright (C) <2015> eGovernments Foundation
*
* The updated version of eGov suite of products as by eGovernments Foundation
* is available at http://www.egovernments.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/ or
* http://www.gnu.org/licenses/gpl.html .
*
* In addition to the terms of the GPL license to be adhered to in using this
* program, the following additional terms are to be complied with:
*
* 1) All versions of this program, verbatim or modified must carry this
* Legal Notice.
*
* 2) Any misrepresentation of the origin of the material is prohibited. It
* is required that all modified versions of this material be marked in
* reasonable ways as different from the original version.
*
* 3) This license does not grant any rights to any user of the program
* with regards to rights under trademark law for use of the trade names
* or trademarks of eGovernments Foundation.
*
* In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org.
*/
package org.egov.restapi.filter;
import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.egov.commons.entity.Source;
import org.egov.infra.admin.master.entity.City;
import org.egov.infra.admin.master.service.CityService;
import org.egov.infra.config.core.ApplicationThreadLocals;
import org.egov.infra.exception.ApplicationRuntimeException;
import org.egov.restapi.config.properties.RestAPIApplicationProperties;
import org.egov.restapi.constants.RestRedirectConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
//This is an unnecessary class, the existence of this filter is due to customer is not ready to
//change their existing system to call appropriate url from their apps.
public class ApiFilter implements Filter {
private final static Logger LOG = Logger.getLogger(ApiFilter.class);
private static final String SOURCE = "source";
@Autowired
private CityService cityService;
@Autowired
private RestAPIApplicationProperties restAPIApplicationProperties;
@Override
public void destroy() {
}
@Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
final FilterChain filterChain)
throws IOException, ServletException {
final MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest((HttpServletRequest) servletRequest);
if (!validateRequest(multiReadRequest))
throw new ApplicationRuntimeException("RESTAPI.001");
String ulbCode = null;
final byte[] b = new byte[5000];
ulbCode = servletRequest.getParameter("ulbCode");
if (ulbCode == null) {
JSONObject jsonObject = null;
String jb = new String();
try {
final ServletInputStream inputStream = multiReadRequest.getInputStream();
inputStream.read(b);
jb = new String(b);
} catch (final Exception e) {
// Throw error
}
try {
jsonObject = JSONObject.fromObject(jb.toString());
} catch (final Exception e) {
throw new RuntimeException("Invalid Json");
}
if (jsonObject != null)
ulbCode = jsonObject.getString("ulbCode");
else
throw new RuntimeException("Invalid Json ULB Code is not Passed");
}
if (StringUtils.isNotBlank(ulbCode)) {
if (!ulbCode.equals(ApplicationThreadLocals.getCityCode())) {
LOG.info("Request Reached Different city. Need to change domain details");
final String cityName = RestRedirectConstants.getCode_ulbNames().get(ulbCode).toLowerCase();
ApplicationThreadLocals.setTenantID(cityName);
final City city = cityService.getCityByCode(ulbCode);
ApplicationThreadLocals.setDomainName(city.getDomainURL());
ApplicationThreadLocals.setCityCode(ulbCode);
} else
LOG.info("ULB code resolved to be same, continueing normal request flow");
} else {
LOG.error("ULB Code missing in request");
throw new ApplicationRuntimeException("ULB Code missing in request");
}
filterChain.doFilter(multiReadRequest, servletResponse);
}
@Override
public void init(final FilterConfig arg0) throws ServletException {
}
private boolean validateRequest(final MultiReadHttpServletRequest httpServletRequest) {
final String referer = httpServletRequest.getHeader(HttpHeaders.REFERER);
if (LOG.isInfoEnabled()) {
LOG.info("The calling request URL:referer= " + referer);
LOG.info("Host = " + httpServletRequest.getHeader("Host"));
LOG.info("X-Forwarded-For = " + httpServletRequest.getHeader("X-Forwarded-For"));
LOG.info("RequestURL = " + httpServletRequest.getRequestURL());
LOG.info("X-RemoteHost = " + httpServletRequest.getRequest().getRemoteHost());
}
final List<String> apOnlineIpAddress = restAPIApplicationProperties.aponlineIPAddress();
final List<String> esevaIpAddress = restAPIApplicationProperties.esevaIPAddress();
final List<String> softtechIpAddress = restAPIApplicationProperties.softtechIPAddress();
final List<String> cardIpAddress = restAPIApplicationProperties.cardIPAddress();
if (apOnlineIpAddress != null && referer != null)
for (final String aponlineIp : apOnlineIpAddress)
if (!aponlineIp.equals("") && referer.contains(aponlineIp)) {
httpServletRequest.getSession().setAttribute(SOURCE, Source.APONLINE);
return true;
}
if (esevaIpAddress != null && referer != null)
for (final String esevaIp : esevaIpAddress)
if (!esevaIp.equals("") && referer.contains(esevaIp)) {
httpServletRequest.getSession().setAttribute(SOURCE, Source.ESEVA);
return true;
}
if (softtechIpAddress != null && referer != null)
for (final String Ip : softtechIpAddress)
if (!Ip.equals("") && referer.contains(Ip)) {
httpServletRequest.getSession().setAttribute(SOURCE, Source.SOFTTECH);
return true;
}
if (cardIpAddress != null && referer != null)
for (final String cardIp : cardIpAddress)
if (!cardIp.equals("") && referer.contains(cardIp)) {
httpServletRequest.getSession().setAttribute(SOURCE, Source.CARD);
return true;
}
return false;
}
}