PeerID 8/n: NoiseRateLimiter & FavoritesPersistenceService (#745)

This commit is contained in:
Islam
2025-10-03 11:32:13 +02:00
committed by GitHub
parent f2473f857b
commit 524a7e916b
5 changed files with 14 additions and 14 deletions
@@ -131,8 +131,8 @@ final class SecureNoiseSession: NoiseSession {
// MARK: - Rate Limiter
final class NoiseRateLimiter {
private var handshakeTimestamps: [String: [Date]] = [:] // peerID -> timestamps
private var messageTimestamps: [String: [Date]] = [:] // peerID -> timestamps
private var handshakeTimestamps: [PeerID: [Date]] = [:]
private var messageTimestamps: [PeerID: [Date]] = [:]
// Global rate limiting
private var globalHandshakeTimestamps: [Date] = []
@@ -140,7 +140,7 @@ final class NoiseRateLimiter {
private let queue = DispatchQueue(label: "chat.bitchat.noise.ratelimit", attributes: .concurrent)
func allowHandshake(from peerID: String) -> Bool {
func allowHandshake(from peerID: PeerID) -> Bool {
return queue.sync(flags: .barrier) {
let now = Date()
let oneMinuteAgo = now.addingTimeInterval(-60)
@@ -169,7 +169,7 @@ final class NoiseRateLimiter {
}
}
func allowMessage(from peerID: String) -> Bool {
func allowMessage(from peerID: PeerID) -> Bool {
return queue.sync(flags: .barrier) {
let now = Date()
let oneSecondAgo = now.addingTimeInterval(-1)
@@ -198,7 +198,7 @@ final class NoiseRateLimiter {
}
}
func reset(for peerID: String) {
func reset(for peerID: PeerID) {
queue.async(flags: .barrier) {
self.handshakeTimestamps.removeValue(forKey: peerID)
self.messageTimestamps.removeValue(forKey: peerID)
@@ -179,10 +179,10 @@ final class FavoritesPersistenceService: ObservableObject {
/// Resolve favorite status by short peer ID (16-hex derived from Noise pubkey)
/// Falls back to scanning favorites and matching on derived peer ID.
func getFavoriteStatus(forPeerID peerID: String) -> FavoriteRelationship? {
func getFavoriteStatus(forPeerID peerID: PeerID) -> FavoriteRelationship? {
// Quick sanity: peerID should be 16 hex chars (8 bytes)
guard peerID.count == 16 else { return nil }
for (pubkey, rel) in favorites where PeerID(publicKey: pubkey).id == peerID {
guard peerID.isShort else { return nil }
for (pubkey, rel) in favorites where PeerID(publicKey: pubkey) == peerID {
return rel
}
return nil
+1 -1
View File
@@ -94,7 +94,7 @@ final class MessageRouter {
return true
}
} else if peerID.count == 16 {
if let fav = FavoritesPersistenceService.shared.getFavoriteStatus(forPeerID: peerID),
if let fav = FavoritesPersistenceService.shared.getFavoriteStatus(forPeerID: PeerID(str: peerID)),
fav.peerNostrPublicKey != nil {
return true
}
@@ -413,7 +413,7 @@ final class NoiseEncryptionService {
}
// Check rate limit
guard rateLimiter.allowHandshake(from: peerID) else {
guard rateLimiter.allowHandshake(from: PeerID(str: peerID)) else {
SecureLogger.warning(.authenticationFailed(peerID: "Rate limited: \(peerID)"))
throw NoiseSecurityError.rateLimitExceeded
}
@@ -442,7 +442,7 @@ final class NoiseEncryptionService {
}
// Check rate limit
guard rateLimiter.allowHandshake(from: peerID) else {
guard rateLimiter.allowHandshake(from: PeerID(str: peerID)) else {
SecureLogger.warning(.authenticationFailed(peerID: "Rate limited: \(peerID)"))
throw NoiseSecurityError.rateLimitExceeded
}
@@ -476,7 +476,7 @@ final class NoiseEncryptionService {
}
// Check rate limit
guard rateLimiter.allowMessage(from: peerID) else {
guard rateLimiter.allowMessage(from: PeerID(str: peerID)) else {
throw NoiseSecurityError.rateLimitExceeded
}
@@ -498,7 +498,7 @@ final class NoiseEncryptionService {
}
// Check rate limit
guard rateLimiter.allowMessage(from: peerID) else {
guard rateLimiter.allowMessage(from: PeerID(str: peerID)) else {
throw NoiseSecurityError.rateLimitExceeded
}
+1 -1
View File
@@ -174,7 +174,7 @@ final class NostrTransport: Transport {
return npub
}
if peerID.count == 16,
let fav = FavoritesPersistenceService.shared.getFavoriteStatus(forPeerID: peerID),
let fav = FavoritesPersistenceService.shared.getFavoriteStatus(forPeerID: PeerID(str: peerID)),
let npub = fav.peerNostrPublicKey {
return npub
}