/*
* Juick
* Copyright (C) 2008-2011, Ugnich Anton
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.juick.www;
import com.juick.Tag;
import com.juick.User;
import com.juick.server.TagQueries;
import com.mitchellbosecke.pebble.PebbleEngine;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.*;
/**
*
* @author Ugnich Anton
*/
public class Utils {
private static final Logger logger = LoggerFactory.getLogger(Utils.class);
private static final PebbleEngine engine = new PebbleEngine.Builder().build();
private static String tmpDir = "/var/www/juick.com/i/tmp/";
public static String getCookie(HttpServletRequest request, String name) {
Cookie cookies[] = request.getCookies();
if (cookies != null) {
return Arrays.stream(cookies).filter(c ->
c.getName().equals(name)).findAny().map(Cookie::getValue).orElse(null);
}
return null;
}
public static String receiveMultiPartFile(Part filePart) throws IOException, ServletException {
String attachmentFName = null;
if (filePart != null) {
String partname = Utils.getPartFilename(filePart);
if (partname != null && partname.length() > 0) {
String attachmentType = partname.substring(partname.length() - 3).toLowerCase();
if (attachmentType.equals("jpg") || attachmentType.equals("peg") || attachmentType.equals("png")) {
if (attachmentType.equals("peg")) {
attachmentType = "jpg";
}
attachmentFName = DigestUtils.md5Hex(UUID.randomUUID().toString()) + "." + attachmentType;
filePart.write(Paths.get(getTmpDir(), attachmentFName).toString());
} else {
throw new IOException("Wrong file type");
}
}
}
return attachmentFName;
}
public static com.juick.User getVisitorUser(JdbcTemplate sql, HttpServletRequest request, HttpServletResponse response) {
String hash = getCookie(request, "hash");
if (hash != null) {
com.juick.User visitor = com.juick.server.UserQueries.getUserByHash(sql, hash);
if (response != null && visitor.getUid() > 0) {
response.setHeader("X-Username", visitor.getName());
}
return visitor;
} else {
return new User();
}
}
public static void sendTemporaryRedirect(HttpServletResponse response, String location) {
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
response.setHeader("Location", location);
}
public static void sendPermanentRedirect(HttpServletResponse response, String location) {
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", location);
}
public static String getPartFilename(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", StringUtils.EMPTY);
return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
}
}
return null;
}
public static void replyJSON(HttpServletRequest request, HttpServletResponse response, String json) throws IOException {
response.setContentType("application/json; charset=UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");
String callback = request.getParameter("callback");
if (callback != null && (callback.length() > 64 || !callback.matches("[a-zA-Z0-9\\-\\_]+"))) {
callback = null;
}
PrintWriter out = response.getWriter();
try {
if (callback != null) {
out.print(callback + "(");
out.print(json);
out.print(")");
} else {
out.print(json);
}
} finally {
out.close();
}
}
public static String encodeSphinx(String str) {
return str.replaceAll("@", "\\\\@");
}
public static String fetchURL(String url) {
try {
URLConnection c = new URL(url).openConnection();
return IOUtils.toString(c.getInputStream(), StandardCharsets.UTF_8);
} catch (IOException e) {
logger.warn("fetchURL", e);
return null;
}
}
public static String downloadImage(URL url) throws Exception {
String attachmentFName = null;
Exception ex = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URLConnection urlConn = url.openConnection();
is = urlConn.getInputStream();
String mime = urlConn.getContentType();
String attachmentType;
if (mime != null && mime.equals("image/jpeg")) {
attachmentType = "jpg";
} else if (mime != null && mime.equals("image/png")) {
attachmentType = "png";
} else {
throw new Exception("Wrong file type");
}
attachmentFName = DigestUtils.md5Hex(UUID.randomUUID().toString()) + "." + attachmentType;
fos = new FileOutputStream("/var/www/juick.com/i/tmp/" + attachmentFName);
byte[] buffer = new byte[10240];
int len;
while ((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
} catch (Exception e) {
ex = e;
attachmentFName = null;
} finally {
try {
if (is != null) {
is.close();
}
} finally {
if (fos != null) {
fos.close();
}
}
}
if (ex != null) {
throw ex;
} else {
return attachmentFName;
}
}
public static List parseTags(JdbcTemplate sql, String tagsStr) {
List tags = new ArrayList<>();
String tagsArr[];
if (tagsStr != null && !tagsStr.isEmpty()) {
tagsArr = tagsStr.split("[ \\,]");
for (int i = 0; i < tagsArr.length; i++) {
if (tagsArr[i].startsWith("*")) {
tagsArr[i] = tagsArr[i].substring(1);
}
if (tagsArr[i].length() > 64) {
tagsArr[i] = tagsArr[i].substring(0, 64);
}
}
tags = TagQueries.getTags(sql, tagsArr, true);
while (tags.size() > 5) {
tags.remove(5);
}
}
return tags;
}
public static String receiveAttachment(Part part, String paramImg) throws Exception {
String attachmentFName = receiveMultiPartFile(part);
if (attachmentFName == null && paramImg != null && paramImg.length() > 10) {
URL imgUrl = new URL(paramImg);
attachmentFName = downloadImage(imgUrl);
}
return attachmentFName;
}
public static PebbleEngine getEngine() {
return engine;
}
public static String getTmpDir() {
return tmpDir;
}
public static void setTmpDir(String tmpDir) {
Utils.tmpDir = tmpDir;
}
}