diff --git a/server/server_account.go b/server/server_account.go index ac3407f5..640b327a 100644 --- a/server/server_account.go +++ b/server/server_account.go @@ -40,9 +40,7 @@ func (s *Server) handleAccountGet(w http.ResponseWriter, r *http.Request, v *vis return err } response := &apiAccountSettingsResponse{ - Usage: &apiAccountUsageLimits{ - Basis: "ip", - }, + Usage: &apiAccountUsageLimits{}, } if v.user != nil { response.Username = v.user.Name @@ -66,11 +64,37 @@ func (s *Server) handleAccountGet(w http.ResponseWriter, r *http.Request, v *vis EmailsLimit: v.user.Plan.EmailsLimit, AttachmentsBytesLimit: v.user.Plan.AttachmentBytesLimit, } + } else { + if v.user.Role == auth.RoleAdmin { + response.Usage.Basis = "account" + response.Plan = &apiAccountSettingsPlan{ + Name: "Unlimited", + MessagesLimit: 0, + EmailsLimit: 0, + AttachmentsBytesLimit: 0, + } + } else { + response.Usage.Basis = "ip" + response.Plan = &apiAccountSettingsPlan{ + Name: "Free", + MessagesLimit: s.config.VisitorRequestLimitBurst, + EmailsLimit: s.config.VisitorEmailLimitBurst, + AttachmentsBytesLimit: s.config.VisitorAttachmentTotalSizeLimit, + } + } } } else { response.Username = auth.Everyone response.Role = string(auth.RoleAnonymous) + response.Usage.Basis = "account" + response.Plan = &apiAccountSettingsPlan{ + Name: "Anonymous", + MessagesLimit: s.config.VisitorRequestLimitBurst, + EmailsLimit: s.config.VisitorEmailLimitBurst, + AttachmentsBytesLimit: s.config.VisitorAttachmentTotalSizeLimit, + } } + response.Usage.Messages = int(v.requests.Tokens()) response.Usage.AttachmentsBytes = stats.VisitorAttachmentBytesUsed if err := json.NewEncoder(w).Encode(response); err != nil { return err diff --git a/server/visitor.go b/server/visitor.go index f3310693..96328aa9 100644 --- a/server/visitor.go +++ b/server/visitor.go @@ -45,12 +45,18 @@ type visitorStats struct { } func newVisitor(conf *Config, messageCache *messageCache, ip netip.Addr, user *auth.User) *visitor { + var requests *rate.Limiter + if user != nil && user.Plan != nil { + requests = rate.NewLimiter(rate.Limit(user.Plan.MessagesLimit)*rate.Every(24*time.Hour), user.Plan.MessagesLimit) + } else { + requests = rate.NewLimiter(rate.Every(conf.VisitorRequestLimitReplenish), conf.VisitorRequestLimitBurst) + } return &visitor{ config: conf, messageCache: messageCache, ip: ip, user: user, - requests: rate.NewLimiter(rate.Every(conf.VisitorRequestLimitReplenish), conf.VisitorRequestLimitBurst), + requests: requests, emails: rate.NewLimiter(rate.Every(conf.VisitorEmailLimitReplenish), conf.VisitorEmailLimitBurst), subscriptions: util.NewFixedLimiter(int64(conf.VisitorSubscriptionLimit)), bandwidth: util.NewBytesLimiter(conf.VisitorAttachmentDailyBandwidthLimit, 24*time.Hour),