forked from External/ergo
fix #1676
Fix various pagination issues with CHATHISTORY; also undo #491 (msgid munging).
This commit is contained in:
parent
b478e93c11
commit
5bbee02fe6
13 changed files with 126 additions and 81 deletions
|
|
@ -42,29 +42,6 @@ func GenerateSecretToken() string {
|
|||
return B32Encoder.EncodeToString(buf[:])
|
||||
}
|
||||
|
||||
// "munge" a secret token to a new value. requirements:
|
||||
// 1. MUST be roughly as unlikely to collide with `GenerateSecretToken` outputs
|
||||
// as those outputs are with each other
|
||||
// 2. SHOULD be deterministic (motivation: if a JOIN line has msgid x,
|
||||
// create a deterministic msgid y for the fake HistServ PRIVMSG that "replays" it)
|
||||
// 3. SHOULD be in the same "namespace" as `GenerateSecretToken` outputs
|
||||
// (same length and character set)
|
||||
func MungeSecretToken(token string) (result string) {
|
||||
bytes, err := B32Encoder.DecodeString(token)
|
||||
if err != nil {
|
||||
// this should never happen
|
||||
return GenerateSecretToken()
|
||||
}
|
||||
// add 1 with carrying
|
||||
for i := len(bytes) - 1; 0 <= i; i -= 1 {
|
||||
bytes[i] += 1
|
||||
if bytes[i] != 0 {
|
||||
break
|
||||
} // else: overflow, carry to the next place
|
||||
}
|
||||
return B32Encoder.EncodeToString(bytes)
|
||||
}
|
||||
|
||||
// securely check if a supplied token matches a stored token
|
||||
func SecretTokensMatch(storedToken string, suppliedToken string) bool {
|
||||
// XXX fix a potential gotcha: if the stored token is uninitialized,
|
||||
|
|
|
|||
|
|
@ -47,41 +47,12 @@ func TestTokenCompare(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestMunging(t *testing.T) {
|
||||
count := 131072
|
||||
set := make(map[string]bool)
|
||||
var token string
|
||||
for i := 0; i < count; i++ {
|
||||
token = GenerateSecretToken()
|
||||
set[token] = true
|
||||
}
|
||||
// all tokens generated thus far should be unique
|
||||
assertEqual(len(set), count, t)
|
||||
|
||||
// iteratively munge the last generated token an additional `count` times
|
||||
mungedToken := token
|
||||
for i := 0; i < count; i++ {
|
||||
mungedToken = MungeSecretToken(mungedToken)
|
||||
assertEqual(len(mungedToken), len(token), t)
|
||||
set[mungedToken] = true
|
||||
}
|
||||
// munged tokens should not collide with generated tokens, or each other
|
||||
assertEqual(len(set), count*2, t)
|
||||
}
|
||||
|
||||
func BenchmarkGenerateSecretToken(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
GenerateSecretToken()
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkMungeSecretToken(b *testing.B) {
|
||||
t := GenerateSecretToken()
|
||||
for i := 0; i < b.N; i++ {
|
||||
t = MungeSecretToken(t)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCertfpComparisons(t *testing.T) {
|
||||
opensslFP := "3D:6B:11:BF:B4:05:C3:F8:4B:38:CD:30:38:FB:EC:01:71:D5:03:54:79:04:07:88:4C:A5:5D:23:41:85:66:C9"
|
||||
oragonoFP := "3d6b11bfb405c3f84b38cd3038fbec0171d50354790407884ca55d23418566c9"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue