Skip to content

Commit 6300f22

Browse files
committed
Merge branch 'release/1.9.13.1'
2 parents 57e7181 + 7855439 commit 6300f22

File tree

6 files changed

+156
-94
lines changed

6 files changed

+156
-94
lines changed

GAE/src/com/gallatinsystems/common/Constants.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2010-2015 Stichting Akvo (Akvo Foundation)
2+
* Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation)
33
*
44
* This file is part of Akvo FLOW.
55
*
@@ -45,4 +45,6 @@ public class Constants {
4545
public static final String CADDISFLY_RESULT_VALUE = "value";
4646
public static final String CADDISFLY_RESULT_ID = "id";
4747

48+
public static final String DEFAULT_SURVEY_FILE_NAME = "survey";
49+
4850
}

GAE/src/org/waterforpeople/mapping/app/web/BootstrapGeneratorServlet.java

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2010-2014 Stichting Akvo (Akvo Foundation)
2+
* Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation)
33
*
44
* This file is part of Akvo FLOW.
55
*
@@ -16,24 +16,6 @@
1616

1717
package org.waterforpeople.mapping.app.web;
1818

19-
import java.io.BufferedReader;
20-
import java.io.ByteArrayOutputStream;
21-
import java.io.IOException;
22-
import java.io.InputStream;
23-
import java.io.InputStreamReader;
24-
import java.net.URLConnection;
25-
import java.util.HashMap;
26-
import java.util.HashSet;
27-
import java.util.Map;
28-
import java.util.Set;
29-
import java.util.logging.Level;
30-
import java.util.logging.Logger;
31-
32-
import javax.servlet.http.HttpServletRequest;
33-
34-
import org.apache.commons.io.IOUtils;
35-
import org.waterforpeople.mapping.app.web.dto.BootstrapGeneratorRequest;
36-
3719
import com.gallatinsystems.common.util.MailUtil;
3820
import com.gallatinsystems.common.util.PropertyUtil;
3921
import com.gallatinsystems.common.util.S3Util;
@@ -47,6 +29,22 @@
4729
import com.gallatinsystems.survey.domain.CascadeResource;
4830
import com.gallatinsystems.survey.domain.Question;
4931
import com.gallatinsystems.survey.domain.Survey;
32+
import com.google.gdata.util.common.base.Nullable;
33+
import com.google.gdata.util.common.base.StringUtil;
34+
import org.apache.commons.io.IOUtils;
35+
import org.waterforpeople.mapping.app.web.dto.BootstrapGeneratorRequest;
36+
37+
import javax.servlet.http.HttpServletRequest;
38+
import java.io.*;
39+
import java.net.URLConnection;
40+
import java.util.HashMap;
41+
import java.util.HashSet;
42+
import java.util.Map;
43+
import java.util.Set;
44+
import java.util.logging.Level;
45+
import java.util.logging.Logger;
46+
47+
import static com.gallatinsystems.common.Constants.DEFAULT_SURVEY_FILE_NAME;
5048

5149
/**
5250
* downloads publishes survey xml files and forms a zip that conforms to the structure of the
@@ -65,6 +63,10 @@ public class BootstrapGeneratorServlet extends AbstractRestApiServlet {
6563
private static final String EMAIL_SUB = "FLOW Bootstrap File";
6664
private static final String EMAIL_BODY = "Click the link to download the bootstrap file";
6765
private static final String ERROR_BODY = "There were errors while attempting to generate the bootstrap file:";
66+
private static final String FILENAME_REGEX = "[^a-zA-Z0-9_]";
67+
private static final String FILENAME_REPLACEMENT = "_";
68+
private static final int FILENAME_MAX_SIZE = 127;
69+
public static final String EXCESS_UNDERSCORE = "__";
6870

6971
private SurveyDAO surveyDao;
7072
private CascadeResourceDao cascadeDao;
@@ -111,7 +113,7 @@ private void generateFile(BootstrapGeneratorRequest req) {
111113
for (Long id : req.getSurveyIds()) {
112114
try {
113115
Survey s = surveyDao.getById(id);
114-
String name = s.getName().replaceAll(" ", "_");
116+
String surveyFilename = generateSanitizedFilename(s.getName());
115117
StringBuilder buf = new StringBuilder();
116118
URLConnection conn = S3Util.getConnection(bucketName, keyPrefix + "/"
117119
+ s.getKey().getId() + ".xml");
@@ -122,7 +124,7 @@ private void generateFile(BootstrapGeneratorRequest req) {
122124
buf.append(line).append("\n");
123125
}
124126
reader.close();
125-
contentMap.put(s.getKey().getId() + "/" + name + ".xml",
127+
contentMap.put(s.getKey().getId() + "/" + surveyFilename + ".xml",
126128
buf.toString());
127129

128130
resourcesSet.addAll(getSurveyResources(id));// Add survey resources
@@ -158,7 +160,26 @@ private void generateFile(BootstrapGeneratorRequest req) {
158160
MailUtil.sendMail(PropertyUtil.getProperty(EMAIL_FROM_ADDRESS_KEY),
159161
"FLOW", req.getEmail(), EMAIL_SUB, body);
160162
}
161-
163+
164+
/**
165+
* Uses name to generate a safe string to use as filename, removing any unsafe chars
166+
* @param name
167+
* @return
168+
*/
169+
private String generateSanitizedFilename(@Nullable String name) {
170+
String filename;
171+
if (StringUtil.isEmpty(name)) {
172+
filename = DEFAULT_SURVEY_FILE_NAME;
173+
} else {
174+
filename = name.trim().replaceAll(FILENAME_REGEX, FILENAME_REPLACEMENT);
175+
int maxLength = Math.min(FILENAME_MAX_SIZE, filename.length());
176+
filename = filename.substring(0, maxLength);
177+
//make sure we do not have multiple underscores
178+
filename = filename.replaceAll(EXCESS_UNDERSCORE, FILENAME_REPLACEMENT);
179+
}
180+
return filename;
181+
}
182+
162183
private Set<String> getSurveyResources(Long surveyId) {
163184
Set<String> resources = new HashSet<String>();
164185
for (Question q : new QuestionDao().listQuestionByType(surveyId, Question.Type.CASCADE)) {

GAE/src/org/waterforpeople/mapping/app/web/SurveyAssemblyServlet.java

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2010-2015 Stichting Akvo (Akvo Foundation)
2+
* Copyright (C) 2010-2017 Stichting Akvo (Akvo Foundation)
33
*
44
* This file is part of Akvo FLOW.
55
*
@@ -16,24 +16,6 @@
1616

1717
package org.waterforpeople.mapping.app.web;
1818

19-
import java.io.ByteArrayOutputStream;
20-
import java.io.IOException;
21-
import java.util.ArrayList;
22-
import java.util.List;
23-
import java.util.Map;
24-
import java.util.Properties;
25-
import java.util.Random;
26-
import java.util.TreeMap;
27-
28-
import javax.servlet.http.HttpServletRequest;
29-
import javax.servlet.http.HttpServletResponse;
30-
import javax.xml.bind.JAXBException;
31-
32-
import org.apache.commons.lang.StringEscapeUtils;
33-
import org.apache.log4j.Logger;
34-
import org.waterforpeople.mapping.app.web.dto.SurveyAssemblyRequest;
35-
import org.waterforpeople.mapping.dao.SurveyContainerDao;
36-
3719
import com.gallatinsystems.common.domain.UploadStatusContainer;
3820
import com.gallatinsystems.common.util.PropertyUtil;
3921
import com.gallatinsystems.common.util.S3Util;
@@ -43,44 +25,31 @@
4325
import com.gallatinsystems.framework.rest.RestResponse;
4426
import com.gallatinsystems.messaging.dao.MessageDao;
4527
import com.gallatinsystems.messaging.domain.Message;
46-
import com.gallatinsystems.survey.dao.CascadeResourceDao;
47-
import com.gallatinsystems.survey.dao.QuestionDao;
48-
import com.gallatinsystems.survey.dao.QuestionGroupDao;
49-
import com.gallatinsystems.survey.dao.SurveyDAO;
50-
import com.gallatinsystems.survey.dao.SurveyGroupDAO;
51-
import com.gallatinsystems.survey.dao.SurveyUtils;
52-
import com.gallatinsystems.survey.dao.SurveyXMLFragmentDao;
53-
import com.gallatinsystems.survey.dao.TranslationDao;
54-
import com.gallatinsystems.survey.domain.CascadeResource;
28+
import com.gallatinsystems.survey.dao.*;
29+
import com.gallatinsystems.survey.domain.*;
5530
import com.gallatinsystems.survey.domain.Question;
5631
import com.gallatinsystems.survey.domain.QuestionGroup;
57-
import com.gallatinsystems.survey.domain.QuestionHelpMedia;
58-
import com.gallatinsystems.survey.domain.QuestionOption;
59-
import com.gallatinsystems.survey.domain.ScoringRule;
6032
import com.gallatinsystems.survey.domain.Survey;
61-
import com.gallatinsystems.survey.domain.SurveyContainer;
62-
import com.gallatinsystems.survey.domain.SurveyGroup;
63-
import com.gallatinsystems.survey.domain.SurveyXMLFragment;
6433
import com.gallatinsystems.survey.domain.SurveyXMLFragment.FRAGMENT_TYPE;
65-
import com.gallatinsystems.survey.domain.Translation;
66-
import com.gallatinsystems.survey.domain.xml.AltText;
67-
import com.gallatinsystems.survey.domain.xml.Dependency;
68-
import com.gallatinsystems.survey.domain.xml.Help;
69-
import com.gallatinsystems.survey.domain.xml.Level;
70-
import com.gallatinsystems.survey.domain.xml.Levels;
71-
import com.gallatinsystems.survey.domain.xml.ObjectFactory;
72-
import com.gallatinsystems.survey.domain.xml.Option;
73-
import com.gallatinsystems.survey.domain.xml.Options;
74-
import com.gallatinsystems.survey.domain.xml.Score;
75-
import com.gallatinsystems.survey.domain.xml.Scoring;
76-
import com.gallatinsystems.survey.domain.xml.ValidationRule;
34+
import com.gallatinsystems.survey.domain.xml.*;
7735
import com.gallatinsystems.survey.xml.SurveyXMLAdapter;
7836
import com.google.appengine.api.backends.BackendServiceFactory;
7937
import com.google.appengine.api.datastore.Text;
8038
import com.google.appengine.api.taskqueue.Queue;
8139
import com.google.appengine.api.taskqueue.QueueFactory;
8240
import com.google.appengine.api.taskqueue.TaskOptions;
8341
import com.google.appengine.api.utils.SystemProperty;
42+
import org.apache.commons.lang.StringEscapeUtils;
43+
import org.apache.log4j.Logger;
44+
import org.waterforpeople.mapping.app.web.dto.SurveyAssemblyRequest;
45+
import org.waterforpeople.mapping.dao.SurveyContainerDao;
46+
47+
import javax.servlet.http.HttpServletRequest;
48+
import javax.servlet.http.HttpServletResponse;
49+
import javax.xml.bind.JAXBException;
50+
import java.io.ByteArrayOutputStream;
51+
import java.io.IOException;
52+
import java.util.*;
8453

8554
public class SurveyAssemblyServlet extends AbstractRestApiServlet {
8655
private static final Logger log = Logger
@@ -156,7 +125,6 @@ protected RestResponse handleRequest(RestRequest req) throws Exception {
156125
.getQueue("surveyAssembly");
157126
queue.add(options);
158127
} else {
159-
// assembleSurvey(importReq.getSurveyId());
160128
assembleSurveyOnePass(importReq.getSurveyId());
161129
}
162130

@@ -295,6 +263,7 @@ private void assembleSurveyOnePass(Long surveyId) {
295263
String surveyGroupId = "";
296264
String surveyGroupName = "";
297265
String registrationForm = "";
266+
String surveyIdKeyValue = "surveyId=\""+surveyId+"\"";
298267
if (sg != null) {
299268
surveyGroupId = "surveyGroupId=\"" + sg.getKey().getId() + "\"";
300269
surveyGroupName = "surveyGroupName=\"" + StringEscapeUtils.escapeXml(sg.getCode())
@@ -307,7 +276,8 @@ private void assembleSurveyOnePass(Long surveyId) {
307276
String surveyHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><survey"
308277
+ " name=\"" + StringEscapeUtils.escapeXml(name)
309278
+ "\"" + " defaultLanguageCode=\"" + lang + "\" " + versionAttribute + " " + app
310-
+ registrationForm + " " + surveyGroupId + " " + surveyGroupName + ">";
279+
+ registrationForm + " " + surveyGroupId + " " + surveyGroupName + " "
280+
+ surveyIdKeyValue + ">";
311281
String surveyFooter = "</survey>";
312282
QuestionGroupDao qgDao = new QuestionGroupDao();
313283
TreeMap<Integer, QuestionGroup> qgList = qgDao

GAE/src/org/waterforpeople/mapping/domain/response/FormInstance.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@
1313
*
1414
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
1515
*/
16+
1617
package org.waterforpeople.mapping.domain.response;
1718

1819
import java.util.List;
1920

2021
public class FormInstance {
21-
private long formId;
22+
private String formId;
2223
private long submissionDate;
2324
private long duration;
2425
private String uuid;
@@ -44,11 +45,11 @@ public void setUsername(String username) {
4445
this.username = username;
4546
}
4647

47-
public long getFormId() {
48+
public String getFormId() {
4849
return formId;
4950
}
5051

51-
public void setFormId(long formId) {
52+
public void setFormId(String formId) {
5253
this.formId = formId;
5354
}
5455

@@ -99,5 +100,5 @@ public long getDuration() {
99100
public void setDuration(long duration) {
100101
this.duration = duration;
101102
}
102-
103-
}
103+
104+
}

0 commit comments

Comments
 (0)