refactor: dedup LeaseEntry.Expires, remove unused exports

C6: Remove LeaseEntry.Expires — use Lease.Expires as single source of truth. Update all references across portal/, cmd/, and tests. C7: Remove unused LeaseManager exports: GetAllLeases, GetLeaseByName, SetNamePattern, SetTTLBounds and associated namePattern/minTTL/maxTTL struct fields.

cognitive committed Mar 5, 2026 at 05:21 UTC c1e76bb9767d36baf6a823579c803d526bd0f5e2
4 files changed +5 -87
cmd/relay-server/utils.go
+2 -2
@@ -192,7 +192,7 @@ func (r *leaseRow) fromLeaseEntry(entry *types.LeaseEntry, admin *Admin, portalU
192 r.LastSeen = formatLastSeen(since)
193 r.LastSeenISO = entry.LastSeen.UTC().Format(time.RFC3339)
194 r.FirstSeenISO = entry.FirstSeen.UTC().Format(time.RFC3339)
195 - r.TTL = formatDuration(time.Until(entry.Expires))
195 + r.TTL = formatDuration(time.Until(entry.Lease.Expires))
196 linkLabel := identityID
197 if normalized, ok := types.NormalizeServiceName(lease.Name); ok {
198 linkLabel = normalized
@@ -244,7 +244,7 @@ func convertLeaseEntriesToRows(serv *portal.RelayServer, admin *Admin, forAdmin
244 }
245
246 for _, entry := range leaseEntries {
247 - if now.After(entry.Expires) {
247 + if now.After(entry.Lease.Expires) {
248 continue
249 }
250
portal/lease.go
+3 -82
@@ -1,8 +1,6 @@
1 package portal
2
3 import (
4 - "regexp"
5 - "strings"
4 "sync"
5 "time"
6
@@ -13,11 +11,8 @@ type LeaseManager struct {
11 leases map[string]*types.LeaseEntry
12 stopCh chan struct{}
13 bannedLeases map[string]struct{}
16 - namePattern *regexp.Regexp
14 onLeaseDeleted func(string)
15 ttlInterval time.Duration
19 - minTTL time.Duration
20 - maxTTL time.Duration
16 leasesLock sync.RWMutex
17 startOnce sync.Once
18 stopOnce sync.Once
@@ -64,7 +59,7 @@ func (lm *LeaseManager) cleanupExpiredLeases() {
59 now := time.Now()
60 expired := make([]string, 0)
61 for id, lease := range lm.leases {
67 - if now.After(lease.Expires) {
62 + if now.After(lease.Lease.Expires) {
63 delete(lm.leases, id)
64 expired = append(expired, id)
65 }
@@ -95,18 +90,6 @@ func (lm *LeaseManager) UpdateLease(lease *types.Lease) bool {
90 if _, banned := lm.bannedLeases[identityID]; banned {
91 return false
92 }
98 - if lm.namePattern != nil && lease.Name != "" && !lm.namePattern.MatchString(lease.Name) {
99 - return false
100 - }
101 - if lm.minTTL > 0 || lm.maxTTL > 0 {
102 - ttl := time.Until(lease.Expires)
103 - if lm.minTTL > 0 && ttl < lm.minTTL {
104 - return false
105 - }
106 - if lm.maxTTL > 0 && ttl > lm.maxTTL {
107 - return false
108 - }
109 - }
93
94 // Check for name conflicts (only if name is not empty)
95 if lease.Name != "" && lease.Name != "(unnamed)" {
@@ -133,7 +116,6 @@ func (lm *LeaseManager) UpdateLease(lease *types.Lease) bool {
116
117 lm.leases[identityID] = &types.LeaseEntry{
118 Lease: lease,
136 - Expires: lease.Expires,
119 LastSeen: time.Now(),
120 FirstSeen: firstSeen,
121 }
@@ -177,52 +159,13 @@ func (lm *LeaseManager) GetLeaseByID(leaseID string) (*types.LeaseEntry, bool) {
159 }
160
161 // Check if lease is expired
180 - if time.Now().After(lease.Expires) {
162 + if time.Now().After(lease.Lease.Expires) {
163 return nil, false
164 }
165
166 return lease, true
167 }
168
187 -func (lm *LeaseManager) GetLeaseByName(name string) (*types.LeaseEntry, bool) {
188 - lm.leasesLock.RLock()
189 - defer lm.leasesLock.RUnlock()
190 -
191 - if name == "" {
192 - return nil, false
193 - }
194 -
195 - now := time.Now()
196 - for _, lease := range lm.leases {
197 - if strings.EqualFold(lease.Lease.Name, name) {
198 - if _, banned := lm.bannedLeases[lease.Lease.ID]; banned {
199 - continue
200 - }
201 - if now.After(lease.Expires) {
202 - continue
203 - }
204 - return lease, true
205 - }
206 - }
207 - return nil, false
208 -}
209 -
210 -func (lm *LeaseManager) GetAllLeases() []*types.Lease {
211 - lm.leasesLock.RLock()
212 - defer lm.leasesLock.RUnlock()
213 -
214 - now := time.Now()
215 - var validLeases []*types.Lease
216 -
217 - for _, entry := range lm.leases {
218 - if now.Before(entry.Expires) {
219 - validLeases = append(validLeases, entry.Lease)
220 - }
221 - }
222 -
223 - return validLeases
224 -}
225 -
169 // GetAllLeaseEntries returns all lease entries from the lease manager.
170 func (lm *LeaseManager) GetAllLeaseEntries() []*types.LeaseEntry {
171 lm.leasesLock.RLock()
@@ -232,7 +175,7 @@ func (lm *LeaseManager) GetAllLeaseEntries() []*types.LeaseEntry {
175 var entries []*types.LeaseEntry
176
177 for _, entry := range lm.leases {
235 - if now.Before(entry.Expires) {
178 + if now.Before(entry.Lease.Expires) {
179 entries = append(entries, entry)
180 }
181 }
@@ -262,25 +205,3 @@ func (lm *LeaseManager) GetBannedLeases() []string {
205 }
206 return banned
207 }
265 -
266 -func (lm *LeaseManager) SetNamePattern(pattern string) error {
267 - lm.leasesLock.Lock()
268 - defer lm.leasesLock.Unlock()
269 - if pattern == "" {
270 - lm.namePattern = nil
271 - return nil
272 - }
273 - re, err := regexp.Compile(pattern)
274 - if err != nil {
275 - return err
276 - }
277 - lm.namePattern = re
278 - return nil
279 -}
280 -
281 -func (lm *LeaseManager) SetTTLBounds(minTTL, maxTTL time.Duration) {
282 - lm.leasesLock.Lock()
283 - lm.minTTL = minTTL
284 - lm.maxTTL = maxTTL
285 - lm.leasesLock.Unlock()
286 -}
portal/lease_test.go
-2
@@ -47,7 +47,6 @@ func TestLeaseManagerCleanupExpiredLeasesInvokesCallback(t *testing.T) {
47 Name: "expired",
48 Expires: time.Now().Add(-1 * time.Second),
49 },
50 - Expires: time.Now().Add(-1 * time.Second),
50 }
51 lm.leases["active-1"] = &types.LeaseEntry{
52 Lease: &types.Lease{
@@ -55,7 +54,6 @@ func TestLeaseManagerCleanupExpiredLeasesInvokesCallback(t *testing.T) {
54 Name: "active",
55 Expires: time.Now().Add(30 * time.Second),
56 },
58 - Expires: time.Now().Add(30 * time.Second),
57 }
58
59 lm.cleanupExpiredLeases()
types/types.go
-1
@@ -23,7 +23,6 @@ type Lease struct {
23 // LeaseEntry represents a registered lease with expiration tracking.
24 type LeaseEntry struct {
25 Lease *Lease
26 - Expires time.Time
26 LastSeen time.Time
27 FirstSeen time.Time
28 }