package org.jivesoftware.openfire.fastpath; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jivesoftware.openfire.fastpath.settings.chat.ChatSetting; import org.jivesoftware.openfire.fastpath.settings.chat.ChatSettings; import org.jivesoftware.openfire.fastpath.settings.chat.ChatSettingsManager; import org.jivesoftware.openfire.user.UserNotFoundException; import org.jivesoftware.util.StringUtils; import org.jivesoftware.xmpp.workgroup.Workgroup; import org.jivesoftware.xmpp.workgroup.WorkgroupManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.packet.JID; /** * A servlet that displays images. */ public class ImageServlet extends HttpServlet { private static final Logger Log = LoggerFactory.getLogger(ImageServlet.class); /** * The content-type of the images to return. */ private static final String CONTENT_TYPE = "image/jpeg"; private ChatSettingsManager chatSettingsManager; @Override public void init(ServletConfig config) throws ServletException { super.init(config); // Initialize chat settings manager. chatSettingsManager = ChatSettingsManager.getInstance(); } /** * Retrieve the image based on it's name. * * @param request the httpservletrequest. * @param response the httpservletresponse. * @throws ServletException * @throws IOException */ @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String imageName = request.getParameter("imageName"); String workgroupName = (String)request.getSession().getAttribute("workgroup"); if (workgroupName == null) { workgroupName = request.getParameter("workgroup"); } byte[] bytes = getImage(imageName, workgroupName); if (bytes != null) { writeBytesToStream(bytes, response); } } /** * Writes out a <code>byte</code> to the ServletOuputStream. * * @param bytes the bytes to write to the <code>ServletOutputStream</code>. * @param response the HttpServeltResponse. */ public void writeBytesToStream(byte[] bytes, HttpServletResponse response) { if (bytes == null) { return; } response.setContentType(CONTENT_TYPE); // Send back image try { ServletOutputStream sos = response.getOutputStream(); sos.write(bytes); sos.flush(); sos.close(); } catch (IOException e) { // Ignore. } } /** * Returns the image bytes of the encoded image. * * @param imageName the name of the image. * @param workgroupName the name of the workgroup. * @return the image bytes found, otherwise null. */ public byte[] getImage(String imageName, String workgroupName) { WorkgroupManager workgroupManager = WorkgroupManager.getInstance(); JID workgroupJID = new JID(workgroupName); Workgroup workgroup; try { workgroup = workgroupManager.getWorkgroup(workgroupJID); } catch (UserNotFoundException e) { Log.error(e.getMessage(), e); return null; } ChatSettings chatSettings = chatSettingsManager.getChatSettings(workgroup); ChatSetting setting = chatSettings.getChatSetting(imageName); String encodedValue = setting.getValue(); if (encodedValue == null) { return null; } return StringUtils.decodeBase64(encodedValue); } }