瀏覽代碼

Revert "fix #1676"

This reverts commit 5bbee02fe6.
tags/v2.8.0-rc1
Shivaram Lingamneni 2 年之前
父節點
當前提交
3ec5ffa340
共有 13 個文件被更改,包括 81 次插入126 次删除
  1. 1
    1
      default.yaml
  2. 9
    9
      irc/channel.go
  3. 4
    4
      irc/client.go
  4. 2
    12
      irc/handlers.go
  5. 5
    19
      irc/history/history.go
  6. 2
    2
      irc/history/history_test.go
  7. 0
    21
      irc/history/queries.go
  8. 1
    1
      irc/histserv.go
  9. 1
    53
      irc/mysql/history.go
  10. 3
    3
      irc/server.go
  11. 23
    0
      irc/utils/crypto.go
  12. 29
    0
      irc/utils/crypto_test.go
  13. 1
    1
      irc/znc.go

+ 1
- 1
default.yaml 查看文件

@@ -962,7 +962,7 @@ history:
962 962
         # if `default` is false, store TAGMSG containing any of these tags:
963 963
         whitelist:
964 964
             - "+draft/react"
965
-            - "+react"
965
+            - "react"
966 966
 
967 967
         # if `default` is true, don't store TAGMSG containing any of these tags:
968 968
         #blacklist:

+ 9
- 9
irc/channel.go 查看文件

@@ -917,7 +917,7 @@ func (channel *Channel) autoReplayHistory(client *Client, rb *ResponseBuffer, sk
917 917
 	}
918 918
 
919 919
 	if hasAutoreplayTimestamps {
920
-		_, seq, _ := channel.server.GetHistorySequence(channel, client, "", 0)
920
+		_, seq, _ := channel.server.GetHistorySequence(channel, client, "")
921 921
 		if seq != nil {
922 922
 			zncMax := channel.server.Config().History.ZNCMax
923 923
 			items, _ = seq.Between(history.Selector{Time: start}, history.Selector{Time: end}, zncMax)
@@ -935,7 +935,7 @@ func (channel *Channel) autoReplayHistory(client *Client, rb *ResponseBuffer, sk
935 935
 			replayLimit = channel.server.Config().History.AutoreplayOnJoin
936 936
 		}
937 937
 		if 0 < replayLimit {
938
-			_, seq, _ := channel.server.GetHistorySequence(channel, client, "", 0)
938
+			_, seq, _ := channel.server.GetHistorySequence(channel, client, "")
939 939
 			if seq != nil {
940 940
 				items, _ = seq.Between(history.Selector{}, history.Selector{}, replayLimit)
941 941
 			}
@@ -1084,7 +1084,7 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
1084 1084
 				} else {
1085 1085
 					message = fmt.Sprintf(client.t("%[1]s [account: %[2]s] joined the channel"), nick, item.AccountName)
1086 1086
 				}
1087
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1087
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1088 1088
 			}
1089 1089
 		case history.Part:
1090 1090
 			if eventPlayback {
@@ -1094,14 +1094,14 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
1094 1094
 					continue // #474
1095 1095
 				}
1096 1096
 				message := fmt.Sprintf(client.t("%[1]s left the channel (%[2]s)"), nick, item.Message.Message)
1097
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1097
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1098 1098
 			}
1099 1099
 		case history.Kick:
1100 1100
 			if eventPlayback {
1101 1101
 				rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "KICK", chname, item.Params[0], item.Message.Message)
1102 1102
 			} else {
1103 1103
 				message := fmt.Sprintf(client.t("%[1]s kicked %[2]s (%[3]s)"), nick, item.Params[0], item.Message.Message)
1104
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1104
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1105 1105
 			}
1106 1106
 		case history.Quit:
1107 1107
 			if eventPlayback {
@@ -1111,21 +1111,21 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
1111 1111
 					continue // #474
1112 1112
 				}
1113 1113
 				message := fmt.Sprintf(client.t("%[1]s quit (%[2]s)"), nick, item.Message.Message)
1114
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1114
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1115 1115
 			}
1116 1116
 		case history.Nick:
1117 1117
 			if eventPlayback {
1118 1118
 				rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "NICK", item.Params[0])
1119 1119
 			} else {
1120 1120
 				message := fmt.Sprintf(client.t("%[1]s changed nick to %[2]s"), nick, item.Params[0])
1121
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1121
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1122 1122
 			}
1123 1123
 		case history.Topic:
1124 1124
 			if eventPlayback {
1125 1125
 				rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "TOPIC", chname, item.Message.Message)
1126 1126
 			} else {
1127 1127
 				message := fmt.Sprintf(client.t("%[1]s set the channel topic to: %[2]s"), nick, item.Message.Message)
1128
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1128
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1129 1129
 			}
1130 1130
 		case history.Mode:
1131 1131
 			params := make([]string, len(item.Message.Split)+1)
@@ -1137,7 +1137,7 @@ func (channel *Channel) replayHistoryItems(rb *ResponseBuffer, items []history.I
1137 1137
 				rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "MODE", params...)
1138 1138
 			} else {
1139 1139
 				message := fmt.Sprintf(client.t("%[1]s set channel modes: %[2]s"), nick, strings.Join(params[1:], " "))
1140
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1140
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1141 1141
 			}
1142 1142
 		}
1143 1143
 	}

+ 4
- 4
irc/client.go 查看文件

@@ -883,7 +883,7 @@ func (client *Client) replayPrivmsgHistory(rb *ResponseBuffer, items []history.I
883 883
 			if hasEventPlayback {
884 884
 				rb.AddFromClient(item.Message.Time, item.Message.Msgid, item.Nick, item.AccountName, item.IsBot, nil, "INVITE", nick, item.Message.Message)
885 885
 			} else {
886
-				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", fmt.Sprintf(client.t("%[1]s invited you to channel %[2]s"), NUHToNick(item.Nick), item.Message.Message))
886
+				rb.AddFromClient(item.Message.Time, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", fmt.Sprintf(client.t("%[1]s invited you to channel %[2]s"), NUHToNick(item.Nick), item.Message.Message))
887 887
 			}
888 888
 			continue
889 889
 		case history.Privmsg:
@@ -1713,7 +1713,7 @@ func (client *Client) listTargets(start, end history.Selector, limit int) (resul
1713 1713
 	var base, extras []history.TargetListing
1714 1714
 	var chcfnames []string
1715 1715
 	for _, channel := range client.Channels() {
1716
-		_, seq, err := client.server.GetHistorySequence(channel, client, "", 0)
1716
+		_, seq, err := client.server.GetHistorySequence(channel, client, "")
1717 1717
 		if seq == nil || err != nil {
1718 1718
 			continue
1719 1719
 		}
@@ -1734,7 +1734,7 @@ func (client *Client) listTargets(start, end history.Selector, limit int) (resul
1734 1734
 		extras = append(extras, persistentExtras...)
1735 1735
 	}
1736 1736
 
1737
-	_, cSeq, err := client.server.GetHistorySequence(nil, client, "", 0)
1737
+	_, cSeq, err := client.server.GetHistorySequence(nil, client, "")
1738 1738
 	if err == nil && cSeq != nil {
1739 1739
 		correspondents, err := cSeq.ListCorrespondents(start, end, limit)
1740 1740
 		if err == nil {
@@ -1758,7 +1758,7 @@ func (client *Client) privmsgsBetween(startTime, endTime time.Time, targetLimit,
1758 1758
 		if strings.HasPrefix(target.CfName, "#") {
1759 1759
 			continue
1760 1760
 		}
1761
-		_, seq, err := client.server.GetHistorySequence(nil, client, target.CfName, 0)
1761
+		_, seq, err := client.server.GetHistorySequence(nil, client, target.CfName)
1762 1762
 		if err == nil && seq != nil {
1763 1763
 			items, err := seq.Between(start, end, messageLimit)
1764 1764
 			if err == nil {

+ 2
- 12
irc/handlers.go 查看文件

@@ -640,7 +640,7 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
640 640
 		}
641 641
 		identifier, value := strings.ToLower(pieces[0]), pieces[1]
642 642
 		if identifier == "msgid" {
643
-			msgid, err = history.NormalizeMsgid(value), nil
643
+			msgid, err = value, nil
644 644
 			return
645 645
 		} else if identifier == "timestamp" {
646 646
 			timestamp, err = time.Parse(IRCv3TimestampFormat, value)
@@ -725,17 +725,7 @@ func chathistoryHandler(server *Server, client *Client, msg ircmsg.Message, rb *
725 725
 	if listTargets {
726 726
 		targets, err = client.listTargets(start, end, limit)
727 727
 	} else {
728
-		// see #1676; for CHATHISTORY we need to make the paging window as exact as possible,
729
-		// hence filtering out undisplayable messages on the backend, in order to send a full
730
-		// paging window if possible
731
-		var flags history.ExcludeFlags
732
-		if !rb.session.capabilities.Has(caps.EventPlayback) {
733
-			flags |= history.ExcludeTagmsg
734
-		}
735
-		if client.AccountSettings().ReplayJoins == ReplayJoinsNever {
736
-			flags |= history.ExcludeJoins
737
-		}
738
-		channel, sequence, err = server.GetHistorySequence(nil, client, target, flags)
728
+		channel, sequence, err = server.GetHistorySequence(nil, client, target)
739 729
 		if err != nil || sequence == nil {
740 730
 			return
741 731
 		}

+ 5
- 19
irc/history/history.go 查看文件

@@ -53,17 +53,6 @@ func (item *Item) HasMsgid(msgid string) bool {
53 53
 	return item.Message.Msgid == msgid
54 54
 }
55 55
 
56
-func (item *Item) IsExcluded(excludeFlags ExcludeFlags) bool {
57
-	switch item.Type {
58
-	case Tagmsg:
59
-		return excludeFlags&ExcludeTagmsg != 0
60
-	case Join, Part, Quit:
61
-		return excludeFlags&ExcludeJoins != 0
62
-	default:
63
-		return false
64
-	}
65
-}
66
-
67 56
 type Predicate func(item *Item) (matches bool)
68 57
 
69 58
 func Reverse(results []Item) {
@@ -166,7 +155,7 @@ func (list *Buffer) lookup(msgid string) (result Item, found bool) {
166 155
 // with an indication of whether the results are complete or are missing items
167 156
 // because some of that period was discarded. A zero value of `before` is considered
168 157
 // higher than all other times.
169
-func (list *Buffer) betweenHelper(start, end Selector, cutoff time.Time, pred Predicate, limit int, excludeFlags ExcludeFlags) (results []Item, complete bool, err error) {
158
+func (list *Buffer) betweenHelper(start, end Selector, cutoff time.Time, pred Predicate, limit int) (results []Item, complete bool, err error) {
170 159
 	var ascending bool
171 160
 
172 161
 	defer func() {
@@ -206,8 +195,7 @@ func (list *Buffer) betweenHelper(start, end Selector, cutoff time.Time, pred Pr
206 195
 	satisfies := func(item *Item) bool {
207 196
 		return (after.IsZero() || item.Message.Time.After(after)) &&
208 197
 			(before.IsZero() || item.Message.Time.Before(before)) &&
209
-			(pred == nil || pred(item)) &&
210
-			!item.IsExcluded(excludeFlags)
198
+			(pred == nil || pred(item))
211 199
 	}
212 200
 
213 201
 	return list.matchInternal(satisfies, ascending, limit), complete, nil
@@ -291,10 +279,9 @@ type bufferSequence struct {
291 279
 	list   *Buffer
292 280
 	pred   Predicate
293 281
 	cutoff time.Time
294
-	flags  ExcludeFlags
295 282
 }
296 283
 
297
-func (list *Buffer) MakeSequence(correspondent string, cutoff time.Time, flags ExcludeFlags) Sequence {
284
+func (list *Buffer) MakeSequence(correspondent string, cutoff time.Time) Sequence {
298 285
 	var pred Predicate
299 286
 	if correspondent != "" {
300 287
 		pred = func(item *Item) bool {
@@ -305,12 +292,11 @@ func (list *Buffer) MakeSequence(correspondent string, cutoff time.Time, flags E
305 292
 		list:   list,
306 293
 		pred:   pred,
307 294
 		cutoff: cutoff,
308
-		flags:  flags,
309 295
 	}
310 296
 }
311 297
 
312 298
 func (seq *bufferSequence) Between(start, end Selector, limit int) (results []Item, err error) {
313
-	results, _, err = seq.list.betweenHelper(start, end, seq.cutoff, seq.pred, limit, seq.flags)
299
+	results, _, err = seq.list.betweenHelper(start, end, seq.cutoff, seq.pred, limit)
314 300
 	return
315 301
 }
316 302
 
@@ -391,7 +377,7 @@ func (list *Buffer) Delete(predicate Predicate) (count int) {
391 377
 // latest returns the items most recently added, up to `limit`. If `limit` is 0,
392 378
 // it returns all items.
393 379
 func (list *Buffer) latest(limit int) (results []Item) {
394
-	results, _, _ = list.betweenHelper(Selector{}, Selector{}, time.Time{}, nil, limit, 0)
380
+	results, _, _ = list.betweenHelper(Selector{}, Selector{}, time.Time{}, nil, limit)
395 381
 	return
396 382
 }
397 383
 

+ 2
- 2
irc/history/history_test.go 查看文件

@@ -15,7 +15,7 @@ const (
15 15
 )
16 16
 
17 17
 func betweenTimestamps(buf *Buffer, start, end time.Time, limit int) (result []Item, complete bool) {
18
-	result, complete, _ = buf.betweenHelper(Selector{Time: start}, Selector{Time: end}, time.Time{}, nil, limit, 0)
18
+	result, complete, _ = buf.betweenHelper(Selector{Time: start}, Selector{Time: end}, time.Time{}, nil, limit)
19 19
 	return
20 20
 }
21 21
 
@@ -45,7 +45,7 @@ func TestEmptyBuffer(t *testing.T) {
45 45
 	})
46 46
 	since, complete = betweenTimestamps(buf, pastTime, time.Now(), 0)
47 47
 	if len(since) != 1 {
48
-		t.Errorf("should be able to store items in a nonempty buffer: expected %d, got %d", 1, len(since))
48
+		t.Error("should be able to store items in a nonempty buffer")
49 49
 	}
50 50
 	if !complete {
51 51
 		t.Error("results should be complete")

+ 0
- 21
irc/history/queries.go 查看文件

@@ -4,17 +4,9 @@
4 4
 package history
5 5
 
6 6
 import (
7
-	"strings"
8 7
 	"time"
9 8
 )
10 9
 
11
-type ExcludeFlags uint
12
-
13
-const (
14
-	ExcludeTagmsg ExcludeFlags = 1 << iota
15
-	ExcludeJoins
16
-)
17
-
18 10
 // Selector represents a parameter to a CHATHISTORY command
19 11
 type Selector struct {
20 12
 	Msgid string
@@ -85,16 +77,3 @@ func MinMaxAsc(after, before, cutoff time.Time) (min, max time.Time, ascending b
85 77
 	}
86 78
 	return after, before, ascending
87 79
 }
88
-
89
-// maps regular msgids from JOIN, etc. to a msgid suitable for attaching
90
-// to a HistServ message describing the JOIN. See #491 for some history.
91
-func HistservMungeMsgid(msgid string) string {
92
-	return "_" + msgid
93
-}
94
-
95
-// strips munging from a msgid. future schemes may not support a well-defined
96
-// mapping of munged msgids to true msgids, but munged msgids should always contain
97
-// a _, with metadata in front and data (possibly the true msgid) after.
98
-func NormalizeMsgid(msgid string) string {
99
-	return strings.TrimPrefix(msgid, "_")
100
-}

+ 1
- 1
irc/histserv.go 查看文件

@@ -199,7 +199,7 @@ func histservPlayHandler(service *ircService, server *Server, client *Client, co
199 199
 
200 200
 // handles parameter parsing and history queries for /HISTORY and /HISTSERV PLAY
201 201
 func easySelectHistory(server *Server, client *Client, params []string) (items []history.Item, channel *Channel, err error) {
202
-	channel, sequence, err := server.GetHistorySequence(nil, client, params[0], 0)
202
+	channel, sequence, err := server.GetHistorySequence(nil, client, params[0])
203 203
 
204 204
 	if sequence == nil || err != nil {
205 205
 		return nil, nil, errNoSuchChannel

+ 1
- 53
irc/mysql/history.go 查看文件

@@ -40,10 +40,6 @@ const (
40 40
 	keySchemaMinorVersion = "db.minorversion"
41 41
 	cleanupRowLimit       = 50
42 42
 	cleanupPauseTime      = 10 * time.Minute
43
-
44
-	// if we don't fill the pagination window due to exclusions,
45
-	// retry with an expanded window at most this many times
46
-	maxPaginationRetries = 3
47 43
 )
48 44
 
49 45
 type e struct{}
@@ -1037,18 +1033,9 @@ type mySQLHistorySequence struct {
1037 1033
 	target        string
1038 1034
 	correspondent string
1039 1035
 	cutoff        time.Time
1040
-	excludeFlags  history.ExcludeFlags
1041 1036
 }
1042 1037
 
1043 1038
 func (s *mySQLHistorySequence) Between(start, end history.Selector, limit int) (results []history.Item, err error) {
1044
-	if s.excludeFlags == 0 {
1045
-		return s.baseBetween(start, end, limit)
1046
-	} else {
1047
-		return s.betweenWithRetries(start, end, limit)
1048
-	}
1049
-}
1050
-
1051
-func (s *mySQLHistorySequence) baseBetween(start, end history.Selector, limit int) (results []history.Item, err error) {
1052 1039
 	ctx, cancel := context.WithTimeout(context.Background(), s.mysql.getTimeout())
1053 1040
 	defer cancel()
1054 1041
 
@@ -1071,45 +1058,7 @@ func (s *mySQLHistorySequence) baseBetween(start, end history.Selector, limit in
1071 1058
 	return results, err
1072 1059
 }
1073 1060
 
1074
-func (s *mySQLHistorySequence) betweenWithRetries(start, end history.Selector, limit int) (results []history.Item, err error) {
1075
-	applyExclusions := func(currentResults []history.Item, excludeFlags history.ExcludeFlags, trueLimit int) (filteredResults []history.Item) {
1076
-		filteredResults = make([]history.Item, 0, len(currentResults))
1077
-		for _, item := range currentResults {
1078
-			if !item.IsExcluded(excludeFlags) {
1079
-				filteredResults = append(filteredResults, item)
1080
-			}
1081
-			if len(filteredResults) == trueLimit {
1082
-				break
1083
-			}
1084
-		}
1085
-		return
1086
-	}
1087
-
1088
-	i := 1
1089
-	for {
1090
-		currentLimit := limit * i
1091
-		currentResults, err := s.baseBetween(start, end, currentLimit)
1092
-		if err != nil {
1093
-			return nil, err
1094
-		}
1095
-		results = applyExclusions(currentResults, s.excludeFlags, limit)
1096
-		// we're done in any of these three cases:
1097
-		// (1) we filled the window (2) we ran out of results on the backend (3) we can't retry anymore
1098
-		if len(results) == limit || len(currentResults) < currentLimit || i == maxPaginationRetries {
1099
-			return results, nil
1100
-		}
1101
-		i++
1102
-	}
1103
-}
1104
-
1105 1061
 func (s *mySQLHistorySequence) Around(start history.Selector, limit int) (results []history.Item, err error) {
1106
-	// temporarily clear the exclude flags when running GenericAround, since we don't care about
1107
-	// the exactness of the paging window at all
1108
-	oldExcludeFlags := s.excludeFlags
1109
-	s.excludeFlags = 0
1110
-	defer func() {
1111
-		s.excludeFlags = oldExcludeFlags
1112
-	}()
1113 1062
 	return history.GenericAround(s, start, limit)
1114 1063
 }
1115 1064
 
@@ -1134,12 +1083,11 @@ func (seq *mySQLHistorySequence) Ephemeral() bool {
1134 1083
 	return false
1135 1084
 }
1136 1085
 
1137
-func (mysql *MySQL) MakeSequence(target, correspondent string, cutoff time.Time, excludeFlags history.ExcludeFlags) history.Sequence {
1086
+func (mysql *MySQL) MakeSequence(target, correspondent string, cutoff time.Time) history.Sequence {
1138 1087
 	return &mySQLHistorySequence{
1139 1088
 		target:        target,
1140 1089
 		correspondent: correspondent,
1141 1090
 		mysql:         mysql,
1142 1091
 		cutoff:        cutoff,
1143
-		excludeFlags:  excludeFlags,
1144 1092
 	}
1145 1093
 }

+ 3
- 3
irc/server.go 查看文件

@@ -862,7 +862,7 @@ func (server *Server) setupListeners(config *Config) (err error) {
862 862
 // suitable for ListCorrespondents (i.e., this function is still used to
863 863
 // decide whether the ringbuf or mysql is authoritative about the client's
864 864
 // message history).
865
-func (server *Server) GetHistorySequence(providedChannel *Channel, client *Client, query string, excludeFlags history.ExcludeFlags) (channel *Channel, sequence history.Sequence, err error) {
865
+func (server *Server) GetHistorySequence(providedChannel *Channel, client *Client, query string) (channel *Channel, sequence history.Sequence, err error) {
866 866
 	config := server.Config()
867 867
 	// 4 cases: {persistent, ephemeral} x {normal, conversation}
868 868
 	// with ephemeral history, target is implicit in the choice of `hist`,
@@ -940,9 +940,9 @@ func (server *Server) GetHistorySequence(providedChannel *Channel, client *Clien
940 940
 	}
941 941
 
942 942
 	if hist != nil {
943
-		sequence = hist.MakeSequence(correspondent, cutoff, excludeFlags)
943
+		sequence = hist.MakeSequence(correspondent, cutoff)
944 944
 	} else if target != "" {
945
-		sequence = server.historyDB.MakeSequence(target, correspondent, cutoff, excludeFlags)
945
+		sequence = server.historyDB.MakeSequence(target, correspondent, cutoff)
946 946
 	}
947 947
 	return
948 948
 }

+ 23
- 0
irc/utils/crypto.go 查看文件

@@ -42,6 +42,29 @@ func GenerateSecretToken() string {
42 42
 	return B32Encoder.EncodeToString(buf[:])
43 43
 }
44 44
 
45
+// "munge" a secret token to a new value. requirements:
46
+// 1. MUST be roughly as unlikely to collide with `GenerateSecretToken` outputs
47
+// as those outputs are with each other
48
+// 2. SHOULD be deterministic (motivation: if a JOIN line has msgid x,
49
+// create a deterministic msgid y for the fake HistServ PRIVMSG that "replays" it)
50
+// 3. SHOULD be in the same "namespace" as `GenerateSecretToken` outputs
51
+// (same length and character set)
52
+func MungeSecretToken(token string) (result string) {
53
+	bytes, err := B32Encoder.DecodeString(token)
54
+	if err != nil {
55
+		// this should never happen
56
+		return GenerateSecretToken()
57
+	}
58
+	// add 1 with carrying
59
+	for i := len(bytes) - 1; 0 <= i; i -= 1 {
60
+		bytes[i] += 1
61
+		if bytes[i] != 0 {
62
+			break
63
+		} // else: overflow, carry to the next place
64
+	}
65
+	return B32Encoder.EncodeToString(bytes)
66
+}
67
+
45 68
 // securely check if a supplied token matches a stored token
46 69
 func SecretTokensMatch(storedToken string, suppliedToken string) bool {
47 70
 	// XXX fix a potential gotcha: if the stored token is uninitialized,

+ 29
- 0
irc/utils/crypto_test.go 查看文件

@@ -47,12 +47,41 @@ func TestTokenCompare(t *testing.T) {
47 47
 	}
48 48
 }
49 49
 
50
+func TestMunging(t *testing.T) {
51
+	count := 131072
52
+	set := make(map[string]bool)
53
+	var token string
54
+	for i := 0; i < count; i++ {
55
+		token = GenerateSecretToken()
56
+		set[token] = true
57
+	}
58
+	// all tokens generated thus far should be unique
59
+	assertEqual(len(set), count, t)
60
+
61
+	// iteratively munge the last generated token an additional `count` times
62
+	mungedToken := token
63
+	for i := 0; i < count; i++ {
64
+		mungedToken = MungeSecretToken(mungedToken)
65
+		assertEqual(len(mungedToken), len(token), t)
66
+		set[mungedToken] = true
67
+	}
68
+	// munged tokens should not collide with generated tokens, or each other
69
+	assertEqual(len(set), count*2, t)
70
+}
71
+
50 72
 func BenchmarkGenerateSecretToken(b *testing.B) {
51 73
 	for i := 0; i < b.N; i++ {
52 74
 		GenerateSecretToken()
53 75
 	}
54 76
 }
55 77
 
78
+func BenchmarkMungeSecretToken(b *testing.B) {
79
+	t := GenerateSecretToken()
80
+	for i := 0; i < b.N; i++ {
81
+		t = MungeSecretToken(t)
82
+	}
83
+}
84
+
56 85
 func TestCertfpComparisons(t *testing.T) {
57 86
 	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"
58 87
 	oragonoFP := "3d6b11bfb405c3f84b38cd3038fbec0171d50354790407884ca55d23418566c9"

+ 1
- 1
irc/znc.go 查看文件

@@ -189,7 +189,7 @@ func zncPlaybackPlayHandler(client *Client, command string, params []string, rb
189 189
 }
190 190
 
191 191
 func zncPlayPrivmsgsFrom(client *Client, rb *ResponseBuffer, target string, start, end time.Time) {
192
-	_, sequence, err := client.server.GetHistorySequence(nil, client, target, 0)
192
+	_, sequence, err := client.server.GetHistorySequence(nil, client, target)
193 193
 	if sequence == nil || err != nil {
194 194
 		return
195 195
 	}

Loading…
取消
儲存