Browse Source

Remember when client joins channels, expose in EXTJWT

tags/v2.2.0-rc1
Daniel Oaks 4 years ago
parent
commit
4164c643e6
2 changed files with 26 additions and 6 deletions
  1. 19
    5
      irc/channel.go
  2. 7
    1
      irc/handlers.go

+ 19
- 5
irc/channel.go View File

30
 	key               string
30
 	key               string
31
 	members           MemberSet
31
 	members           MemberSet
32
 	membersCache      []*Client // allow iteration over channel members without holding the lock
32
 	membersCache      []*Client // allow iteration over channel members without holding the lock
33
+	memberJoinTimes   map[*Client]time.Time
33
 	name              string
34
 	name              string
34
 	nameCasefolded    string
35
 	nameCasefolded    string
35
 	server            *Server
36
 	server            *Server
57
 	config := s.Config()
58
 	config := s.Config()
58
 
59
 
59
 	channel := &Channel{
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
 	channel.initializeLists()
69
 	channel.initializeLists()
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
 func (channel *Channel) ClientHasPrivsOver(client *Client, target *Client) bool {
565
 func (channel *Channel) ClientHasPrivsOver(client *Client, target *Client) bool {
554
 	channel.stateMutex.RLock()
566
 	channel.stateMutex.RLock()
555
 	founder := channel.registeredFounder
567
 	founder := channel.registeredFounder
726
 			defer channel.stateMutex.Unlock()
738
 			defer channel.stateMutex.Unlock()
727
 
739
 
728
 			channel.members.Add(client)
740
 			channel.members.Add(client)
741
+			channel.memberJoinTimes[client] = time.Now()
729
 			firstJoin := len(channel.members) == 1
742
 			firstJoin := len(channel.members) == 1
730
 			newChannel := firstJoin && channel.registeredFounder == ""
743
 			newChannel := firstJoin && channel.registeredFounder == ""
731
 			if newChannel {
744
 			if newChannel {
1364
 
1377
 
1365
 		channel.stateMutex.Lock()
1378
 		channel.stateMutex.Lock()
1366
 		channel.members.Remove(client)
1379
 		channel.members.Remove(client)
1380
+		delete(channel.memberJoinTimes, client)
1367
 		channelEmpty := len(channel.members) == 0
1381
 		channelEmpty := len(channel.members) == 0
1368
 		channel.stateMutex.Unlock()
1382
 		channel.stateMutex.Unlock()
1369
 		channel.regenerateMembersCache()
1383
 		channel.regenerateMembersCache()

+ 7
- 1
irc/handlers.go View File

939
 		claims["joined"] = 0
939
 		claims["joined"] = 0
940
 		claims["cmodes"] = []string{}
940
 		claims["cmodes"] = []string{}
941
 		if channel.hasClient(client) {
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
 			claims["cmodes"] = channel.ClientModeStrings(client)
949
 			claims["cmodes"] = channel.ClientModeStrings(client)
944
 		}
950
 		}
945
 	}
951
 	}

Loading…
Cancel
Save