mirror of
https://github.com/pgpainless/pgpainless.git
synced 2024-12-25 04:17:59 +01:00
xx: use Network via interface
This commit is contained in:
parent
7d284722b9
commit
98bccf78df
2 changed files with 38 additions and 16 deletions
|
@ -53,8 +53,15 @@ internal data class ForwardPointer(
|
||||||
val next: EdgeComponent?
|
val next: EdgeComponent?
|
||||||
)
|
)
|
||||||
|
|
||||||
|
interface NetworkView {
|
||||||
|
|
||||||
|
fun nodeByFpr(fpr: Fingerprint): Node?
|
||||||
|
fun reverseBySignee(fpr: Fingerprint): List<Edge>?
|
||||||
|
fun referenceTime(): ReferenceTime
|
||||||
|
}
|
||||||
|
|
||||||
class Query(
|
class Query(
|
||||||
private val network: Network,
|
private val network: NetworkView,
|
||||||
private val roots: Roots,
|
private val roots: Roots,
|
||||||
private val certificationNetwork: Boolean) {
|
private val certificationNetwork: Boolean) {
|
||||||
|
|
||||||
|
@ -272,24 +279,24 @@ class Query(
|
||||||
logger.debug("Roots (${roots.size()}):\n{}",
|
logger.debug("Roots (${roots.size()}):\n{}",
|
||||||
roots.roots().withIndex().joinToString("\n") { (i, r) ->
|
roots.roots().withIndex().joinToString("\n") { (i, r) ->
|
||||||
val fpr = r.fingerprint
|
val fpr = r.fingerprint
|
||||||
network.nodes[fpr]?.let { " {$i}. {$it}" } ?: " {$i}. {$fpr} (not found)"
|
network.nodeByFpr(fpr)?.let { " {$i}. {$it}" } ?: " {$i}. {$fpr} (not found)"
|
||||||
})
|
})
|
||||||
|
|
||||||
logger.debug("target: {}, {}", targetFpr, targetUserid)
|
logger.debug("target: {}, {}", targetFpr, targetUserid)
|
||||||
logger.debug("self signed: {}", selfSigned)
|
logger.debug("self signed: {}", selfSigned)
|
||||||
|
|
||||||
// If the node is not in the network, we're done.
|
// If the node is not in the network, we're done.
|
||||||
val target = network.nodes[targetFpr] ?: return hashMapOf()
|
val target = network.nodeByFpr(targetFpr) ?: return hashMapOf()
|
||||||
|
|
||||||
// Make sure the target is valid (not expired and not revoked
|
// Make sure the target is valid (not expired and not revoked
|
||||||
// at the reference time).
|
// at the reference time).
|
||||||
if ((target.expirationTime != null) &&
|
if ((target.expirationTime != null) &&
|
||||||
(target.expirationTime <= network.referenceTime.timestamp)) {
|
(target.expirationTime <= network.referenceTime().timestamp)) {
|
||||||
logger.debug("{}: Target certificate is expired at reference time.", targetFpr)
|
logger.debug("{}: Target certificate is expired at reference time.", targetFpr)
|
||||||
return hashMapOf()
|
return hashMapOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target.revocationState.isEffective(network.referenceTime)) {
|
if (target.revocationState.isEffective(network.referenceTime())) {
|
||||||
logger.debug("{}: Target certificate is revoked at reference time.", targetFpr)
|
logger.debug("{}: Target certificate is revoked at reference time.", targetFpr)
|
||||||
return hashMapOf()
|
return hashMapOf()
|
||||||
}
|
}
|
||||||
|
@ -299,7 +306,7 @@ class Query(
|
||||||
// revoked it, then it can't be authenticated.
|
// revoked it, then it can't be authenticated.
|
||||||
val targetUa: RevocationState? = target.userIds[targetUserid]
|
val targetUa: RevocationState? = target.userIds[targetUserid]
|
||||||
targetUa?.let {
|
targetUa?.let {
|
||||||
if (it.isEffective(network.referenceTime)) {
|
if (it.isEffective(network.referenceTime())) {
|
||||||
logger.debug("{}: Target user id is revoked at reference time.", targetFpr)
|
logger.debug("{}: Target user id is revoked at reference time.", targetFpr)
|
||||||
return hashMapOf()
|
return hashMapOf()
|
||||||
}
|
}
|
||||||
|
@ -369,7 +376,7 @@ class Query(
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
val signee = network.nodes[signeeFpr]!! // already looked up
|
val signee = network.nodeByFpr(signeeFpr)!! // already looked up
|
||||||
|
|
||||||
// Get the signee's current forward pointer.
|
// Get the signee's current forward pointer.
|
||||||
//
|
//
|
||||||
|
@ -385,7 +392,7 @@ class Query(
|
||||||
|
|
||||||
// Not limiting by required_depth, because 'network' doesn't expose an interface for this
|
// Not limiting by required_depth, because 'network' doesn't expose an interface for this
|
||||||
val certificationSets: List<Edge> =
|
val certificationSets: List<Edge> =
|
||||||
network.reverseEdges[signeeFpr].orEmpty() // "certifications_of"
|
network.reverseBySignee(signeeFpr).orEmpty() // "certifications_of"
|
||||||
|
|
||||||
if (certificationSets.isEmpty()) {
|
if (certificationSets.isEmpty()) {
|
||||||
// Nothing certified it. The path is a dead end.
|
// Nothing certified it. The path is a dead end.
|
||||||
|
@ -577,7 +584,7 @@ class Query(
|
||||||
// target_ua.map(|ua| ua.binding_signature_creation_time())
|
// target_ua.map(|ua| ua.binding_signature_creation_time())
|
||||||
// .unwrap_or(self.network().reference_time()))
|
// .unwrap_or(self.network().reference_time()))
|
||||||
|
|
||||||
network.referenceTime.timestamp,
|
network.referenceTime().timestamp,
|
||||||
|
|
||||||
null, true, 120, Depth.limited(0), RegexSet.wildcard()
|
null, true, 120, Depth.limited(0), RegexSet.wildcard()
|
||||||
)
|
)
|
||||||
|
@ -602,28 +609,28 @@ class Query(
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.debug("Recovering path starting at {}", network.nodes[issuerFpr])
|
logger.debug("Recovering path starting at {}", network.nodeByFpr(issuerFpr))
|
||||||
|
|
||||||
var amount = 120
|
var amount = 120
|
||||||
|
|
||||||
// nodes[0] is the root; nodes[nodes.len() - 1] is the target.
|
// nodes[0] is the root; nodes[nodes.len() - 1] is the target.
|
||||||
val nodes: MutableList<EdgeComponent> = mutableListOf()
|
val nodes: MutableList<EdgeComponent> = mutableListOf()
|
||||||
while (true) {
|
while (true) {
|
||||||
val c = fp.next ?: break
|
val ec = fp.next ?: break
|
||||||
|
|
||||||
logger.debug(" {}", fp)
|
logger.debug(" {}", fp)
|
||||||
|
|
||||||
val fv = FilterValues(c.trustDepth, c.trustAmount, null)
|
val fv = FilterValues(ec.trustDepth, ec.trustAmount, null)
|
||||||
|
|
||||||
val r = filter.cost(c, fv, true)
|
val r = filter.cost(ec, fv, true)
|
||||||
|
|
||||||
assert(r) {
|
assert(r) {
|
||||||
"cost function returned different result, but must be constant !"
|
"cost function returned different result, but must be constant !"
|
||||||
}
|
}
|
||||||
amount = min(fv.amount, amount)
|
amount = min(fv.amount, amount)
|
||||||
|
|
||||||
nodes.add(c)
|
nodes.add(ec)
|
||||||
fp = bestNextNode[c.target.fingerprint]!! // FIXME !!
|
fp = bestNextNode[ec.target.fingerprint]!! // FIXME !!
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selfSigned) {
|
if (selfSigned) {
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
package org.pgpainless.wot.network
|
package org.pgpainless.wot.network
|
||||||
|
|
||||||
|
import org.pgpainless.wot.dijkstra.NetworkView
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A network consists of nodes, and edges between them.
|
* A network consists of nodes, and edges between them.
|
||||||
* For the Web of Trust, a [Node] is a certificate, while the [Edges][Edge] between them are sets of signatures
|
* For the Web of Trust, a [Node] is a certificate, while the [Edges][Edge] between them are sets of signatures
|
||||||
|
@ -19,7 +21,7 @@ class Network(
|
||||||
val nodes: Map<Fingerprint, Node>,
|
val nodes: Map<Fingerprint, Node>,
|
||||||
val edges: Map<Fingerprint, List<Edge>>,
|
val edges: Map<Fingerprint, List<Edge>>,
|
||||||
val reverseEdges: Map<Fingerprint, List<Edge>>,
|
val reverseEdges: Map<Fingerprint, List<Edge>>,
|
||||||
val referenceTime: ReferenceTime) {
|
val referenceTime: ReferenceTime) : NetworkView {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
|
@ -54,6 +56,19 @@ class Network(
|
||||||
.sumOf { it.size }
|
.sumOf { it.size }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun nodeByFpr(fpr:Fingerprint): Node? {
|
||||||
|
return nodes[fpr]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun reverseBySignee(fpr: Fingerprint): List<Edge>? {
|
||||||
|
return reverseEdges[fpr]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun referenceTime(): ReferenceTime {
|
||||||
|
return referenceTime
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
sb.append("Network with ${nodes.size} nodes, $numberOfEdges edges:\n")
|
sb.append("Network with ${nodes.size} nodes, $numberOfEdges edges:\n")
|
||||||
|
|
Loading…
Reference in a new issue