fix Policy Rules

This commit is contained in:
anlicheng 2026-05-21 12:22:02 +08:00
parent 9a56eea6cf
commit f9f018630c
5 changed files with 44 additions and 44 deletions

View File

@ -1,26 +0,0 @@
//
// IdentitySnapshot.swift
// punchnet
//
// Created by on 2026/2/5.
//
import Foundation
final class IdentitySnapshot: Snapshot {
typealias IdentityID = UInt32
private let identityMap: [IdentityID: IdentityRuleMap]
init(identityMap: [IdentityID : IdentityRuleMap]) {
self.identityMap = identityMap
}
func lookup(_ id: IdentityID) -> IdentityRuleMap? {
return self.identityMap[id]
}
static func empty() -> IdentitySnapshot {
return IdentitySnapshot(identityMap: [:])
}
}

View File

@ -0,0 +1,26 @@
//
// PolicyRuleSnapshot.swift
// punchnet
//
// Created by on 2026/2/5.
//
import Foundation
final class PolicyRuleSnapshot: Snapshot {
typealias IdentityID = UInt32
private let ruleMapByIdentity: [IdentityID: IdentityRuleMap]
init(ruleMapByIdentity: [IdentityID : IdentityRuleMap]) {
self.ruleMapByIdentity = ruleMapByIdentity
}
func lookup(_ id: IdentityID) -> IdentityRuleMap? {
return self.ruleMapByIdentity[id]
}
static func empty() -> PolicyRuleSnapshot {
return PolicyRuleSnapshot(ruleMapByIdentity: [:])
}
}

View File

@ -18,15 +18,15 @@ actor PolicyRuleStore {
nonisolated private let alloctor = ByteBufferAllocator() nonisolated private let alloctor = ByteBufferAllocator()
private let publisher: SnapshotPublisher<IdentitySnapshot> private let publisher: SnapshotPublisher<PolicyRuleSnapshot>
private var identityMap: [UInt32: IdentityRuleMap] = [:] private var ruleMapByIdentity: [UInt32: IdentityRuleMap] = [:]
init(publisher: SnapshotPublisher<IdentitySnapshot>) { init(publisher: SnapshotPublisher<PolicyRuleSnapshot>) {
self.publisher = publisher self.publisher = publisher
} }
func makeBatchPolicyRequests(dstIdentityID: UInt32) -> [Data] { func makeBatchPolicyRequests(dstIdentityID: UInt32) -> [Data] {
return self.identityMap.keys.compactMap { identityId in return self.ruleMapByIdentity.keys.compactMap { identityId in
var policyRequest = SDLPolicyRequest() var policyRequest = SDLPolicyRequest()
policyRequest.srcIdentityID = identityId policyRequest.srcIdentityID = identityId
policyRequest.dstIdentityID = dstIdentityID policyRequest.dstIdentityID = dstIdentityID
@ -60,7 +60,7 @@ actor PolicyRuleStore {
let id = policyResponse.srcIdentityID let id = policyResponse.srcIdentityID
let version = policyResponse.version let version = policyResponse.version
guard self.identityMap[id] == nil || ((self.identityMap[id]?.version ?? 0) < version) else { guard self.ruleMapByIdentity[id] == nil || ((self.ruleMapByIdentity[id]?.version ?? 0) < version) else {
return return
} }
@ -74,7 +74,7 @@ actor PolicyRuleStore {
} }
ruleMap[proto, default: [:]][port] = true ruleMap[proto, default: [:]][port] = true
} }
self.identityMap[id] = IdentityRuleMap(version: version, ruleMap: ruleMap) self.ruleMapByIdentity[id] = IdentityRuleMap(version: version, ruleMap: ruleMap)
// //
let snapshot = compileSnapshot() let snapshot = compileSnapshot()
@ -84,12 +84,12 @@ actor PolicyRuleStore {
func clear() { func clear() {
self.coolingDown.removeAll() self.coolingDown.removeAll()
self.versions.removeAll() self.versions.removeAll()
self.identityMap.removeAll() self.ruleMapByIdentity.removeAll()
self.publisher.publish(IdentitySnapshot.empty()) self.publisher.publish(PolicyRuleSnapshot.empty())
} }
private func compileSnapshot() -> IdentitySnapshot { private func compileSnapshot() -> PolicyRuleSnapshot {
return IdentitySnapshot(identityMap: identityMap) return PolicyRuleSnapshot(ruleMapByIdentity: ruleMapByIdentity)
} }
private func endCooldown(for key: UInt32) { private func endCooldown(for key: UInt32) {

View File

@ -10,7 +10,7 @@ import Foundation
actor PolicyService { actor PolicyService {
// //
private let policyRuleStore: PolicyRuleStore private let policyRuleStore: PolicyRuleStore
nonisolated private let snapshotPublisher: SnapshotPublisher<IdentitySnapshot> nonisolated private let snapshotPublisher: SnapshotPublisher<PolicyRuleSnapshot>
// Flow : 180 // Flow : 180
nonisolated private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180) nonisolated private let flowSessionManager = SDLFlowSessionManager(sessionTimeout: 180)
@ -21,13 +21,13 @@ actor PolicyService {
init(identityId: UInt32) { init(identityId: UInt32) {
self.identityId = identityId self.identityId = identityId
// //
let snapshotPublisher = SnapshotPublisher(initial: IdentitySnapshot.empty()) let snapshotPublisher = SnapshotPublisher(initial: PolicyRuleSnapshot.empty())
self.policyRuleStore = PolicyRuleStore(publisher: snapshotPublisher) self.policyRuleStore = PolicyRuleStore(publisher: snapshotPublisher)
self.snapshotPublisher = snapshotPublisher self.snapshotPublisher = snapshotPublisher
} }
nonisolated func policyRuntime() -> PolicyRuntime { nonisolated func policyRuntime() -> PolicyRuntime {
let policySnapshot = PolicySnapshot(identitySnapshot: self.snapshotPublisher.current()) let policySnapshot = PolicySnapshot(policyRuleSnapshot: self.snapshotPublisher.current())
return PolicyRuntime(policySnapshot: policySnapshot, flowSessionManager: self.flowSessionManager) return PolicyRuntime(policySnapshot: policySnapshot, flowSessionManager: self.flowSessionManager)
} }

View File

@ -8,14 +8,14 @@
import Foundation import Foundation
final class PolicySnapshot: Snapshot { final class PolicySnapshot: Snapshot {
private let identitySnapshot: IdentitySnapshot private let policyRuleSnapshot: PolicyRuleSnapshot
init(identitySnapshot: IdentitySnapshot) { init(policyRuleSnapshot: PolicyRuleSnapshot) {
self.identitySnapshot = identitySnapshot self.policyRuleSnapshot = policyRuleSnapshot
} }
func allows(srcIdentityID: UInt32, ipPacket: IPPacket) -> Bool { func allows(srcIdentityID: UInt32, ipPacket: IPPacket) -> Bool {
let ruleMap = self.identitySnapshot.lookup(srcIdentityID) let ruleMap = self.policyRuleSnapshot.lookup(srcIdentityID)
let proto = ipPacket.header.proto let proto = ipPacket.header.proto
switch ipPacket.transportPacket { switch ipPacket.transportPacket {
@ -31,6 +31,6 @@ final class PolicySnapshot: Snapshot {
} }
static func empty() -> PolicySnapshot { static func empty() -> PolicySnapshot {
return PolicySnapshot(identitySnapshot: .empty()) return PolicySnapshot(policyRuleSnapshot: .empty())
} }
} }