mirror of
https://github.com/ghostersk/gowebmail.git
synced 2026-09-13 23:30:37 +01:00
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package pgp
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/ProtonMail/go-crypto/openpgp"
|
|
)
|
|
|
|
// Cache holds unlocked (passphrase-decrypted) PGP identities in memory, scoped to the
|
|
// session that unlocked them — never written to disk. No TTL: memory-bounded by active
|
|
// sessions, cleared only on explicit logout (see internal/handlers/auth.go Logout).
|
|
type Cache struct {
|
|
mu sync.Mutex
|
|
byTok map[string]map[int64]*openpgp.Entity // sessionToken -> identityID -> unlocked entity
|
|
}
|
|
|
|
// NewCache creates an empty unlocked-key cache.
|
|
func NewCache() *Cache {
|
|
return &Cache{byTok: make(map[string]map[int64]*openpgp.Entity)}
|
|
}
|
|
|
|
// Get returns the unlocked entity for identityID under sessionToken, if present.
|
|
func (c *Cache) Get(sessionToken string, identityID int64) (*openpgp.Entity, bool) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
m, ok := c.byTok[sessionToken]
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
e, ok := m[identityID]
|
|
return e, ok
|
|
}
|
|
|
|
// Put stores an unlocked entity under sessionToken.
|
|
func (c *Cache) Put(sessionToken string, identityID int64, entity *openpgp.Entity) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
m, ok := c.byTok[sessionToken]
|
|
if !ok {
|
|
m = make(map[int64]*openpgp.Entity)
|
|
c.byTok[sessionToken] = m
|
|
}
|
|
m[identityID] = entity
|
|
}
|
|
|
|
// ClearSession discards every unlocked identity for a session (call on logout).
|
|
func (c *Cache) ClearSession(sessionToken string) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
delete(c.byTok, sessionToken)
|
|
}
|