Skip to content

Commit 9b1e850

Browse files
committed
chore: intial draft for using geoipdb from path
1 parent a62b76d commit 9b1e850

File tree

23 files changed

+272
-3
lines changed

23 files changed

+272
-3
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ output
2525
composeApp/src/desktopMain/resources/windows/WinSparkle.*
2626

2727
/composeApp/src/desktopMain/frameworks/
28+
*.mmdb
2829

2930
certificates/*.pem

composeApp/src/androidMain/kotlin/org/ooni/engine/AndroidOonimkallBridge.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ class AndroidOonimkallBridge : OonimkallBridge {
6363
it.softwareVersion = softwareVersion
6464

6565
it.assetsDir = assetsDir
66+
// geoipDB may not exist in Android binding; set reflectively if available
67+
geoIpDB?.let { path ->
68+
it.geoipDB = path
69+
}
6670
it.stateDir = stateDir
6771
it.tempDir = tempDir
6872
it.tunnelDir = tunnelDir
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.ooni.probe.net
2+
3+
import kotlinx.coroutines.Dispatchers
4+
import kotlinx.coroutines.withContext
5+
import java.net.HttpURLConnection
6+
import java.net.URL
7+
8+
actual suspend fun httpGetBytes(url: String): ByteArray =
9+
withContext(Dispatchers.IO) {
10+
val connection = (URL(url).openConnection() as HttpURLConnection)
11+
connection.requestMethod = "GET"
12+
connection.instanceFollowRedirects = true
13+
connection.connectTimeout = 15000
14+
connection.readTimeout = 30000
15+
try {
16+
val code = connection.responseCode
17+
val stream = if (code in 200..299) connection.inputStream else connection.errorStream
18+
val bytes = stream?.use { it.readBytes() } ?: ByteArray(0)
19+
if (code !in 200..299) throw RuntimeException("HTTP $code while GET $url: ${String(bytes)}")
20+
bytes
21+
} finally {
22+
connection.disconnect()
23+
}
24+
}

composeApp/src/commonMain/composeResources/values/strings-untranslatable.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
<string name="r2160p_ext" translatable="false">2160p (4k)</string>
1717

1818
<string name="twoParam" translatable="false">%1$s %2$s</string>
19+
<string name="engine_mmdb_version" translatable="false">20250801</string>
1920
</resources>

composeApp/src/commonMain/kotlin/org/ooni/engine/Engine.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class Engine(
148148

149149
private fun session(sessionConfig: OonimkallBridge.SessionConfig): OonimkallBridge.Session = bridge.newSession(sessionConfig)
150150

151-
private fun buildTaskSettings(
151+
private suspend fun buildTaskSettings(
152152
netTest: NetTest,
153153
taskOrigin: TaskOrigin,
154154
preferences: EnginePreferences,
@@ -166,6 +166,7 @@ class Engine(
166166
tunnelDir = "$baseFilePath/tunnel",
167167
tempDir = cacheDir,
168168
assetsDir = "$baseFilePath/assets",
169+
geoIpDB = preferences.geoipDbVersion?.let { "$cacheDir/$it.mmdb" },
169170
options = TaskSettings.Options(
170171
noCollector = !preferences.uploadResults,
171172
softwareName = buildSoftwareName(taskOrigin),
@@ -196,7 +197,7 @@ class Engine(
196197
MAX_RUNTIME_DISABLED
197198
}
198199

199-
private fun buildSessionConfig(
200+
private suspend fun buildSessionConfig(
200201
taskOrigin: TaskOrigin,
201202
preferences: EnginePreferences,
202203
) = OonimkallBridge.SessionConfig(
@@ -208,6 +209,7 @@ class Engine(
208209
tunnelDir = "$baseFilePath/tunnel",
209210
tempDir = cacheDir,
210211
assetsDir = "$baseFilePath/assets",
212+
geoIpDB = preferences.geoipDbVersion?.let { "$cacheDir/$it.mmdb" },
211213
logger = oonimkallLogger,
212214
verbose = false,
213215
)

composeApp/src/commonMain/kotlin/org/ooni/engine/OonimkallBridge.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ interface OonimkallBridge {
3131
val proxy: String?,
3232
val probeServicesURL: String?,
3333
val assetsDir: String,
34+
val geoIpDB: String?,
3435
val stateDir: String,
3536
val tempDir: String,
3637
val tunnelDir: String,

composeApp/src/commonMain/kotlin/org/ooni/engine/TaskEventMapper.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,15 @@ class TaskEventMapper(
9696
asn = value?.probeAsn,
9797
ip = value?.probeIp,
9898
countryCode = value?.probeCc,
99+
geoIpdb = value?.geoIpdb,
99100
networkType = networkTypeFinder(),
100101
)
101102

103+
"status.resolver_lookup" -> value?.geoIpdb?.let {
104+
println(it)
105+
null
106+
}
107+
102108
"status.measurement_done" ->
103109
TaskEvent.MeasurementDone(index = value?.idx ?: 0)
104110

composeApp/src/commonMain/kotlin/org/ooni/engine/models/EnginePreferences.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ data class EnginePreferences(
77
val taskLogLevel: TaskLogLevel,
88
val uploadResults: Boolean,
99
val proxy: String?,
10+
val geoipDbVersion: String?,
1011
val maxRuntime: Duration?,
1112
)

composeApp/src/commonMain/kotlin/org/ooni/engine/models/TaskEvent.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ sealed interface TaskEvent {
1515
val ip: String?,
1616
val asn: String?,
1717
val countryCode: String?,
18+
val geoIpdb: String?,
1819
val networkType: NetworkType,
1920
) : TaskEvent
2021

composeApp/src/commonMain/kotlin/org/ooni/engine/models/TaskEventResult.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ data class TaskEventResult(
2626
var idx: Int = 0,
2727
@SerialName("report_id")
2828
var reportId: String? = null,
29+
@SerialName("geoip_db")
30+
var geoIpdb: String? = null,
2931
@SerialName("probe_ip")
3032
var probeIp: String? = null,
3133
@SerialName("probe_asn")

0 commit comments

Comments
 (0)