fix(scanner): prevent library deletion when inaccessible

closes #392
This commit is contained in:
Gauthier Roebroeck 2021-01-24 12:58:49 +08:00
parent d35adeaebf
commit 2a262ccad1
2 changed files with 21 additions and 1 deletions

View file

@ -3,6 +3,7 @@ package org.gotson.komga.domain.service
import mu.KotlinLogging
import org.apache.commons.io.FilenameUtils
import org.gotson.komga.domain.model.Book
import org.gotson.komga.domain.model.DirectoryNotFoundException
import org.gotson.komga.domain.model.Series
import org.gotson.komga.infrastructure.configuration.KomgaProperties
import org.springframework.stereotype.Service
@ -16,7 +17,6 @@ import java.nio.file.attribute.BasicFileAttributes
import java.nio.file.attribute.FileTime
import java.time.LocalDateTime
import java.time.ZoneId
import kotlin.io.path.isHidden
import kotlin.streams.asSequence
import kotlin.time.measureTime
@ -35,6 +35,9 @@ class FileSystemScanner(
logger.info { "Excluded patterns: ${komgaProperties.librariesScanDirectoryExclusions}" }
logger.info { "Force directory modified time: $forceDirectoryModifiedTime" }
if(!(Files.isDirectory(root) && Files.isReadable(root)))
throw DirectoryNotFoundException("Library root is not accessible: $root")
lateinit var scannedSeries: Map<Series, List<Book>>
measureTime {

View file

@ -4,8 +4,11 @@ import com.google.common.jimfs.Configuration
import com.google.common.jimfs.Jimfs
import org.apache.commons.io.FilenameUtils
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.catchThrowable
import org.gotson.komga.domain.model.DirectoryNotFoundException
import org.gotson.komga.infrastructure.configuration.KomgaProperties
import org.junit.jupiter.api.Test
import java.lang.Exception
import java.nio.file.Files
import java.nio.file.Path
@ -17,6 +20,20 @@ class FileSystemScannerTest {
private val scanner = FileSystemScanner(komgaProperties)
@Test
fun `given unavailable root directory when scanning then throw exception`() {
Jimfs.newFileSystem(Configuration.unix()).use { fs ->
// given
val root = fs.getPath("/root")
// when
val thrown = catchThrowable { scanner.scanRootFolder(root) }
// then
assertThat(thrown).isInstanceOf(DirectoryNotFoundException::class.java)
}
}
@Test
fun `given empty root directory when scanning then return empty list`() {
Jimfs.newFileSystem(Configuration.unix()).use { fs ->