[
https://issues.apache.org/jira/browse/FINERACT-1037?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17160685#comment-17160685
]
Michael Vorburger commented on FINERACT-1037:
---------------------------------------------
[~ptuomola] thanks for your work on reproducing, analysing and proposing a fix
for this!
> In that case, your database contains a reference to an uploaded file
but... IMHO in that case your work here really has unveiled a slightly bigger
architectural issue (bug)... I'm not super familiar with the functionality, and
haven't looked through the code, but just from reading your comments here, I
kind of gather that somehow we let users upload XLS, store this presumably
using {{java.io.File}} on "the local filesystem", then put a reference to that
file path into the database, which is then... somehow read and re-used later
for other requests - am I (roughly) getting this about right here? That....
won't really properly work in clustered production anyway, no? Should all this
stuff instead better also be using that
{{documentmanagement.contentrepository}} sub-system, see FINERACT-1035 and
FINERACT-955??
PS: Or am I getting this all wrong, and this error is "just" more of a
temporary issue, e.g. because on fineract.dev people have, apparently, explored
changing the system configuration from the file-based contentrepository to the
AWS one and now the database contains a mix of references? (Again, I'm not
super familiar with the exact itnernal details here.) Then perhaps that's a
reason to implement FINERACT-1092 some day.
> FileNotFoundException:
> /home/tomcat/.fineract/DefaultDemoTenant/documents/CLIENTS_PERSON/null/sf5694ypszb/something.xls
> -----------------------------------------------------------------------------------------------------------------------
>
> Key: FINERACT-1037
> URL: https://issues.apache.org/jira/browse/FINERACT-1037
> Project: Apache Fineract
> Issue Type: Bug
> Reporter: Michael Vorburger
> Assignee: Petri Tuomola
> Priority: Blocker
>
> See FINERACT-932 for general background; I'm currently seeing this in logs of
> https://www.fineract.dev:
> {noformat}java.io.FileNotFoundException:
> /home/tomcat/.fineract/DefaultDemoTenant/documents/CLIENTS_PERSON/null/sf5694ypszb/CLIENTS_PERSON2020-05-06
> (1).xls (No such file or directory)
> at java.io.FileInputStream.open0 (Native Method)
> at java.io.FileInputStream.open (FileInputStream.java:219)
> at java.io.FileInputStream.<init> (FileInputStream.java:157)
> at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo
> (FileProvider.java:101)
> at com.sun.jersey.core.impl.provider.entity.FileProvider.writeTo
> (FileProvider.java:64)
> at com.sun.jersey.spi.container.ContainerResponse.write
> (ContainerResponse.java:302)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest
> (WebApplicationImpl.java:1510)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest
> (WebApplicationImpl.java:1419)
> at
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest
> (WebApplicationImpl.java:1409)
> at com.sun.jersey.spi.container.servlet.WebComponent.service
> (WebComponent.java:409)
> at com.sun.jersey.spi.container.servlet.ServletContainer.service
> (ServletContainer.java:558)
> at com.sun.jersey.spi.container.servlet.ServletContainer.service
> (ServletContainer.java:733)
> at javax.servlet.http.HttpServlet.service (HttpServlet.java:741)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:231)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at org.apache.tomcat.websocket.server.WsFilter.doFilter
> (WsFilter.java:53)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke
> (FilterSecurityInterceptor.java:115)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter
> (FilterSecurityInterceptor.java:90)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:320)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke
> (FilterSecurityInterceptor.java:115)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter
> (FilterSecurityInterceptor.java:90)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.access.ExceptionTranslationFilter.doFilter
> (ExceptionTranslationFilter.java:118)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter
> (AnonymousAuthenticationFilter.java:111)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter
> (SecurityContextHolderAwareRequestFilter.java:158)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.apache.fineract.infrastructure.security.filter.InsecureTwoFactorAuthenticationFilter.doFilter
> (InsecureTwoFactorAuthenticationFilter.java:78)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:113)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:113)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:113)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter
> (SecurityContextPersistenceFilter.java:82)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter
> (ChannelProcessingFilter.java:157)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at org.springframework.security.web.FilterChainProxy.doFilterInternal
> (FilterChainProxy.java:215)
> at org.springframework.security.web.FilterChainProxy.doFilter
> (FilterChainProxy.java:186)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:320)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke
> (FilterSecurityInterceptor.java:126)
> at
> org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter
> (FilterSecurityInterceptor.java:90)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.access.ExceptionTranslationFilter.doFilter
> (ExceptionTranslationFilter.java:118)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter
> (AnonymousAuthenticationFilter.java:111)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter
> (SecurityContextHolderAwareRequestFilter.java:158)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.apache.fineract.infrastructure.security.filter.InsecureTwoFactorAuthenticationFilter.doFilter
> (InsecureTwoFactorAuthenticationFilter.java:78)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter
> (HeaderWriterFilter.java:92)
> at
> org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal
> (HeaderWriterFilter.java:77)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal
> (WebAsyncManagerIntegrationFilter.java:56)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal
> (BasicAuthenticationFilter.java:204)
> at
> org.apache.fineract.infrastructure.security.filter.TenantAwareBasicAuthenticationFilter.doFilterInternal
> (TenantAwareBasicAuthenticationFilter.java:145)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter
> (SecurityContextPersistenceFilter.java:105)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at
> org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter
> (ChannelProcessingFilter.java:157)
> at
> org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter
> (FilterChainProxy.java:334)
> at org.springframework.security.web.FilterChainProxy.doFilterInternal
> (FilterChainProxy.java:215)
> at org.springframework.security.web.FilterChainProxy.doFilter
> (FilterChainProxy.java:178)
> at
> org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate
> (DelegatingFilterProxy.java:358)
> at org.springframework.web.filter.DelegatingFilterProxy.doFilter
> (DelegatingFilterProxy.java:271)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal
> (WebMvcMetricsFilter.java:109)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal
> (CharacterEncodingFilter.java:201)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at
> org.springframework.web.filter.ForwardedHeaderFilter.doFilterInternal
> (ForwardedHeaderFilter.java:158)
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
> (OncePerRequestFilter.java:119)
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
> (ApplicationFilterChain.java:193)
> at org.apache.catalina.core.ApplicationFilterChain.doFilter
> (ApplicationFilterChain.java:166)
> at org.apache.catalina.core.StandardWrapperValve.invoke
> (StandardWrapperValve.java:202)
> at org.apache.catalina.core.StandardContextValve.invoke
> (StandardContextValve.java:96)
> at org.apache.catalina.authenticator.AuthenticatorBase.invoke
> (AuthenticatorBase.java:541)
> at org.apache.catalina.core.StandardHostValve.invoke
> (StandardHostValve.java:139)
> at org.apache.catalina.valves.ErrorReportValve.invoke
> (ErrorReportValve.java:92)
> at org.apache.catalina.core.StandardEngineValve.invoke
> (StandardEngineValve.java:74)
> at org.apache.catalina.connector.CoyoteAdapter.service
> (CoyoteAdapter.java:343)
> at org.apache.coyote.http11.Http11Processor.service
> (Http11Processor.java:373)
> at org.apache.coyote.AbstractProcessorLight.process
> (AbstractProcessorLight.java:65)
> at org.apache.coyote.AbstractProtocol$ConnectionHandler.process
> (AbstractProtocol.java:868)
> at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun
> (NioEndpoint.java:1590)
> at org.apache.tomcat.util.net.SocketProcessorBase.run
> (SocketProcessorBase.java:49)
> at java.util.concurrent.ThreadPoolExecutor.runWorker
> (ThreadPoolExecutor.java:1128)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run
> (ThreadPoolExecutor.java:628)
> at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run
> (TaskThread.java:61)
> at java.lang.Thread.run (Thread.java:834){noformat}
> The stack trace doesn't make it super clear exactly where in Fineract this is
> coming from...
> If I had to guess, it would be that we have a (or several?) REST Resource
> classes that accept a POST file upload ("multi-part" ?) and attempts to write
> it into a directory which... perhaps does not exist? Something somewhere
> should have created the missing parent directories?
--
This message was sent by Atlassian Jira
(v8.3.4#803005)