Преглед на файлове

fix #1676

Fix various pagination issues with CHATHISTORY; also undo #491
(msgid munging).
tags/v2.8.0-rc1
Shivaram Lingamneni преди 2 години
родител
ревизия
5bbee02fe6
променени са 13 файла, в които са добавени 126 реда и са изтрити 81 реда
  1. 1
    1
      default.yaml
  2. 9
    9
      irc/channel.go
  3. 4
    4
      irc/client.go
  4. 12
    2
      irc/handlers.go
  5. 19
    5
      irc/history/history.go
  6. 2
    2
      irc/history/history_test.go
  7. 21
    0
      irc/history/queries.go
  8. 1
    1
      irc/histserv.go
  9. 53
    1
      irc/mysql/history.go
  10. 3
    3
      irc/server.go
  11. 0
    23
      irc/utils/crypto.go
  12. 0
    29
      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, "")
920
+		_, seq, _ := channel.server.GetHistorySequence(channel, client, "", 0)
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, "")
938
+			_, seq, _ := channel.server.GetHistorySequence(channel, client, "", 0)
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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1087
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1097
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1104
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1114
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1121
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1128
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, utils.MungeSecretToken(item.Message.Msgid), histservService.prefix, "*", false, nil, "PRIVMSG", chname, message)
1140
+				rb.AddFromClient(item.Message.Time, history.HistservMungeMsgid(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, 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))
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))
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, "")
1716
+		_, seq, err := client.server.GetHistorySequence(channel, client, "", 0)
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, "")
1737
+	_, cSeq, err := client.server.GetHistorySequence(nil, client, "", 0)
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)
1761
+		_, seq, err := client.server.GetHistorySequence(nil, client, target.CfName, 0)
1762 1762
 		if err == nil && seq != nil {
1763 1763
 			items, err := seq.Between(start, end, messageLimit)
1764 1764
 			if err == nil {

+ 12
- 2
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 = value, nil
643
+			msgid, err = history.NormalizeMsgid(value), nil
644 644
 			return
645 645
 		} else if identifier == "timestamp" {
646 646
 			timestamp, err = time.Parse(IRCv3TimestampFormat, value)
@@ -725,7 +725,17 @@ 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
-		channel, sequence, err = server.GetHistorySequence(nil, client, target)
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)
729 739
 		if err != nil || sequence == nil {
730 740
 			return
731 741
 		}

+ 19
- 5
irc/history/history.go Целия файл

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

+ 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)
18
+	result, complete, _ = buf.betweenHelper(Selector{Time: start}, Selector{Time: end}, time.Time{}, nil, limit, 0)
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.Error("should be able to store items in a nonempty buffer")
48
+		t.Errorf("should be able to store items in a nonempty buffer: expected %d, got %d", 1, len(since))
49 49
 	}
50 50
 	if !complete {
51 51
 		t.Error("results should be complete")

+ 21
- 0
irc/history/queries.go Целия файл

@@ -4,9 +4,17 @@
4 4
 package history
5 5
 
6 6
 import (
7
+	"strings"
7 8
 	"time"
8 9
 )
9 10
 
11
+type ExcludeFlags uint
12
+
13
+const (
14
+	ExcludeTagmsg ExcludeFlags = 1 << iota
15
+	ExcludeJoins
16
+)
17
+
10 18
 // Selector represents a parameter to a CHATHISTORY command
11 19
 type Selector struct {
12 20
 	Msgid string
@@ -77,3 +85,16 @@ func MinMaxAsc(after, before, cutoff time.Time) (min, max time.Time, ascending b
77 85
 	}
78 86
 	return after, before, ascending
79 87
 }
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])
202
+	channel, sequence, err := server.GetHistorySequence(nil, client, params[0], 0)
203 203
 
204 204
 	if sequence == nil || err != nil {
205 205
 		return nil, nil, errNoSuchChannel

+ 53
- 1
irc/mysql/history.go Целия файл

@@ -40,6 +40,10 @@ 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
43 47
 )
44 48
 
45 49
 type e struct{}
@@ -1033,9 +1037,18 @@ type mySQLHistorySequence struct {
1033 1037
 	target        string
1034 1038
 	correspondent string
1035 1039
 	cutoff        time.Time
1040
+	excludeFlags  history.ExcludeFlags
1036 1041
 }
1037 1042
 
1038 1043
 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) {
1039 1052
 	ctx, cancel := context.WithTimeout(context.Background(), s.mysql.getTimeout())
1040 1053
 	defer cancel()
1041 1054
 
@@ -1058,7 +1071,45 @@ func (s *mySQLHistorySequence) Between(start, end history.Selector, limit int) (
1058 1071
 	return results, err
1059 1072
 }
1060 1073
 
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
+
1061 1105
 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
+	}()
1062 1113
 	return history.GenericAround(s, start, limit)
1063 1114
 }
1064 1115
 
@@ -1083,11 +1134,12 @@ func (seq *mySQLHistorySequence) Ephemeral() bool {
1083 1134
 	return false
1084 1135
 }
1085 1136
 
1086
-func (mysql *MySQL) MakeSequence(target, correspondent string, cutoff time.Time) history.Sequence {
1137
+func (mysql *MySQL) MakeSequence(target, correspondent string, cutoff time.Time, excludeFlags history.ExcludeFlags) history.Sequence {
1087 1138
 	return &mySQLHistorySequence{
1088 1139
 		target:        target,
1089 1140
 		correspondent: correspondent,
1090 1141
 		mysql:         mysql,
1091 1142
 		cutoff:        cutoff,
1143
+		excludeFlags:  excludeFlags,
1092 1144
 	}
1093 1145
 }

+ 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) (channel *Channel, sequence history.Sequence, err error) {
865
+func (server *Server) GetHistorySequence(providedChannel *Channel, client *Client, query string, excludeFlags history.ExcludeFlags) (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)
943
+		sequence = hist.MakeSequence(correspondent, cutoff, excludeFlags)
944 944
 	} else if target != "" {
945
-		sequence = server.historyDB.MakeSequence(target, correspondent, cutoff)
945
+		sequence = server.historyDB.MakeSequence(target, correspondent, cutoff, excludeFlags)
946 946
 	}
947 947
 	return
948 948
 }

+ 0
- 23
irc/utils/crypto.go Целия файл

@@ -42,29 +42,6 @@ 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
-
68 45
 // securely check if a supplied token matches a stored token
69 46
 func SecretTokensMatch(storedToken string, suppliedToken string) bool {
70 47
 	// XXX fix a potential gotcha: if the stored token is uninitialized,

+ 0
- 29
irc/utils/crypto_test.go Целия файл

@@ -47,41 +47,12 @@ 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
-
72 50
 func BenchmarkGenerateSecretToken(b *testing.B) {
73 51
 	for i := 0; i < b.N; i++ {
74 52
 		GenerateSecretToken()
75 53
 	}
76 54
 }
77 55
 
78
-func BenchmarkMungeSecretToken(b *testing.B) {
79
-	t := GenerateSecretToken()
80
-	for i := 0; i < b.N; i++ {
81
-		t = MungeSecretToken(t)
82
-	}
83
-}
84
-
85 56
 func TestCertfpComparisons(t *testing.T) {
86 57
 	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"
87 58
 	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)
192
+	_, sequence, err := client.server.GetHistorySequence(nil, client, target, 0)
193 193
 	if sequence == nil || err != nil {
194 194
 		return
195 195
 	}

Loading…
Отказ
Запис