on master help sign in
Add hex validation for encryptedBlob and improve ForwardMessage duplicate detection
346c12eiko
server.knot+3−2
@@ -317,7 +317,7 @@ serve = \req -> case req of
317 t <- now
317 t <- now
318 msgId <- genToken
318 msgId <- genToken
319 let clampedTs = if timestamp > t then t else if timestamp < t - messageMaxAge then t else timestamp
319 let clampedTs = if timestamp > t then t else if timestamp < t - messageMaxAge then t else timestamp
320− let validInput = not (to == "") && not (encryptedBlob == "") && isValidHex to && not (tooLong to maxPubkeyLen) && not (tooLong encryptedBlob maxBlobLen)
320+ let validInput = not (to == "") && not (encryptedBlob == "") && isValidHex to && isValidHex encryptedBlob && not (tooLong to maxPubkeyLen) && not (tooLong encryptedBlob maxBlobLen)
321 result <- atomic do
321 result <- atomic do
322 pr <- pruneExpired t
322 pr <- pruneExpired t
323 sessions <- *sessions
323 sessions <- *sessions
@@ -621,7 +621,7 @@ serve = \req -> case req of
621 t <- now
621 t <- now
622 let authorized = verifyFederationAuth authorization
622 let authorized = verifyFederationAuth authorization
623 let validOrigin = not (originServer == "") && not (originServer == serverHost) && not (tooLong originServer maxPubkeyLen)
623 let validOrigin = not (originServer == "") && not (originServer == serverHost) && not (tooLong originServer maxPubkeyLen)
624− let validFields = not (toKey == "") && not (fromKey == "") && not (encryptedBlob == "") && not (messageId == "") && isValidHex toKey && isValidHex fromKey && isValidHex messageId && not (tooLong toKey maxPubkeyLen) && not (tooLong fromKey maxPubkeyLen) && not (tooLong encryptedBlob maxBlobLen) && not (tooLong messageId maxPubkeyLen)
624+ let validFields = not (toKey == "") && not (fromKey == "") && not (encryptedBlob == "") && not (messageId == "") && isValidHex toKey && isValidHex fromKey && isValidHex encryptedBlob && isValidHex messageId && not (tooLong toKey maxPubkeyLen) && not (tooLong fromKey maxPubkeyLen) && not (tooLong encryptedBlob maxBlobLen) && not (tooLong messageId maxPubkeyLen)
625 let clampedTs = if timestamp > t then t else if timestamp < t - messageMaxAge then t else timestamp
625 let clampedTs = if timestamp > t then t else if timestamp < t - messageMaxAge then t else timestamp
626 pruneResult <- atomic do
626 pruneResult <- atomic do
627 pr <- pruneExpired t
627 pr <- pruneExpired t
@@ -631,6 +631,7 @@ serve = \req -> case req of
631 let exists = count (do
631 let exists = count (do
632 m <- messages
632 m <- messages
633 where m.messageId == messageId
633 where m.messageId == messageId
634+ where m.toKey == toKey
634 where m.receivedAt >= t - messageMaxAge
635 where m.receivedAt >= t - messageMaxAge
635 yield m) > 0
636 yield m) > 0
636 let shouldInsert = authorized && validOrigin && validFields && not exists
637 let shouldInsert = authorized && validOrigin && validFields && not exists