Replace ajax base page with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / JsonPage.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import com.fasterxml.jackson.databind.ObjectMapper
4 import freenet.clients.http.ToadletContext
5 import net.pterodactylus.sone.utils.parameters
6 import net.pterodactylus.sone.web.SessionProvider
7 import net.pterodactylus.sone.web.WebInterface
8 import net.pterodactylus.sone.web.page.FreenetRequest
9 import net.pterodactylus.util.web.Page
10 import net.pterodactylus.util.web.Response
11 import java.io.ByteArrayOutputStream
12 import java.io.PrintStream
13
14 /**
15  * A JSON page is a specialized [Page] that will always return a JSON
16  * object to the browser, e.g. for use with AJAX or other scripting frameworks.
17  */
18 abstract class JsonPage(private val path: String, protected val webInterface: WebInterface) : Page<FreenetRequest> {
19
20         private val objectMapper = ObjectMapper()
21         private val sessionProvider: SessionProvider = webInterface
22
23         override fun getPath() = path
24         override fun isPrefixPage() = false
25
26         open fun needsFormPassword() = true
27         open fun requiresLogin() = true
28
29         protected fun createSuccessJsonObject() = JsonReturnObject(true)
30         protected fun createErrorJsonObject(error: String) =
31                         JsonErrorReturnObject(error)
32
33         protected fun getCurrentSone(toadletContext: ToadletContext, createSession: Boolean = true) =
34                         sessionProvider.getCurrentSone(toadletContext, createSession)
35
36         override fun handleRequest(request: FreenetRequest, response: Response): Response {
37                 if (webInterface.core.preferences.isRequireFullAccess && !request.toadletContext.isAllowedFullAccess) {
38                         return response.setStatusCode(403).setStatusText("Forbidden").setContentType("application/json").write(createErrorJsonObject("auth-required").asJsonString())
39                 }
40                 if (needsFormPassword() && request.parameters["formPassword"] != webInterface.formPassword) {
41                         return response.setStatusCode(403).setStatusText("Forbidden").setContentType("application/json").write(createErrorJsonObject("auth-required").asJsonString())
42                 }
43                 if (requiresLogin() && (sessionProvider.getCurrentSone(request.toadletContext, false) == null)) {
44                         return response.setStatusCode(403).setStatusText("Forbidden").setContentType("application/json").write(createErrorJsonObject("auth-required").asJsonString())
45                 }
46                 return try {
47                         response.setStatusCode(200).setStatusText("OK").setContentType("application/json").write(createJsonObject(request).asJsonString())
48                 } catch (e: Exception) {
49                         response.setStatusCode(500).setStatusText(e.message).setContentType("text/plain").write(e.dumpStackTrace())
50                 }
51         }
52
53         abstract fun createJsonObject(request: FreenetRequest): JsonReturnObject
54
55         private fun JsonReturnObject.asJsonString(): String = objectMapper.writeValueAsString(this)
56
57         private fun Throwable.dumpStackTrace(): String = ByteArrayOutputStream().use {
58                 PrintStream(it, true, "UTF-8").use {
59                         this.printStackTrace(it)
60                 }
61                 it.toString("UTF-8")
62         }
63
64 }