Commit 5d75d07c by Tuomas Riihimäki

There is possible (even likely) race with ImageServlet

which stores the request to object instance, which can be called
from multiple threads at once.
1 parent 13407a2b
...@@ -48,15 +48,16 @@ public class CardTemplateServlet extends GenericImageServlet { ...@@ -48,15 +48,16 @@ public class CardTemplateServlet extends GenericImageServlet {
private transient PermissionBeanLocal permbean; private transient PermissionBeanLocal permbean;
/** /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/ */
private final Pattern lhMatcher = Pattern.compile("^127.[0-9.]*|(0:)*1%0"); private final Pattern lhMatcher = Pattern.compile("^127.[0-9.]*|(0:)*1%0");
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata(HttpServletRequest request) {
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
CardTemplate templ = ctbean.find(getIdParam("imageid")); CardTemplate templ = ctbean.find(getIdParam("imageid", request));
if (templ != null) { // && if (templ != null) { // &&
......
...@@ -96,9 +96,9 @@ public class FileDownloadServlet extends GenericImageServlet { ...@@ -96,9 +96,9 @@ public class FileDownloadServlet extends GenericImageServlet {
* userimage/<eventuserid>.jpg cardtemplate/<cardtemplateid>.png usercard/ * userimage/<eventuserid>.jpg cardtemplate/<cardtemplateid>.png usercard/
*/ */
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata(HttpServletRequest request) {
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
Matcher matcher = URLPATTERN.matcher(super.request.getPathInfo()); Matcher matcher = URLPATTERN.matcher(request.getPathInfo());
List<String> urlparts = new ArrayList<String>(); List<String> urlparts = new ArrayList<String>();
while (matcher.find()) { while (matcher.find()) {
...@@ -145,8 +145,7 @@ public class FileDownloadServlet extends GenericImageServlet { ...@@ -145,8 +145,7 @@ public class FileDownloadServlet extends GenericImageServlet {
int imageid = Integer.parseInt(urlparts.get(1)); int imageid = Integer.parseInt(urlparts.get(1));
UserImage image = userbean.findUserimageFORCE(imageid); UserImage image = userbean.findUserimageFORCE(imageid);
if (image != null) if (image != null) {
{
if (!permbean.isCurrentUser(image.getUser()) if (!permbean.isCurrentUser(image.getUser())
&& !permbean.hasPermission(UserPermission.VIEW_ALL)) && !permbean.hasPermission(UserPermission.VIEW_ALL))
...@@ -165,7 +164,7 @@ public class FileDownloadServlet extends GenericImageServlet { ...@@ -165,7 +164,7 @@ public class FileDownloadServlet extends GenericImageServlet {
File imagefile = null; File imagefile = null;
if (dydataRoot != null) { if (dydataRoot != null) {
imagefile = new File(dydataRoot + super.request.getPathInfo()); imagefile = new File(dydataRoot + request.getPathInfo());
} }
if (imagefile != null && !imagefile.exists()) if (imagefile != null && !imagefile.exists())
{ {
......
...@@ -83,11 +83,9 @@ public abstract class GenericImageServlet extends HttpServlet { ...@@ -83,11 +83,9 @@ public abstract class GenericImageServlet extends HttpServlet {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static final Logger logger = LoggerFactory.getLogger(GenericImageServlet.class); private static final Logger logger = LoggerFactory.getLogger(GenericImageServlet.class);
protected abstract ImageMover getImagedata(); protected abstract ImageMover getImagedata(HttpServletRequest request);
protected HttpServletRequest request; protected Integer getIdParam(String name, HttpServletRequest request)
protected Integer getIdParam(String name)
{ {
Integer ret = null; Integer ret = null;
String idStr = request.getParameter(name); String idStr = request.getParameter(name);
...@@ -106,16 +104,15 @@ public abstract class GenericImageServlet extends HttpServlet { ...@@ -106,16 +104,15 @@ public abstract class GenericImageServlet extends HttpServlet {
@Override @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.request = request;
ImageMover data = getImagedata(); ImageMover data = getImagedata(request);
if (data == null || data.getData() == null || data.getResponse() != null) { if (data == null || data.getData() == null || data.getResponse() != null) {
if (data != null && data.getData() != null) { if (data != null && data.getData() != null) {
response.setStatus(data.getResponse()); response.setStatus(data.getResponse());
} else { } else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND); response.setStatus(HttpServletResponse.SC_NOT_FOUND);
} }
response.getWriter().append("Not Found"); response.getWriter().append("Error " + data.getResponse() + " while fetching data");
} else { } else {
response.setContentLength(data.getData().length); response.setContentLength(data.getData().length);
if (request.getParameter("download") != null) if (request.getParameter("download") != null)
......
...@@ -54,7 +54,8 @@ public class UserCardPngServlet extends GenericImageServlet { ...@@ -54,7 +54,8 @@ public class UserCardPngServlet extends GenericImageServlet {
private transient PermissionBeanLocal permbean; private transient PermissionBeanLocal permbean;
/** /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/ */
// private final Pattern lhMatcher = // private final Pattern lhMatcher =
...@@ -66,12 +67,12 @@ public class UserCardPngServlet extends GenericImageServlet { ...@@ -66,12 +67,12 @@ public class UserCardPngServlet extends GenericImageServlet {
// /dydata/(userimage|...)/stuff... // /dydata/(userimage|...)/stuff...
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata(HttpServletRequest request) {
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
List<String> urlparts = new ArrayList<String>(); List<String> urlparts = new ArrayList<String>();
if (super.request.getPathInfo() != null) if (request.getPathInfo() != null)
{ {
Matcher matcher = URLPATTERN.matcher(super.request.getPathInfo()); Matcher matcher = URLPATTERN.matcher(request.getPathInfo());
logger.info("urlparts {}", urlparts); logger.info("urlparts {}", urlparts);
while (matcher.find()) { while (matcher.find()) {
......
...@@ -67,7 +67,8 @@ public class UserCardServlet extends GenericImageServlet { ...@@ -67,7 +67,8 @@ public class UserCardServlet extends GenericImageServlet {
private transient PermissionBeanLocal permbean; private transient PermissionBeanLocal permbean;
/** /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/ */
private final Pattern lhMatcher = Pattern.compile("^127.[0-9.]*|(0:)*1%0"); private final Pattern lhMatcher = Pattern.compile("^127.[0-9.]*|(0:)*1%0");
...@@ -79,9 +80,9 @@ public class UserCardServlet extends GenericImageServlet { ...@@ -79,9 +80,9 @@ public class UserCardServlet extends GenericImageServlet {
.getLogger(UserCardServlet.class); .getLogger(UserCardServlet.class);
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata(HttpServletRequest request) {
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
Integer id = getIdParam("cardid"); Integer id = getIdParam("cardid", request);
PrintedCard card = cardbean.getCard(id); PrintedCard card = cardbean.getCard(id);
logger.info("image data id {}, card {}", id, card); logger.info("image data id {}, card {}", id, card);
......
...@@ -20,6 +20,7 @@ package fi.codecrew.moya.servlet; ...@@ -20,6 +20,7 @@ package fi.codecrew.moya.servlet;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -64,7 +65,7 @@ public class UserPngImageServlet extends GenericImageServlet { ...@@ -64,7 +65,7 @@ public class UserPngImageServlet extends GenericImageServlet {
// /dydata/(userimage|...)/stuff... // /dydata/(userimage|...)/stuff...
@Override @Override
protected ImageMover getImagedata() { protected ImageMover getImagedata(HttpServletRequest request) {
EventUser usr = permbean.getCurrentUser(); EventUser usr = permbean.getCurrentUser();
logger.info("Trying to print imagedata for user {}", usr); logger.info("Trying to print imagedata for user {}", usr);
ImageMover ret = new ImageMover(); ImageMover ret = new ImageMover();
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!