Librum-Reader / Librum-Server

The Librum server
https://librumreader.com
GNU Affero General Public License v3.0
302 stars 22 forks source link

Access to the path '/librum_storage' is denied. Prevents login. #20

Closed tenekev closed 11 months ago

tenekev commented 11 months ago

I'm using Docker to deploy Librum server. I'm using the latest windows client on Win11. The latest version introduces this error. I'm assuming the /librum_storage path is the one defined in the docker-compose.yml

    volumes:
      - librum:/var/lib/librum-server/librum_storage

I checked the container, the folder is there, the permissions are correct. This error appears only when a client tries to connect to the server and ultimately fails with a generic fail message.

Server log:

fail: Application.Common.Middleware.ExceptionHandlingMiddleware[0]
      Access to the path '/librum_storage' is denied.
      System.UnauthorizedAccessException: Access to the path '/librum_storage' is denied.
       ---> System.IO.IOException: Permission denied
         --- End of inner exception stack trace ---
         at System.IO.FileSystem.CreateDirectory(String fullPath, UnixFileMode unixCreateMode)
         at System.IO.Directory.CreateDirectory(String path)
         at Application.Managers.UserLocalStorageManager..ctor() in /app/src/Application/Managers/UserLocalStorageManager.cs:line 19
         at InvokeStub_UserLocalStorageManager..ctor(Object, Object, IntPtr*)
         at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite callSite, RuntimeResolverContext context)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
         at lambda_method304(Closure, IServiceProvider, Object[])
         at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
      --- End of stack trace from previous location ---
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
      --- End of stack trace from previous location ---
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
         at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
         at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
         at Application.Common.Middleware.ExceptionHandlingMiddleware.InvokeAsync(HttpContext context) in /app/src/Application/Common/Middleware/ExceptionHandlingMiddleware.cs:line 30

Client log

2023-12-19 | 13:09:54.751 | Warning   |                    in '          ' at line: 0 | "Getting User failed (500): {\"StatusCode\":500,\"Message\":\"An error occured\",\"StackTrace\":null}"
asisdrico commented 11 months ago

The server expects the storage at /librum-storage and not at /var/lib/librum-server/librum_storage as confirgured in the docker-compose.yaml.

So changing the volume to:

 volumes:
      - librum:/librum_storage

solves this issue for me.

3036662 commented 11 months ago

The problem is dotnet tries to resolve app home directory, when it fails, it will look for /librum_storage in root, i'll make a fix.

DavidLazarescu commented 11 months ago

Please confirm that #23 fixed this issue.

tenekev commented 11 months ago

I can confirm it fixed the issue for me. Thanks you.