package com.my.blog.website.utils;
import com.my.blog.website.exception.TipException;
import com.my.blog.website.constant.WebConst;
import com.my.blog.website.controller.admin.AttachController;
import com.my.blog.website.modal.Vo.UserVo;
import org.apache.commons.lang3.StringUtils;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.imageio.ImageIO;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import java.awt.*;
import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.Normalizer;
import java.util.Date;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Tale工具类
* <p>
* Created by 13 on 2017/2/21.
*/
public class TaleUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(TaleUtils.class);
private static DataSource newDataSource;
/**
* 一个月
*/
private static final int one_month = 30 * 24 * 60 * 60;
/**
* 匹配邮箱正则
*/
private static final Pattern VALID_EMAIL_ADDRESS_REGEX =
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
private static final Pattern SLUG_REGEX = Pattern.compile("^[A-Za-z0-9_-]{5,100}$", Pattern.CASE_INSENSITIVE);
/**
* markdown解析器
*/
private static Parser parser = Parser.builder().build();
/**
* 获取文件所在目录
*/
private static String location = TaleUtils.class.getClassLoader().getResource("").getPath();
/**
* 判断是否是邮箱
*
* @param emailStr
* @return
*/
public static boolean isEmail(String emailStr) {
Matcher matcher = VALID_EMAIL_ADDRESS_REGEX.matcher(emailStr);
return matcher.find();
}
/**
* @param fileName 获取jar外部的文件
* @return 返回属性
*/
private static Properties getPropFromFile(String fileName) {
Properties properties = new Properties();
try {
// 默认是classPath路径
InputStream resourceAsStream = new FileInputStream(fileName);
properties.load(resourceAsStream);
} catch (TipException | IOException e) {
LOGGER.error("get properties file fail={}", e.getMessage());
}
return properties;
}
/**
* md5加密
*
* @param source 数据源
* @return 加密字符串
*/
public static String MD5encode(String source) {
if (StringUtils.isBlank(source)) {
return null;
}
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ignored) {
}
byte[] encode = messageDigest.digest(source.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte anEncode : encode) {
String hex = Integer.toHexString(0xff & anEncode);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString();
}
/**
* 获取新的数据源
*
* @return
*/
public static DataSource getNewDataSource() {
if (newDataSource == null) synchronized (TaleUtils.class) {
if (newDataSource == null) {
Properties properties = TaleUtils.getPropFromFile("application-jdbc.properties");
if (properties.size() == 0) {
return newDataSource;
}
DriverManagerDataSource managerDataSource = new DriverManagerDataSource();
managerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
managerDataSource.setPassword(properties.getProperty("spring.datasource.password"));
String str = "jdbc:mysql://" + properties.getProperty("spring.datasource.url") + "/" + properties.getProperty("spring.datasource.dbname") + "?useUnicode=true&characterEncoding=utf-8&useSSL=false";
managerDataSource.setUrl(str);
managerDataSource.setUsername(properties.getProperty("spring.datasource.username"));
newDataSource = managerDataSource;
}
}
return newDataSource;
}
/**
* 返回当前登录用户
*
* @return
*/
public static UserVo getLoginUser(HttpServletRequest request) {
HttpSession session = request.getSession();
if (null == session) {
return null;
}
return (UserVo) session.getAttribute(WebConst.LOGIN_SESSION_KEY);
}
/**
* 获取cookie中的用户id
*
* @param request
* @return
*/
public static Integer getCookieUid(HttpServletRequest request) {
if (null != request) {
Cookie cookie = cookieRaw(WebConst.USER_IN_COOKIE, request);
if (cookie != null && cookie.getValue() != null) {
try {
String uid = Tools.deAes(cookie.getValue(), WebConst.AES_SALT);
return StringUtils.isNotBlank(uid) && Tools.isNumber(uid) ? Integer.valueOf(uid) : null;
} catch (Exception e) {
}
}
}
return null;
}
/**
* 从cookies中获取指定cookie
*
* @param name 名称
* @param request 请求
* @return cookie
*/
private static Cookie cookieRaw(String name, HttpServletRequest request) {
javax.servlet.http.Cookie[] servletCookies = request.getCookies();
if (servletCookies == null) {
return null;
}
for (javax.servlet.http.Cookie c : servletCookies) {
if (c.getName().equals(name)) {
return c;
}
}
return null;
}
/**
* 设置记住密码cookie
*
* @param response
* @param uid
*/
public static void setCookie(HttpServletResponse response, Integer uid) {
try {
String val = Tools.enAes(uid.toString(), WebConst.AES_SALT);
boolean isSSL = false;
Cookie cookie = new Cookie(WebConst.USER_IN_COOKIE, val);
cookie.setPath("/");
cookie.setMaxAge(60*30);
cookie.setSecure(isSSL);
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 提取html中的文字
*
* @param html
* @return
*/
public static String htmlToText(String html) {
if (StringUtils.isNotBlank(html)) {
return html.replaceAll("(?s)<[^>]*>(\\s*<[^>]*>)*", " ");
}
return "";
}
/**
* markdown转换为html
*
* @param markdown
* @return
*/
public static String mdToHtml(String markdown) {
if (StringUtils.isBlank(markdown)) {
return "";
}
Node document = parser.parse(markdown);
HtmlRenderer renderer = HtmlRenderer.builder().build();
String content = renderer.render(document);
content = Commons.emoji(content);
return content;
}
/**
* 退出登录状态
*
* @param session
* @param response
*/
public static void logout(HttpSession session, HttpServletResponse response) {
session.removeAttribute(WebConst.LOGIN_SESSION_KEY);
Cookie cookie = new Cookie(WebConst.USER_IN_COOKIE, "");
cookie.setMaxAge(0);
response.addCookie(cookie);
try {
response.sendRedirect(Commons.site_url());
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
}
}
/**
* 替换HTML脚本
*
* @param value
* @return
*/
public static String cleanXSS(String value) {
//You'll need to remove the spaces from the html entities below
value = value.replaceAll("<", "<").replaceAll(">", ">");
value = value.replaceAll("\\(", "(").replaceAll("\\)", ")");
value = value.replaceAll("'", "'");
value = value.replaceAll("eval\\((.*)\\)", "");
value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
value = value.replaceAll("script", "");
return value;
}
/**
* 过滤XSS注入
*
* @param value
* @return
*/
public static String filterXSS(String value) {
String cleanValue = null;
if (value != null) {
cleanValue = Normalizer.normalize(value, Normalizer.Form.NFD);
// Avoid null characters
cleanValue = cleanValue.replaceAll("\0", "");
// Avoid anything between script tags
Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid anything in a src='...' type of expression
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Remove any lonesome </script> tag
scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Remove any lonesome <script ...> tag
scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid eval(...) expressions
scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid expression(...) expressions
scriptPattern = Pattern.compile("expression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid javascript:... expressions
scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid vbscript:... expressions
scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
// Avoid onload= expressions
scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
cleanValue = scriptPattern.matcher(cleanValue).replaceAll("");
}
return cleanValue;
}
/**
* 判断是否是合法路径
*
* @param slug
* @return
*/
public static boolean isPath(String slug) {
if (StringUtils.isNotBlank(slug)) {
if (slug.contains("/") || slug.contains(" ") || slug.contains(".")) {
return false;
}
Matcher matcher = SLUG_REGEX.matcher(slug);
return matcher.find();
}
return false;
}
public static String getFileKey(String name) {
String prefix = "/upload/" + DateKit.dateFormat(new Date(), "yyyy/MM");
if (!new File(AttachController.CLASSPATH + prefix).exists()) {
new File(AttachController.CLASSPATH + prefix).mkdirs();
}
name = StringUtils.trimToNull(name);
if (name == null) {
return prefix + "/" + UUID.UU32() + "." + null;
} else {
name = name.replace('\\', '/');
name = name.substring(name.lastIndexOf("/") + 1);
int index = name.lastIndexOf(".");
String ext = null;
if (index >= 0) {
ext = StringUtils.trimToNull(name.substring(index + 1));
}
return prefix + "/" + UUID.UU32() + "." + (ext == null ? null : (ext));
}
}
/**
* 判断文件是否是图片类型
*
* @param imageFile
* @return
*/
public static boolean isImage(InputStream imageFile) {
try {
Image img = ImageIO.read(imageFile);
if (img == null || img.getWidth(null) <= 0 || img.getHeight(null) <= 0) {
return false;
}
return true;
} catch (Exception e) {
return false;
}
}
/**
* 随机数
*
* @param size
* @return
*/
public static String getRandomNumber(int size) {
String num = "";
for (int i = 0; i < size; ++i) {
double a = Math.random() * 9.0D;
a = Math.ceil(a);
int randomNum = (new Double(a)).intValue();
num = num + randomNum;
}
return num;
}
/**
* 获取保存文件的位置,jar所在目录的路径
*
* @return
*/
public static String getUplodFilePath() {
String path = TaleUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
path = path.substring(1, path.length());
try {
path = java.net.URLDecoder.decode(path, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
int lastIndex = path.lastIndexOf("/") + 1;
path = path.substring(0, lastIndex);
File file = new File("");
return file.getAbsolutePath() + "/";
}
}