package net.i2p.imagegen; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.docuverse.identicon.IdenticonUtil; import net.i2p.data.Hash; import net.i2p.util.ConvertToHash; /** * This servlet generates random art (visual identifier) images. * * @author modiied from identicon * @since 0.9.25 */ public class RandomArtServlet extends HttpServlet { private static final long serialVersionUID = -3507466186902317988L; private static final String PARAM_IDENTICON_CODE_SHORT = "c"; private static final String PARAM_IDENTICON_MODE_SHORT = "m"; private static final long DEFAULT_IDENTICON_EXPIRES_IN_MILLIS = 24 * 60 * 60 * 1000; private int version = 1; private long identiconExpiresInMillis = DEFAULT_IDENTICON_EXPIRES_IN_MILLIS; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8"); String codeParam = request.getParameter(PARAM_IDENTICON_CODE_SHORT); boolean codeSpecified = codeParam != null && codeParam.length() > 0; if (!codeSpecified) { response.setStatus(403); return; } String modeParam = request.getParameter(PARAM_IDENTICON_MODE_SHORT); boolean html = modeParam == null || modeParam.startsWith("h"); String identiconETag = IdenticonUtil.getIdenticonETag(codeParam.hashCode(), 0, version); String requestETag = request.getHeader("If-None-Match"); if (requestETag != null && requestETag.equals(identiconETag)) { response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } else { Hash h = ConvertToHash.getHash(codeParam); if (h == null) { response.setStatus(403); } else { StringBuilder buf = new StringBuilder(512); if (html) { response.setContentType("text/html"); buf.append("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"></head><body>"); } else { response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); } response.setHeader("X-Content-Type-Options", "nosniff"); buf.append(RandomArt.gnutls_key_fingerprint_randomart(h.getData(), "SHA", 256, "", true, html)); if (html) buf.append("</body></html>"); // set ETag and, if code was provided, Expires header response.setHeader("ETag", identiconETag); if (codeSpecified) { long expires = System.currentTimeMillis() + identiconExpiresInMillis; response.addDateHeader("Expires", expires); } // return image bytes to requester byte[] imageBytes = buf.toString().getBytes("UTF-8"); response.setContentLength(imageBytes.length); response.getOutputStream().write(imageBytes); } } } }