1 package net.pterodactylus.sone.web.pages
3 import freenet.support.api.Bucket
4 import net.pterodactylus.sone.data.Sone
5 import net.pterodactylus.sone.text.TextFilter
6 import net.pterodactylus.sone.utils.emptyToNull
7 import net.pterodactylus.sone.utils.headers
8 import net.pterodactylus.sone.utils.isPOST
9 import net.pterodactylus.sone.utils.parameters
10 import net.pterodactylus.sone.utils.use
11 import net.pterodactylus.sone.web.WebInterface
12 import net.pterodactylus.sone.web.page.FreenetRequest
13 import net.pterodactylus.util.template.Template
14 import net.pterodactylus.util.template.TemplateContext
15 import java.awt.image.BufferedImage
16 import java.io.ByteArrayInputStream
17 import java.io.ByteArrayOutputStream
18 import javax.imageio.ImageIO
19 import javax.inject.Inject
22 * Page implementation that lets the user upload an image.
24 class UploadImagePage @Inject constructor(template: Template, webInterface: WebInterface):
25 LoggedInPage("uploadImage.html", template, "Page.UploadImage.Title", webInterface) {
27 override fun handleRequest(freenetRequest: FreenetRequest, currentSone: Sone, templateContext: TemplateContext) {
28 if (freenetRequest.isPOST) {
29 val parentAlbum = freenetRequest.parameters["parent"]!!.let(webInterface.core::getAlbum) ?: throw RedirectException("noPermission.html")
30 if (parentAlbum.sone != currentSone) {
31 throw RedirectException("noPermission.html")
33 val title = freenetRequest.parameters["title", 200].emptyToNull ?: throw RedirectException("emptyImageTitle.html")
35 val uploadedFile = freenetRequest.httpRequest.getUploadedFile("image")
36 val bytes = uploadedFile.data.use { it.toByteArray() }
37 val bufferedImage = bytes.toImage()
38 if (bufferedImage == null) {
39 templateContext["messages"] = webInterface.l10n.getString("Page.UploadImage.Error.InvalidImage")
43 val temporaryImage = webInterface.core.createTemporaryImage(bytes.mimeType, bytes)
44 webInterface.core.createImage(currentSone, parentAlbum, temporaryImage).modify().apply {
45 setWidth(bufferedImage.width)
46 setHeight(bufferedImage.height)
48 setDescription(TextFilter.filter(freenetRequest.headers["Host"], freenetRequest.parameters["description", 4000]))
50 throw RedirectException("imageBrowser.html?album=${parentAlbum.id}")
54 private fun Bucket.toByteArray(): ByteArray = ByteArrayOutputStream(size().toInt()).use { outputStream ->
55 inputStream.copyTo(outputStream)
56 outputStream.toByteArray()
59 private fun ByteArray.toImage(): BufferedImage? = ByteArrayInputStream(this).use {
63 private val ByteArray.mimeType get() = ByteArrayInputStream(this).use {
64 ImageIO.createImageInputStream(it).use {
65 ImageIO.getImageReaders(it).asSequence()
66 .firstOrNull()?.originatingProvider?.mimeTypes?.firstOrNull()
73 private const val UNKNOWN_MIME_TYPE = "application/octet-stream"