Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c9dd17f authored by cketti's avatar cketti
Browse files

Add command line application to sanitize HTML files

This can be used to test what HTML messages will look like after K-9 Mail's sanitization process.
parent 362ecae2
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
```text
Usage: html-cleaner [OPTIONS] INPUT [OUTPUT]

  A tool that modifies HTML to only keep allowed elements and attributes the
  same way that K-9 Mail does.

Options:
  -h, --help  Show this message and exit

Arguments:
  INPUT   HTML input file (needs to be UTF-8 encoded)
  OUTPUT  Output file
```

You can run this tool using the [html-cleaner](../../html-cleaner) script in the root directory of this repository. 
It will compile the application and then run it using the given arguments. This allows you to make modifications to the
[HTML cleaning code](../../app/html-cleaner/src/main/java/app/k9mail/html/cleaner) and test the changes right away.
+20 −0
Original line number Diff line number Diff line
apply plugin: 'org.jetbrains.kotlin.jvm'
apply plugin: 'application'

version 'unspecified'

application {
    mainClass = "app.k9mail.cli.html.cleaner.MainKt"
}

repositories {
    mavenCentral()
}

dependencies {
    implementation project(':app:html-cleaner')

    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    implementation "com.github.ajalt.clikt:clikt:3.4.0"
    implementation "com.squareup.okio:okio:${versions.okio}"
}
+55 −0
Original line number Diff line number Diff line
package app.k9mail.cli.html.cleaner

import app.k9mail.html.cleaner.HtmlHeadProvider
import app.k9mail.html.cleaner.HtmlProcessor
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.arguments.optional
import com.github.ajalt.clikt.parameters.types.file
import com.github.ajalt.clikt.parameters.types.inputStream
import java.io.File
import okio.buffer
import okio.sink
import okio.source

@Suppress("MemberVisibilityCanBePrivate")
class HtmlCleaner : CliktCommand(
    help = "A tool that modifies HTML to only keep allowed elements and attributes the same way that K-9 Mail does."
) {
    val input by argument(help = "HTML input file (needs to be UTF-8 encoded)")
        .inputStream()

    val output by argument(help = "Output file")
        .file(mustExist = false, canBeDir = false)
        .optional()

    override fun run() {
        val html = readInput()
        val processedHtml = cleanHtml(html)
        writeOutput(processedHtml)
    }

    private fun readInput(): String {
        return input.source().buffer().use { it.readUtf8() }
    }

    private fun cleanHtml(html: String): String {
        val htmlProcessor = HtmlProcessor(object : HtmlHeadProvider {
            override val headHtml = """<meta name="viewport" content="width=device-width"/>"""
        })

        return htmlProcessor.processForDisplay(html)
    }

    private fun writeOutput(data: String) {
        output?.writeOutput(data) ?: echo(data)
    }

    private fun File.writeOutput(data: String) {
        sink().buffer().use {
            it.writeUtf8(data)
        }
    }
}

fun main(args: Array<String>) = HtmlCleaner().main(args)

html-cleaner

0 → 100755
+3 −0
Original line number Diff line number Diff line
#!/bin/sh

./gradlew --quiet ":cli:html-cleaner-cli:installDist" < /dev/null && ./cli/html-cleaner-cli/build/install/html-cleaner-cli/bin/html-cleaner-cli "$@"
+1 −0
Original line number Diff line number Diff line
@@ -25,3 +25,4 @@ include ':backend:webdav'
include ':backend:jmap'
include ':backend:demo'
include ':plugins:openpgp-api-lib:openpgp-api'
include ':cli:html-cleaner-cli'