1 package net.pterodactylus.sone.web.ajax
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
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.
18 abstract class JsonPage(private val path: String, protected val webInterface: WebInterface) : Page<FreenetRequest> {
20 private val objectMapper = ObjectMapper()
21 private val sessionProvider: SessionProvider = webInterface
23 override fun getPath() = path
24 override fun isPrefixPage() = false
26 open fun needsFormPassword() = true
27 open fun requiresLogin() = true
29 protected fun createSuccessJsonObject() = JsonReturnObject(true)
30 protected fun createErrorJsonObject(error: String) =
31 JsonErrorReturnObject(error)
33 protected fun getCurrentSone(toadletContext: ToadletContext, createSession: Boolean = true) =
34 sessionProvider.getCurrentSone(toadletContext, createSession)
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())
40 if (needsFormPassword() && request.parameters["formPassword"] != webInterface.formPassword) {
41 return response.setStatusCode(403).setStatusText("Forbidden").setContentType("application/json").write(createErrorJsonObject("auth-required").asJsonString())
43 if (requiresLogin() && (sessionProvider.getCurrentSone(request.toadletContext, false) == null)) {
44 return response.setStatusCode(403).setStatusText("Forbidden").setContentType("application/json").write(createErrorJsonObject("auth-required").asJsonString())
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())
53 abstract fun createJsonObject(request: FreenetRequest): JsonReturnObject
55 private fun JsonReturnObject.asJsonString(): String = objectMapper.writeValueAsString(this)
57 private fun Throwable.dumpStackTrace(): String = ByteArrayOutputStream().use {
58 PrintStream(it, true, "UTF-8").use {
59 this.printStackTrace(it)