WIP
This commit is contained in:
parent
2656f63942
commit
4a5f53cb90
8 changed files with 162 additions and 0 deletions
28
hkp-java/src/main/kotlin/pgp/hkp/HKPApi.kt
Normal file
28
hkp-java/src/main/kotlin/pgp/hkp/HKPApi.kt
Normal file
|
@ -0,0 +1,28 @@
|
|||
package pgp.hkp
|
||||
|
||||
import pgp.hkp.operation.Get
|
||||
import java.net.http.HttpClient
|
||||
|
||||
|
||||
open class HKPApi(
|
||||
val http: HttpClient,
|
||||
val service: HKPServerInfo,
|
||||
val openpgp: OpenPgpImplementation
|
||||
) {
|
||||
companion object {
|
||||
const val REQUEST_PATH_PREFIX = "/pks"
|
||||
const val REQUEST_PATH_LOOKUP = "${Companion.REQUEST_PATH_PREFIX}/lookup"
|
||||
const val REQUEST_PATH_ADD = "${Companion.REQUEST_PATH_PREFIX}/add"
|
||||
|
||||
const val VAR_OP = "op"
|
||||
const val VAR_SEARCH = "search"
|
||||
|
||||
const val OP_GET = "get"
|
||||
const val OP_INDEX = "index"
|
||||
const val OP_VINDEX = "vindex"
|
||||
const val OP_STATS = "stats"
|
||||
const val OP_HGET = "hget"
|
||||
}
|
||||
|
||||
fun get() = Get(http, service, openpgp)
|
||||
}
|
8
hkp-java/src/main/kotlin/pgp/hkp/HKPServerInfo.kt
Normal file
8
hkp-java/src/main/kotlin/pgp/hkp/HKPServerInfo.kt
Normal file
|
@ -0,0 +1,8 @@
|
|||
package pgp.hkp
|
||||
|
||||
import java.net.URI
|
||||
|
||||
data class HKPServerInfo(
|
||||
val serviceUri: URI,
|
||||
) {
|
||||
}
|
14
hkp-java/src/main/kotlin/pgp/hkp/HockeypuckApi.kt
Normal file
14
hkp-java/src/main/kotlin/pgp/hkp/HockeypuckApi.kt
Normal file
|
@ -0,0 +1,14 @@
|
|||
package pgp.hkp
|
||||
|
||||
import java.net.http.HttpClient
|
||||
|
||||
class HockeypuckApi(
|
||||
http: HttpClient,
|
||||
service: HKPServerInfo,
|
||||
openpgp: OpenPgpImplementation
|
||||
) : HKPApi(http, service, openpgp) {
|
||||
companion object {
|
||||
const val REQUEST_PATH_DELETE = "$REQUEST_PATH_PREFIX/delete"
|
||||
const val REQUEST_PATH_REPLACE = "$REQUEST_PATH_PREFIX/replace"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package pgp.hkp
|
||||
|
||||
abstract class OpenPgpImplementation {
|
||||
|
||||
abstract fun hexKeyId(keyId: Long): CharSequence
|
||||
|
||||
abstract fun hexFingerprint(fingerprint: ByteArray): CharSequence
|
||||
}
|
13
hkp-java/src/main/kotlin/pgp/hkp/SKSApi.kt
Normal file
13
hkp-java/src/main/kotlin/pgp/hkp/SKSApi.kt
Normal file
|
@ -0,0 +1,13 @@
|
|||
package pgp.hkp
|
||||
|
||||
import java.net.http.HttpClient
|
||||
|
||||
class SKSApi(
|
||||
http: HttpClient,
|
||||
service: HKPServerInfo,
|
||||
openpgp: OpenPgpImplementation
|
||||
) : HKPApi(http, service, openpgp) {
|
||||
companion object {
|
||||
const val REQUEST_PATH_HASHQUERY = "$REQUEST_PATH_PREFIX/hashquery"
|
||||
}
|
||||
}
|
30
hkp-java/src/main/kotlin/pgp/hkp/operation/Get.kt
Normal file
30
hkp-java/src/main/kotlin/pgp/hkp/operation/Get.kt
Normal file
|
@ -0,0 +1,30 @@
|
|||
package pgp.hkp.operation
|
||||
|
||||
import pgp.hkp.HKPApi.Companion.OP_GET
|
||||
import pgp.hkp.HKPServerInfo
|
||||
import pgp.hkp.OpenPgpImplementation
|
||||
import java.net.http.HttpClient
|
||||
|
||||
class Get(val http: HttpClient,
|
||||
val service: HKPServerInfo,
|
||||
val openpgp: OpenPgpImplementation) {
|
||||
|
||||
fun byKeyId(keyId: Long): LookupRequest {
|
||||
return LookupRequest(http, service, OP_GET, "0x${openpgp.hexKeyId(keyId)}")
|
||||
}
|
||||
|
||||
fun byFingerprint(fingerprint: ByteArray): LookupRequest {
|
||||
return byFingerprint(openpgp.hexFingerprint(fingerprint))
|
||||
}
|
||||
|
||||
fun byFingerprint(fingerprint: CharSequence): LookupRequest {
|
||||
require(fingerprint.length in listOf(32, 40, 64)) {
|
||||
"Fingerprint strings are either 32 (v3), 40 (v4) or 64 (v6) hexadecimal digits."
|
||||
}
|
||||
return LookupRequest(http, service, OP_GET, "0x$fingerprint")
|
||||
}
|
||||
|
||||
fun byUserId(userId: CharSequence): LookupRequest {
|
||||
return LookupRequest(http, service, OP_GET, userId.toString())
|
||||
}
|
||||
}
|
34
hkp-java/src/main/kotlin/pgp/hkp/operation/LookupRequest.kt
Normal file
34
hkp-java/src/main/kotlin/pgp/hkp/operation/LookupRequest.kt
Normal file
|
@ -0,0 +1,34 @@
|
|||
package pgp.hkp.operation
|
||||
|
||||
import pgp.hkp.HKPApi.Companion.REQUEST_PATH_LOOKUP
|
||||
import pgp.hkp.HKPApi.Companion.VAR_OP
|
||||
import pgp.hkp.HKPApi.Companion.VAR_SEARCH
|
||||
import pgp.hkp.HKPServerInfo
|
||||
import java.net.URI
|
||||
import java.net.http.HttpClient
|
||||
import java.net.http.HttpRequest
|
||||
import java.net.http.HttpResponse
|
||||
import java.net.http.HttpResponse.BodySubscribers
|
||||
|
||||
class LookupRequest(
|
||||
val http: HttpClient,
|
||||
val service: HKPServerInfo,
|
||||
val op: CharSequence,
|
||||
val search: CharSequence
|
||||
) {
|
||||
|
||||
val path: CharSequence
|
||||
get() = "$REQUEST_PATH_LOOKUP?search=$search&op=$op"
|
||||
|
||||
fun execute() {
|
||||
val request = HttpRequest.newBuilder(URIBuilder()URI.create("${service.serviceUri}$REQUEST_PATH_LOOKUP"))
|
||||
.GET()
|
||||
.(VAR_SEARCH, search.toString())
|
||||
.header(VAR_OP, op.toString())
|
||||
.build()
|
||||
|
||||
println(request.toString())
|
||||
|
||||
http.send(request, HttpResponse.BodyHandler {it -> BodySubscribers.ofByteArray()})
|
||||
}
|
||||
}
|
27
hkp-java/src/test/kotlin/pgp/hkp/HKPApiTest.kt
Normal file
27
hkp-java/src/test/kotlin/pgp/hkp/HKPApiTest.kt
Normal file
|
@ -0,0 +1,27 @@
|
|||
package pgp.hkp
|
||||
|
||||
import org.junit.jupiter.api.Test
|
||||
import java.net.URI
|
||||
import java.net.http.HttpClient
|
||||
import java.util.HexFormat
|
||||
|
||||
class HKPApiTest {
|
||||
|
||||
@Test
|
||||
fun test() {
|
||||
val api = HKPApi(HttpClient.newHttpClient(),
|
||||
HKPServerInfo(URI.create("http://keys.example.com:11371")),
|
||||
object : OpenPgpImplementation() {
|
||||
override fun hexKeyId(keyId: Long): CharSequence {
|
||||
return keyId.toString(16)
|
||||
}
|
||||
|
||||
override fun hexFingerprint(fingerprint: ByteArray): CharSequence {
|
||||
return HexFormat.of().formatHex(fingerprint)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
api.get().byUserId("Alice").execute()
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue