/*
************************************************************************************
* Copyright (C) 2001-2011 encuestame: system online surveys Copyright (C) 2011
* encuestame Development Team.
* Licensed under the Apache Software License version 2.0
* 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.encuestame.core.security.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.LocaleUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.encuestame.core.config.EnMePlaceHolderConfigurer;
import org.encuestame.core.files.PathUtil;
import org.encuestame.core.security.details.EnMeUserAccountDetails;
import org.encuestame.core.util.SocialUtils;
import org.encuestame.persistence.exception.EnMeExpcetion;
import org.encuestame.utils.MD5Utils;
import org.encuestame.utils.PictureUtils;
import org.encuestame.utils.ShortUrlProvider;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
/**
* Dojo Widget Utils.
* @author Picado, Juan juanATencuestame.org
* @since Jan 23, 2011 8:23:58 AM
* @version $Id:$
*/
public class WidgetUtil {
private static final String URL = "http://";
private static final Integer REQUEST_SERVER_PORT = 80;
private static Log log = LogFactory.getLog(EnMePlaceHolderConfigurer.class);
/**
*
* @param request
* @return
*/
public static String getUserProfileImagePath(final HttpServletRequest request) {
final StringBuilder domain = new StringBuilder(WidgetUtil.getDomain(request));
domain.append(PathUtil.profileUserImage);
return domain.toString();
}
/**
* Get the current locale, get the language from the {@link UserDetails} if is missing get the locale from the context
* @param request {@link HttpServletRequest}
* @return
*/
public static String getCurrentLocale(final HttpServletRequest request) {
return WidgetUtil.convertToDojoLocale(WidgetUtil.validateLocale(request.getLocale().getLanguage()));
}
/**
*
* @param locale
* @return
*/
public static Locale parseLocale(String locale) {
String[] parts = locale.split("_");
if (parts.length > 1) {
switch (parts.length) {
case 3: return new Locale(parts[0], parts[1], parts[2]);
case 2: return new Locale(parts[0], parts[1]);
case 1: return new Locale(parts[0]);
default: throw new IllegalArgumentException("Invalid locale: " + locale);
}
} else {
throw new IllegalArgumentException("Invalid locale: " + locale);
}
}
public static boolean isValid(Locale locale) {
try {
return locale.getISO3Language() != null && locale.getISO3Country() != null;
} catch (Exception e) {
return false;
}
}
public static Locale toLocale(final String language) {
try {
final Locale locale = parseLocale(language);
return locale;
} catch (Exception e) {
return new Locale("en", "US");
}
}
/**
*
* @param language
* @return
*/
public static String validateLocale(final String language) {
try {
final Locale locale = parseLocale(language);
return locale.toString();
} catch (Exception e) {
return new Locale("en", "US").toString();
}
}
/**
*
* @param language
* @return
*/
public static String convertToDojoLocale(final String language) {
final String lang = WidgetUtil.validateLocale(language);
return lang.replace("_", "-").toLowerCase().toString();
}
/**
*
* @param menu
* @param request
* @return
*/
public static String menuSelected(final String menu, final String realPath, final String contextPath) {
final StringBuffer stringBuffer = new StringBuffer(contextPath);
stringBuffer.append(menu);
log.debug("menuSelected realPath " +stringBuffer.toString());
log.debug("menuSelected contextPath " + contextPath);
if (stringBuffer.toString() == menu) {
return "current";
} else {
return "";
}
}
/**
* Create a short Url.
* @param provider
* @param url
* @return
*/
public static String createShortUrl(final ShortUrlProvider provider, final String url) {
String urlShort = url;
if (!EnMePlaceHolderConfigurer.getBooleanProperty("application.offline.mode")) {
if (provider.equals(ShortUrlProvider.GOOGL)) {
urlShort = SocialUtils.getGoGl(url,
EnMePlaceHolderConfigurer.getProperty("short.google.key"));
} else if (provider.equals(ShortUrlProvider.NONE)) {
urlShort = url;
} else if (provider.equals(ShortUrlProvider.YOURLS)) {
urlShort = SocialUtils.getYourls(url);
} else if (provider.equals(ShortUrlProvider.TINYURL)) {
urlShort = SocialUtils.getTinyUrl(url);
} else if (provider.equals(ShortUrlProvider.BITLY)) {
urlShort = SocialUtils.getBitLy(url,
EnMePlaceHolderConfigurer.getProperty("short.bitLy.key"),
EnMePlaceHolderConfigurer.getProperty("short.bitLy.login"));
} else {
urlShort = null;
}
}
return urlShort;
}
/**
* Get Domain.
* @param request
* @return
*/
public static final String getDomain(final HttpServletRequest request) {
//FIXME: and HTTPS?
final StringBuffer domain = new StringBuffer(WidgetUtil.URL);
domain.append(request.getServerName());
if (request.getServerPort() != WidgetUtil.REQUEST_SERVER_PORT) {
domain.append(":");
domain.append(request.getServerPort());
}
// buffer.append("//");
domain.append(request.getContextPath());
return domain.toString();
}
/**
*
* @param request
* @return
*/
public static final String getRelativeDomain(final HttpServletRequest request) {
//FIXME: and HTTPS?
final StringBuffer domain = new StringBuffer();
domain.append(request.getServerName());
if (request.getServerPort() != WidgetUtil.REQUEST_SERVER_PORT) {
domain.append(":");
domain.append(request.getServerPort());
}
domain.append(request.getContextPath());
return domain.toString();
}
/**
*
* @param request
* @param addHttp
* @return
*/
public static final String getDomain(final HttpServletRequest request, final Boolean addHttp) {
final StringBuffer domain = new StringBuffer(addHttp ? WidgetUtil.URL : "");
domain.append(request.getServerName());
if (request.getServerPort() != WidgetUtil.REQUEST_SERVER_PORT) {
domain.append(":");
domain.append(request.getServerPort());
}
// buffer.append("//");
domain.append(request.getContextPath());
return domain.toString();
}
/**
* Build correctly period filter url.
* @param request
* @param period
* @return
*/
public static final String getHomeFilterPeriodParameter(final HttpServletRequest request, final String period){
StringBuilder url = new StringBuilder();
url.append(request.getContextPath());
url.append("/home?");
if (request.getParameter("view") == null) {
url.append("period=");
url.append(period);
} else {
url.append("view=");
url.append(request.getParameter("view"));
url.append("&period=");
url.append(period);
}
log.debug("getHomeFilterPeriodParameter "+url.toString());
return url.toString();
}
/**
* Get Gravatar.
* @param email
* @param size
* @return
* @deprecated moved to {@link PictureUtils}
*/
@Deprecated
public final String getGravatar(final String email, Integer size) {
final String hash = MD5Utils.md5Hex(email);
StringBuilder gravatarUl = new StringBuilder();
gravatarUl.append(PictureUtils.GRAVATAR_URL);
gravatarUl.append(hash);
gravatarUl.append("?s=");
gravatarUl.append(size);
return gravatarUl.toString();
}
/**
* Get Analytics google code.
* @param path
* @return
*/
public static final String getAnalytics(final String path){
final String analyticCode = EnMePlaceHolderConfigurer.getProperty("google.analytic.code");
final String scriptFilePath = path;
final StringBuffer stb = new StringBuffer("");
BufferedReader reader;
String analyticBlock;
try {
if (analyticCode.isEmpty()) {
throw new EnMeExpcetion("analytics code is emtpy");
}
reader = new BufferedReader(
new InputStreamReader(new ClassPathResource(scriptFilePath).getInputStream()));
String aux;
while(true) { aux = reader.readLine();
if (aux == null) break;
stb.append(aux);
}
reader.close();
analyticBlock = stb.toString();
analyticBlock = StringUtils.replace(analyticBlock, "$analyticCode", analyticCode);
} catch (IOException e) {
analyticBlock = "";
} catch (EnMeExpcetion e) {
analyticBlock = "";
}
return analyticBlock;
}
/**
*
* @param path
* @return
*/
public static final String getPasswordBlackList(final String path){
final String scriptFilePath = path;
final StringBuffer stb = new StringBuffer("[");
BufferedReader reader;
String passwordArray;
try {
reader = new BufferedReader(
new InputStreamReader(new ClassPathResource(scriptFilePath).getInputStream()));
String aux;
while(true) {
aux = reader.readLine();
if (aux == null) {
stb.append("\"\"]");
break;
}
stb.append("\"");
stb.append(aux);
stb.append("\",");
}
reader.close();
passwordArray = stb.toString();
} catch (IOException e) {
passwordArray = "";
}
return passwordArray;
}
/**
* Get black list ip.
* @return
*/
public static final List<String> getBlackListIP(final String path) throws EnMeExpcetion{
final String blackListPath = path;
BufferedReader reader;
final List<String> blackList = new ArrayList<String>();
try {
reader = new BufferedReader(
new InputStreamReader(new ClassPathResource(blackListPath).getInputStream()));
String ipLine;
while(true) {
ipLine = reader.readLine();
log.debug("IP readed ---> "+ ipLine);
if (ipLine == null) break;
blackList.add(ipLine);
}
reader.close();
} catch (IOException e) {
log.debug(e);
}
return blackList;
}
}