rustls / rustls-platform-verifier

A certificate verification library for rustls that uses the operating system's verifier
Apache License 2.0
57 stars 18 forks source link

Android - Failed to resolve: rustls:rustls-platform-verifier #67

Closed Ghamza-Jd closed 5 months ago

Ghamza-Jd commented 5 months ago

Hey 👋

I'm trying to set this package for android. I've followed the instructions, but I'm using gradle.kts.

Here's my build.gradle.kts:

import com.android.aaptcompiler.android.isTruthy
import groovy.json.JsonSlurper
import java.net.URI
import java.util.Locale

plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}

repositories {
    google()
    mavenCentral()
    gradlePluginPortal()
    maven {
        url = findRustlsPlatformVerifierProject()
        metadataSources.artifact()
    }
}

android {
    namespace = "com.ghamza.jarust"
    compileSdk = GradleConfigs.compileSdk
    ndkVersion = GradleConfigs.ndkVersion

    defaultConfig {
        minSdk = GradleConfigs.minSdk
        consumerProguardFiles("consumer-rules.pro")
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.jna)
    implementation("rustls:rustls-platform-verifier:latest.release")
    // also tried rustls:rustls-platform-verifier:0.1.0
}

fun findRustlsPlatformVerifierProject(): URI {
    val dependencyText = providers.exec {
        workingDir = File("../")
        commandLine("cargo", "metadata", "--format-version", "1", "--manifest-path", "./Cargo.toml")
    }
        .standardOutput
        .asText
        .get()
    val dependencyJson = JsonSlurper().parseText(dependencyText) as Map<*, *>
    val packages = dependencyJson["packages"] as List<*>
    val targetPackage = packages.find {
        val pkgMap = it as Map<*, *>
        pkgMap["name"] == "rustls-platform-verifier-android"
    } as Map<*, *>
    val manifestPath = targetPackage["manifest_path"] as String
    return File(file(manifestPath).parent).toURI()
}

If it try to log the uri I get file:/Users/hamzajadid/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rustls-platform-verifier-android-0.1.0/ which seems correct.

But I'm getting Failed to resolve: rustls:rustls-platform-verifier:latest.release (and Failed to resolve: rustls:rustls-platform-verifier:0.1.0 when setting the version to that). I've also attached a screenshot of the failure of download

Screenshot 2024-02-04 at 4 15 42 PM

Any idea how this issue can be resolved? Thanks!

flisky commented 5 months ago

I think the last line should be File(manifestPath.parentFile, "maven").toURI().

You can check it here: https://github.com/flisky/jnidemo/commit/b98b670c9f93c00da8d1967d0c03034772de9806

Ghamza-Jd commented 5 months ago

I think the last line should be File(manifestPath.parentFile, "maven").toURI().

You can check it here: flisky/jnidemo@b98b670

Thanks @flisky! It worked when I made the same changes in your commit; moved it to settings.gradle.kts

complexspaces commented 5 months ago

Thank you for jumping in here over the weekend @flisky.

We also use gradle.kts at work but I didn't know if enough people had adopted Kotlin Gradle Scripts to include snippets here as well. I apologize for that inconvenience.

If its any help, here's the contents of our app's build.gradle.kts that imports this repository:

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive

buildscript {
    dependencies {
        classpath(libs.kotlinx.serialization.json)
    }
}

repositories {
    rustlsPlatformVerifier()
}

fun RepositoryHandler.rustlsPlatformVerifier(): MavenArtifactRepository {
    @Suppress("UnstableApiUsage")
    val manifestPath = let {
        val dependencyJson = providers.exec {
            workingDir = File(project.rootDir, "../")
            commandLine("cargo", "metadata", "--format-version", "1", "--filter-platform", "aarch64-linux-android", "--manifest-path", "internal-crate/Cargo.toml")
        }.standardOutput.asText

        val path = Json.decodeFromString<JsonObject>(dependencyJson.get())
            .getValue("packages")
            .jsonArray
            .first { element ->
                element.jsonObject.getValue("name").jsonPrimitive.content == "rustls-platform-verifier-android"
            }.jsonObject.getValue("manifest_path").jsonPrimitive.content

        File(path)
    }

    return maven {
        url = uri(File(manifestPath.parentFile, "maven").path)
        metadataSources.artifact()
    }
}

And then finally, the dependency import:

implementation(libs.rustls.platform.verifier)
[libraries]
rustls-platform-verifier = { group = "rustls", name = "rustls-platform-verifier", version = "latest.release" }