tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 2d4f36d2806f4526c9302cf548bc0e6567d1a421
parent 3e1707883d30ddbf7d4a3054f3fcb4bf27db4dd1
Author: pstanciu <pstanciu@mozilla.com>
Date:   Tue,  2 Dec 2025 10:48:41 +0200

Revert "Bug 1986995 - Generate the Public Suffix List asset at build time. r=android-reviewers,nalexander,ahochheiden" for causing TL bustages

This reverts commit 185d41ebb5abbbc7d7d3ea4c78e1f6951d72a335.

Diffstat:
Mmobile/android/android-components/components/lib/publicsuffixlist/build.gradle | 17+++++++++--------
Amobile/android/android-components/components/lib/publicsuffixlist/src/main/assets/publicsuffixes | 0
Mmobile/android/android-components/plugins/publicsuffixlist/build.gradle | 4+---
Mmobile/android/android-components/plugins/publicsuffixlist/src/main/java/PublicSuffixListPlugin.kt | 176++++++++++++++++++++++++++++++++++---------------------------------------------
4 files changed, 86 insertions(+), 111 deletions(-)

diff --git a/mobile/android/android-components/components/lib/publicsuffixlist/build.gradle b/mobile/android/android-components/components/lib/publicsuffixlist/build.gradle @@ -3,20 +3,19 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ plugins { - id 'com.android.library' - id 'kotlin-android' id 'mozac.PublicSuffixListPlugin' } -apply from: '../../../common-config.gradle' -apply from: '../../../publish.gradle' +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'mozac.PublicSuffixListPlugin' android { - namespace = 'mozilla.components.lib.publicsuffixlist' -} + buildFeatures { + viewBinding = true + } -publicSuffixList { - sourceFile = file("${gradle.mozconfig.topsrcdir}/netwerk/dns/effective_tld_names.dat") + namespace = 'mozilla.components.lib.publicsuffixlist' } dependencies { @@ -31,4 +30,6 @@ dependencies { testImplementation libs.robolectric } +apply from: '../../../common-config.gradle' +apply from: '../../../publish.gradle' ext.configurePublish(config.componentsGroupId, project.name, project.ext.description) diff --git a/mobile/android/android-components/components/lib/publicsuffixlist/src/main/assets/publicsuffixes b/mobile/android/android-components/components/lib/publicsuffixlist/src/main/assets/publicsuffixes Binary files differ. diff --git a/mobile/android/android-components/plugins/publicsuffixlist/build.gradle b/mobile/android/android-components/plugins/publicsuffixlist/build.gradle @@ -22,13 +22,11 @@ repositories { dependencies { implementation libs.okhttp implementation libs.okio - - compileOnly libs.android.gradle.plugin } gradlePlugin { plugins.register("mozac.PublicSuffixListPlugin") { id = "mozac.PublicSuffixListPlugin" - implementationClass = "mozilla.components.gradle.plugins.PublicSuffixListPlugin" + implementationClass = "PublicSuffixListPlugin" } } diff --git a/mobile/android/android-components/plugins/publicsuffixlist/src/main/java/PublicSuffixListPlugin.kt b/mobile/android/android-components/plugins/publicsuffixlist/src/main/java/PublicSuffixListPlugin.kt @@ -2,110 +2,108 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package mozilla.components.gradle.plugins - -import com.android.build.api.variant.AndroidComponentsExtension -import com.android.build.gradle.LibraryPlugin -import okio.Buffer +import okhttp3.OkHttpClient +import okhttp3.Request import okio.ByteString import okio.ByteString.Companion.encodeUtf8 -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException -import org.gradle.api.InvalidUserDataException +import okio.buffer +import okio.sink import org.gradle.api.Plugin import org.gradle.api.Project -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction import java.io.File import java.util.TreeSet /** - * A self-contained, configuration-cache-compatible Gradle task to generate the Public Suffix List asset. + * Gradle plugin to update the public suffix list used by the `lib-publicsuffixlist` component. + * + * Base on PublicSuffixListGenerator from OkHttp: + * https://github.com/square/okhttp/blob/master/okhttp/src/test/java/okhttp3/internal/publicsuffix/PublicSuffixListGenerator.java */ -abstract class GeneratePslAssetTask : DefaultTask() { +class PublicSuffixListPlugin : Plugin<Project> { + override fun apply(project: Project) { + project.tasks.register("updatePSL") { + doLast { + val filename = project.projectDir.absolutePath + "/src/main/assets/publicsuffixes" + updatePublicSuffixList(filename) + } + } + } + + private fun updatePublicSuffixList(destination: String) { + val list = fetchPublicSuffixList() + writeListToDisk(destination, list) + } + + private fun writeListToDisk(destination: String, data: PublicSuffixListData) { + val fileSink = File(destination).sink() + + fileSink.buffer().use { sink -> + sink.writeInt(data.totalRuleBytes) - @get:InputFile - abstract val sourceFile: RegularFileProperty + for (domain in data.sortedRules) { + sink.write(domain).writeByte('\n'.code) + } - @get:OutputDirectory - abstract val outputDir: DirectoryProperty + sink.writeInt(data.totalExceptionRuleBytes) - @TaskAction - fun generate() { - val source = sourceFile.get().asFile - if (!source.exists()) { - throw GradleException("Public Suffix List source file not found: ${source.absolutePath}") + for (domain in data.sortedExceptionRules) { + sink.write(domain).writeByte('\n'.code) + } } + } - val startTime = System.currentTimeMillis() - logger.info("PublicSuffixList> Executing generatePslAsset: Reading Public Suffix List from ${source.path}") + private fun fetchPublicSuffixList(): PublicSuffixListData { + val client = OkHttpClient.Builder().build() - val listData = parsePublicSuffixList(source) - val newContent = buildBinaryContent(listData) - val destination = outputDir.file("publicsuffixes").get().asFile + val request = Request.Builder() + .url("https://publicsuffix.org/list/public_suffix_list.dat") + .build() - logger.info("PublicSuffixList> Writing new Public Suffix List asset...") - destination.parentFile.mkdirs() - destination.writeBytes(newContent.toByteArray()) + client.newCall(request).execute().use { response -> + val source = response.body!!.source() - val duration = System.currentTimeMillis() - startTime - logger.info("PublicSuffixList> Public Suffix List asset generation complete in ${duration}ms.") - } + val data = PublicSuffixListData() - private fun buildBinaryContent(data: PublicSuffixListData): ByteString { - val buffer = Buffer() - buffer.writeInt(data.totalRuleBytes) - for (domain in data.sortedRules) { - buffer.write(domain).writeByte('\n'.code) - } - buffer.writeInt(data.totalExceptionRuleBytes) - for (domain in data.sortedExceptionRules) { - buffer.write(domain).writeByte('\n'.code) - } - return buffer.readByteString() - } + while (!source.exhausted()) { + val line = source.readUtf8LineStrict() - private fun parsePublicSuffixList(sourceFile: File): PublicSuffixListData { - val data = PublicSuffixListData() - - sourceFile.useLines { lines -> - lines.filter { it.isNotBlank() && !it.startsWith("//") } - .forEach { line -> - if (line.contains(WILDCARD_CHAR)) { - assertWildcardRule(line) - } - - var rule = line.encodeUtf8() - if (rule.startsWith(EXCEPTION_RULE_MARKER)) { - rule = rule.substring(1) - // We use '\n' for end of value. - data.sortedExceptionRules.add(rule) - data.totalExceptionRuleBytes += rule.size + 1 - } else { - data.sortedRules.add(rule) - // We use '\n' for end of value. - data.totalRuleBytes += rule.size + 1 - } + if (line.trim { it <= ' ' }.isEmpty() || line.startsWith("//")) { + continue + } + + if (line.contains(WILDCARD_CHAR)) { + assertWildcardRule(line) } - } - return data + var rule = line.encodeUtf8() + + if (rule.startsWith(EXCEPTION_RULE_MARKER)) { + rule = rule.substring(1) + // We use '\n' for end of value. + data.totalExceptionRuleBytes += rule.size + 1 + data.sortedExceptionRules.add(rule) + } else { + data.totalRuleBytes += rule.size + 1 // We use '\n' for end of value. + data.sortedRules.add(rule) + } + } + + return data + } } - @Suppress("ThrowsCount") + @Suppress("TooGenericExceptionThrown", "ThrowsCount") private fun assertWildcardRule(rule: String) { - if (!rule.startsWith(WILDCARD_CHAR)) { - throw InvalidUserDataException("Wildcard is not in leftmost position") + if (rule.indexOf(WILDCARD_CHAR) != 0) { + throw RuntimeException("Wildcard is not not in leftmost position") } - if (rule.lastIndexOf(WILDCARD_CHAR) > 0) { - throw InvalidUserDataException("Rule contains multiple wildcards") + + if (rule.indexOf(WILDCARD_CHAR, 1) != -1) { + throw RuntimeException("Rule contains multiple wildcards") } if (rule.length == 1) { - throw InvalidUserDataException("Rule wildcards the first level") + throw RuntimeException("Rule wildcards the first level") } } @@ -115,32 +113,10 @@ abstract class GeneratePslAssetTask : DefaultTask() { } } -abstract class PublicSuffixListExtension { - @get:InputFile - abstract val sourceFile: RegularFileProperty -} - -class PublicSuffixListPlugin : Plugin<Project> { - override fun apply(project: Project) { - project.plugins.withType<LibraryPlugin>().configureEach { - val extension = project.extensions.create("publicSuffixList", PublicSuffixListExtension::class.java) - - val generateTaskProvider = project.tasks.register("generatePslAsset", GeneratePslAssetTask::class.java) { - outputDir.set(project.layout.buildDirectory.dir("generated/assets/publicsuffixlist")) - sourceFile.set(extension.sourceFile) - } - - val androidComponents = project.extensions.getByType(AndroidComponentsExtension::class.java) - androidComponents.onVariants(androidComponents.selector().all()) { variant -> - variant.sources.assets?.addGeneratedSourceDirectory(generateTaskProvider, GeneratePslAssetTask::outputDir) - } - } - } -} - -private data class PublicSuffixListData( +data class PublicSuffixListData( var totalRuleBytes: Int = 0, var totalExceptionRuleBytes: Int = 0, + val sortedRules: TreeSet<ByteString> = TreeSet(), val sortedExceptionRules: TreeSet<ByteString> = TreeSet(), )