show only Book filename instead of full path to non-admin users

hide Series url to non-admin users
 properly escape characters for Series url
This commit is contained in:
Gauthier Roebroeck 2019-12-19 12:40:59 +08:00
parent 37fa1d0719
commit 42d63919c5
4 changed files with 16 additions and 13 deletions

View file

@ -57,6 +57,8 @@ class KomgaUser(
field = if (roles.contains(UserRoles.ADMIN)) true else value
}
fun isAdmin() = roles.contains(UserRoles.ADMIN)
fun canAccessBook(book: Book): Boolean {
return sharedAllLibraries || sharedLibraries.any { it.id == book.series.library.id }
}

View file

@ -85,7 +85,7 @@ class BookController(
} else {
bookRepository.findAll(pageRequest)
}
}.map { it.toDto() }
}.map { it.toDto(includeFullUrl = principal.user.isAdmin()) }
}
@ -104,7 +104,7 @@ class BookController(
bookRepository.findAll(pageRequest)
} else {
bookRepository.findBySeriesLibraryIn(principal.user.sharedLibraries, pageRequest)
}.map { it.toDto() }
}.map { it.toDto(includeFullUrl = principal.user.isAdmin()) }
}
@ -123,7 +123,7 @@ class BookController(
): BookDto =
bookRepository.findByIdOrNull(bookId)?.let {
if (!principal.user.canAccessBook(it)) throw ResponseStatusException(HttpStatus.UNAUTHORIZED)
it.toDto()
it.toDto(includeFullUrl = principal.user.isAdmin())
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)

View file

@ -1,6 +1,7 @@
package org.gotson.komga.interfaces.web.rest
import com.fasterxml.jackson.annotation.JsonFormat
import org.apache.commons.io.FilenameUtils
import org.gotson.komga.domain.model.Book
import org.gotson.komga.domain.model.Series
import java.time.LocalDateTime
@ -17,11 +18,11 @@ data class SeriesDto(
val booksCount: Int
)
fun Series.toDto() = SeriesDto(
fun Series.toDto(includeUrl: Boolean) = SeriesDto(
id = id,
libraryId = library.id,
name = name,
url = url.toString(),
url = if (includeUrl) url.toURI().path else "",
lastModified = lastModifiedDate?.toUTC(),
booksCount = books.size
)
@ -45,12 +46,12 @@ data class BookMetadataDto(
val pagesCount: Int
)
fun Book.toDto() =
fun Book.toDto(includeFullUrl: Boolean) =
BookDto(
id = id,
seriesId = series.id,
name = name,
url = url.toURI().path,
url = if (includeFullUrl) url.toURI().path else FilenameUtils.getName(url.toURI().path),
number = number,
lastModified = lastModifiedDate?.toUTC(),
sizeBytes = fileSize,

View file

@ -76,7 +76,7 @@ class SeriesController(
} else {
seriesRepository.findAll(pageRequest)
}
}.map { it.toDto() }
}.map { it.toDto(includeUrl = principal.user.isAdmin()) }
}
// all updated series, whether newly added or updated
@ -95,7 +95,7 @@ class SeriesController(
seriesRepository.findAll(pageRequest)
} else {
seriesRepository.findByLibraryIn(principal.user.sharedLibraries, pageRequest)
}.map { it.toDto() }
}.map { it.toDto(includeUrl = principal.user.isAdmin()) }
}
// new series only, doesn't contain existing updated series
@ -114,7 +114,7 @@ class SeriesController(
seriesRepository.findAll(pageRequest)
} else {
seriesRepository.findByLibraryIn(principal.user.sharedLibraries, pageRequest)
}.map { it.toDto() }
}.map { it.toDto(includeUrl = principal.user.isAdmin()) }
}
// updated series only, doesn't contain new series
@ -133,7 +133,7 @@ class SeriesController(
seriesRepository.findRecentlyUpdated(pageRequest)
} else {
seriesRepository.findRecentlyUpdatedByLibraryIn(principal.user.sharedLibraries, pageRequest)
}.map { it.toDto() }
}.map { it.toDto(includeUrl = principal.user.isAdmin()) }
}
@GetMapping("{seriesId}")
@ -143,7 +143,7 @@ class SeriesController(
): SeriesDto =
seriesRepository.findByIdOrNull(id)?.let {
if (!principal.user.canAccessSeries(it)) throw ResponseStatusException(HttpStatus.UNAUTHORIZED)
it.toDto()
it.toDto(includeUrl = principal.user.isAdmin())
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
@GetMapping(value = ["{seriesId}/thumbnail"], produces = [MediaType.IMAGE_JPEG_VALUE])
@ -186,6 +186,6 @@ class SeriesController(
bookRepository.findAllByMetadataStatusAndSeriesId(BookMetadata.Status.READY, id, pageRequest)
} else {
bookRepository.findAllBySeriesId(id, pageRequest)
}.map { it.toDto() }
}.map { it.toDto(includeFullUrl = principal.user.isAdmin()) }
}
}