Parcourir la source

Remember when client joins channels, expose in EXTJWT

tags/v2.2.0-rc1
Daniel Oaks il y a 4 ans
Parent
révision
4164c643e6
2 fichiers modifiés avec 26 ajouts et 6 suppressions
  1. 19
    5
      irc/channel.go
  2. 7
    1
      irc/handlers.go

+ 19
- 5
irc/channel.go Voir le fichier

@@ -30,6 +30,7 @@ type Channel struct {
30 30
 	key               string
31 31
 	members           MemberSet
32 32
 	membersCache      []*Client // allow iteration over channel members without holding the lock
33
+	memberJoinTimes   map[*Client]time.Time
33 34
 	name              string
34 35
 	nameCasefolded    string
35 36
 	server            *Server
@@ -57,11 +58,12 @@ func NewChannel(s *Server, name, casefoldedName string, registered bool) *Channe
57 58
 	config := s.Config()
58 59
 
59 60
 	channel := &Channel{
60
-		createdTime:    time.Now().UTC(), // may be overwritten by applyRegInfo
61
-		members:        make(MemberSet),
62
-		name:           name,
63
-		nameCasefolded: casefoldedName,
64
-		server:         s,
61
+		createdTime:     time.Now().UTC(), // may be overwritten by applyRegInfo
62
+		members:         make(MemberSet),
63
+		memberJoinTimes: make(map[*Client]time.Time),
64
+		name:            name,
65
+		nameCasefolded:  casefoldedName,
66
+		server:          s,
65 67
 	}
66 68
 
67 69
 	channel.initializeLists()
@@ -550,6 +552,16 @@ func (channel *Channel) ClientModeStrings(client *Client) []string {
550 552
 	}
551 553
 }
552 554
 
555
+func (channel *Channel) ClientJoinTime(client *Client) *time.Time {
556
+	channel.stateMutex.RLock()
557
+	defer channel.stateMutex.RUnlock()
558
+	time, present := channel.memberJoinTimes[client]
559
+	if present {
560
+		return &time
561
+	}
562
+	return nil
563
+}
564
+
553 565
 func (channel *Channel) ClientHasPrivsOver(client *Client, target *Client) bool {
554 566
 	channel.stateMutex.RLock()
555 567
 	founder := channel.registeredFounder
@@ -726,6 +738,7 @@ func (channel *Channel) Join(client *Client, key string, isSajoin bool, rb *Resp
726 738
 			defer channel.stateMutex.Unlock()
727 739
 
728 740
 			channel.members.Add(client)
741
+			channel.memberJoinTimes[client] = time.Now()
729 742
 			firstJoin := len(channel.members) == 1
730 743
 			newChannel := firstJoin && channel.registeredFounder == ""
731 744
 			if newChannel {
@@ -1364,6 +1377,7 @@ func (channel *Channel) Quit(client *Client) {
1364 1377
 
1365 1378
 		channel.stateMutex.Lock()
1366 1379
 		channel.members.Remove(client)
1380
+		delete(channel.memberJoinTimes, client)
1367 1381
 		channelEmpty := len(channel.members) == 0
1368 1382
 		channel.stateMutex.Unlock()
1369 1383
 		channel.regenerateMembersCache()

+ 7
- 1
irc/handlers.go Voir le fichier

@@ -939,7 +939,13 @@ func extjwtHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Re
939 939
 		claims["joined"] = 0
940 940
 		claims["cmodes"] = []string{}
941 941
 		if channel.hasClient(client) {
942
-			claims["joined"] = time.Now().Unix() - 100 //TODO(dan): um we need to store when clients joined for reals
942
+			joinTime := channel.ClientJoinTime(client)
943
+			if joinTime == nil {
944
+				// shouldn't happen, only in races
945
+				rb.Add(nil, server.name, "FAIL", "EXTJWT", "UNKNOWN_ERROR", client.t("Channel join time is inconsistent, JWT not generated"))
946
+				return false
947
+			}
948
+			claims["joined"] = joinTime.Unix()
943 949
 			claims["cmodes"] = channel.ClientModeStrings(client)
944 950
 		}
945 951
 	}

Chargement…
Annuler
Enregistrer