Skip to content

Commit d5391bd

Browse files
authored
Merge pull request #340 from AtlasOfLivingAustralia/feature/3711-fieldcapture
Feature/3711 fieldcapture
2 parents e3ef18f + bc3dbd2 commit d5391bd

File tree

4 files changed

+50
-17
lines changed

4 files changed

+50
-17
lines changed

grails-app/assets/javascripts/forms-knockout-bindings.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@
104104

105105
}).on('fileuploadfail', function(e, data) {
106106
var jqXHR = data.jqXHR;
107-
if (jqXHR && jqXHR.status === 422) {
108-
var resp = jqXHR.responseJSON || {message: "File upload could not be processed. Possible virus detected."};
109-
error(resp.message);
107+
if (jqXHR && (jqXHR.status === 422 || jqXHR.status === 500)) {
108+
var resp = jqXHR.responseJSON || {};
109+
error(resp.message || jqXHR.responseText || 'File upload failed');
110110
}
111111
else {
112112
error(data.errorThrown);
@@ -228,9 +228,9 @@
228228

229229
}).on(eventPrefix+'fail', function(e, data) {
230230
var jqXHR = data.jqXHR;
231-
if (jqXHR && jqXHR.status === 422) {
232-
var resp = jqXHR.responseJSON || {message: "File upload could not be processed. Possible virus detected."};
233-
error(resp.message);
231+
if (jqXHR && (jqXHR.status === 422 || jqXHR.status === 500)) {
232+
var resp = jqXHR.responseJSON || {};
233+
error(resp.message || jqXHR.responseText || 'File upload failed');
234234
}
235235
else {
236236
error(data.errorThrown);

grails-app/controllers/au/org/ala/merit/FileScanInterceptor.groovy

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,29 @@ class FileScanInterceptor {
1414

1515
boolean before() {
1616
if (request.respondsTo('getFile')) {
17-
boolean clean = true
17+
List statusCodes = []
1818
def files = request.getFileNames()
1919
while(files.hasNext()) {
2020
def fileName = files.next()
2121
def file = request.getFile(fileName)
2222
if (file) {
23-
boolean isClean = scanService.isDocumentClean(file)
24-
clean &= isClean
23+
statusCodes << scanService.getDocumentScanStatus(file)
2524
}
2625
}
2726

28-
if (!clean) {
27+
if (statusCodes.any { it == HttpStatus.SC_UNPROCESSABLE_ENTITY }) {
2928
response.status = HttpStatus.SC_UNPROCESSABLE_ENTITY
3029
render contentType: 'application/json', text: [success: false, message: "File upload rejected: virus detected"] as JSON, status: HttpStatus.SC_UNPROCESSABLE_ENTITY
3130
return false
3231
}
32+
else if (statusCodes.every { it == HttpStatus.SC_OK }) {
33+
return true
34+
}
35+
else {
36+
response.status = HttpStatus.SC_INTERNAL_SERVER_ERROR
37+
render contentType: 'application/json', text: [success: false, message: "File upload failed during scanning"] as JSON, status: HttpStatus.SC_INTERNAL_SERVER_ERROR
38+
return false
39+
}
3340
}
3441

3542
true
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package au.org.ala.ecodata.forms
22

3-
3+
import org.springframework.http.HttpStatus
44
import org.springframework.web.multipart.MultipartFile
55

66
class ScanService {
77
EcpWebService ecpWebService
88
def grailsApplication
99

10-
boolean isDocumentClean(MultipartFile file) {
10+
int getDocumentScanStatus(MultipartFile file) {
1111
if (file == null) {
12-
return true
12+
return HttpStatus.OK.value()
1313
}
1414

1515
if (grailsApplication.config.getProperty('scanFile.enabled', Boolean, true)) {
@@ -20,9 +20,9 @@ class ScanService {
2020

2121
baseUrl = baseUrl.replaceAll("/ws", '/reporting/ws')
2222
def result = ecpWebService.postMultipart("${baseUrl}/document/scanDocument", [:], file, "fileToScan", true)
23-
return result.statusCode == org.springframework.http.HttpStatus.OK.value()
23+
return result.statusCode
2424
}
2525

26-
return true
26+
return HttpStatus.OK.value()
2727
}
2828
}

src/test/groovy/au/org/ala/merit/FileScanInterceptorSpec.groovy

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import org.springframework.http.HttpStatus
88
import spock.lang.Specification
99

1010
class FileScanInterceptorSpec extends Specification implements InterceptorUnitTest<FileScanInterceptor> {
11-
def scanService, webService = Mock(EcpWebService)
11+
def scanService, webService
1212

1313
def setup() {
1414
interceptor.scanService = scanService = new ScanService()
15-
scanService.ecpWebService = webService
15+
scanService.ecpWebService = Mock(EcpWebService)
16+
webService = scanService.ecpWebService
1617
scanService.grailsApplication = grailsApplication
1718
}
1819

@@ -76,4 +77,29 @@ class FileScanInterceptorSpec extends Specification implements InterceptorUnitTe
7677
2 * webService.postMultipart(*_) >> [statusCode: HttpStatus.UNPROCESSABLE_ENTITY.value()]
7778
response.status == 422
7879
}
80+
81+
void "interceptor should handle multiple failed file scan results"() {
82+
given:
83+
def controller = (PreviewController) mockController(PreviewController)
84+
def cleanFile = Mock(org.springframework.web.multipart.MultipartFile)
85+
cleanFile.name >> "clean"
86+
cleanFile.originalFilename >> "clean.txt"
87+
cleanFile.inputStream >> new ByteArrayInputStream("clean file content".bytes)
88+
def corruptFile = Mock(org.springframework.web.multipart.MultipartFile)
89+
corruptFile.name >> "corrupt"
90+
corruptFile.originalFilename >> "corrupt.txt"
91+
corruptFile.inputStream >> new ByteArrayInputStream("corrupt file content".bytes)
92+
request.getFileNames() >> ['clean.txt', 'corrupt.txt'].iterator()
93+
request.addFile(cleanFile)
94+
request.addFile(corruptFile)
95+
96+
when:
97+
def result = withInterceptors(controller: PreviewController) {
98+
controller.prepopulateConstraints()
99+
}
100+
101+
then:
102+
2 * scanService.ecpWebService.postMultipart(*_) >> [statusCode: HttpStatus.INTERNAL_SERVER_ERROR.value()]
103+
response.status == 500
104+
}
79105
}

0 commit comments

Comments
 (0)