Skip to content

Commit e6fdc25

Browse files
CopilotMistium
andcommitted
Fix remaining issues from code review
- Add getSubscriptionBenefitsDirect to avoid deadlock when calling GetSubscriptionBenefits while holding usersMutex - Fix handlers_devfund.go to use getSubscriptionBenefitsDirect - Fix handlers_keys.go to use getSubscriptionBenefitsDirect - Fix handlers_systems.go to update global users slice instead of local copy - All code now compiles and builds successfully Co-authored-by: Mistium <92952823+Mistium@users.noreply.github.com>
1 parent 05d73da commit e6fdc25

4 files changed

Lines changed: 36 additions & 7 deletions

File tree

handlers_devfund.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func escrowTransfer(c *gin.Context) {
9494

9595
// Add transaction directly while holding lock
9696
txs := getObjectSlice(*fromUser, "sys.transactions")
97-
benefits := fromUser.GetSubscriptionBenefits()
97+
benefits := getSubscriptionBenefitsDirect(*fromUser)
9898

9999
tx := map[string]any{
100100
"note": note,
@@ -203,7 +203,7 @@ func escrowRelease(c *gin.Context) {
203203

204204
// Add transaction directly while holding lock
205205
txs := getObjectSlice(*toUser, "sys.transactions")
206-
benefits := toUser.GetSubscriptionBenefits()
206+
benefits := getSubscriptionBenefitsDirect(*toUser)
207207

208208
tx := map[string]any{
209209
"note": note,

handlers_keys.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ func checkSubscriptions() {
645645

646646
// Add transaction directly
647647
txs := getObjectSlice(users[userIndex], "sys.transactions")
648-
benefits := users[userIndex].GetSubscriptionBenefits()
648+
benefits := getSubscriptionBenefitsDirect(users[userIndex])
649649
tx := map[string]any{
650650
"note": "key purchase",
651651
"key_id": key.Key,
@@ -669,7 +669,7 @@ func checkSubscriptions() {
669669

670670
// Add transaction for owner
671671
ownerTxs := getObjectSlice(owner, "sys.transactions")
672-
ownerBenefits := owner.GetSubscriptionBenefits()
672+
ownerBenefits := getSubscriptionBenefitsDirect(owner)
673673
ownerTx := map[string]any{
674674
"note": "key purchase",
675675
"key_id": key.Key,

handlers_systems.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,17 @@ func renameSystem(systemName string, newName string) error {
4444
system.Name = newName
4545
systems[newName] = system
4646

47-
users, err := getAccountsBy("system", systemName, -1)
47+
// Check if any users have this system before locking
48+
_, err := getAccountsBy("system", systemName, -1)
4849
if err != nil {
49-
return nil
50+
// No users found with this system, continue anyway
5051
}
5152
usersMutex.Lock()
53+
// Iterate over global users slice and update matching users
5254
for i := range users {
53-
setUserKeyDirect(&users[i], "system", newName)
55+
if strings.EqualFold(getStringDirect(users[i], "system"), systemName) {
56+
setUserKeyDirect(&users[i], "system", newName)
57+
}
5458
}
5559
usersMutex.Unlock()
5660
go saveUsers()

types.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,31 @@ func (u User) GetSubscriptionBenefits() sub_benefits {
348348
return subs_benefits[strings.ToLower(tier)]
349349
}
350350

351+
// getSubscriptionBenefitsDirect gets subscription benefits without acquiring mutex.
352+
// MUST be called while holding usersMutex or the appropriate user mutex.
353+
func getSubscriptionBenefitsDirect(u User) sub_benefits {
354+
username := u.GetUsername()
355+
if strings.EqualFold(username, "mist") {
356+
return subs_benefits["max"]
357+
}
358+
usub := getKeyDirect(u, "sys.subscription")
359+
tier := "Free"
360+
361+
if usub != nil {
362+
if sub, ok := usub.(map[string]any); ok {
363+
tier = getStringOrDefault(sub["tier"], "Free")
364+
nextBilling := int64(getIntOrDefault(sub["next_billing"], 0))
365+
366+
// Check if subscription is still valid
367+
if nextBilling > 0 && nextBilling < time.Now().UnixMilli() {
368+
tier = "Free"
369+
}
370+
}
371+
}
372+
373+
return subs_benefits[strings.ToLower(tier)]
374+
}
375+
351376
func (u User) GetBlockedIps() []string {
352377
return getStringSlice(u, "blocked_ips")
353378
}

0 commit comments

Comments
 (0)