~jan0sch/smederee

Showing details for patch 4fe46815c73d11830c4afedab22d332e734eb00b.
2022-08-11 (Thu), 1:05 PM - Jens Grassel - 4fe46815c73d11830c4afedab22d332e734eb00b

VCS: Implement maximum file size check

Summary of changes
1 files modified with 11 lines added and 4 lines removed
  • modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala with 11 added and 4 removed lines
diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala
--- old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala	2025-02-02 16:45:10.729815608 +0000
+++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala	2025-02-02 16:45:10.729815608 +0000
@@ -40,7 +40,8 @@
     extends Http4sDsl[F] {
   private val log = LoggerFactory.getLogger(getClass)
 
-  private val createRepoPath = uri"/repo/create"
+  private val createRepoPath  = uri"/repo/create"
+  private val MaximumFileSize = 131072L // TODO Move to configuration directive.
 
   /** List walk the given directory at the first level and return all found files and directories and their
     * stats sorted by directory first and by name second. If the given path is _not_ a directory then no
@@ -238,9 +239,15 @@
             listFiles(requestedFilePath)
         content <-
           if (viewFile)
-            Sync[F].delay(
-              os.read.lines(requestedFilePath)
-            ) // FIXME Use streaming and max size to avoid flooding memory with large files.
+            for {
+              size <- Sync[F].delay(os.size(requestedFilePath))
+              stream <-
+                if (size <= MaximumFileSize)
+                  Sync[F].delay(os.read.lines.stream(requestedFilePath))
+                else
+                  Sync[F].delay(os.Generator("File is too big!"))
+              lines <- Sync[F].delay(stream.toVector)
+            } yield lines
           else
             Sync[F].delay(IndexedSeq.empty)
         fileContent <- Sync[F].delay {