2021-12-19 04:02:36 +01:00
|
|
|
package server
|
2021-10-24 03:29:45 +02:00
|
|
|
|
2021-10-24 04:49:50 +02:00
|
|
|
import (
|
2022-07-03 21:07:57 +02:00
|
|
|
"io/fs"
|
2022-10-05 22:42:07 +02:00
|
|
|
"net/netip"
|
2021-10-24 04:49:50 +02:00
|
|
|
"time"
|
2023-05-24 21:36:01 +02:00
|
|
|
|
|
|
|
"heckel.io/ntfy/user"
|
2021-10-24 04:49:50 +02:00
|
|
|
)
|
|
|
|
|
2022-01-13 00:52:07 +01:00
|
|
|
// Defines default config settings (excluding limits, see below)
|
2021-10-24 03:29:45 +02:00
|
|
|
const (
|
2022-06-01 05:27:24 +02:00
|
|
|
DefaultListenHTTP = ":80"
|
|
|
|
DefaultCacheDuration = 12 * time.Hour
|
|
|
|
DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
|
|
|
|
DefaultManagerInterval = time.Minute
|
|
|
|
DefaultDelayedSenderInterval = 10 * time.Second
|
|
|
|
DefaultMinDelay = 10 * time.Second
|
|
|
|
DefaultMaxDelay = 3 * 24 * time.Hour
|
|
|
|
DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
|
|
|
|
DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
|
|
|
|
DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
|
2023-02-09 04:57:10 +01:00
|
|
|
DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
|
2021-10-24 04:49:50 +02:00
|
|
|
)
|
|
|
|
|
2022-01-13 00:52:07 +01:00
|
|
|
// Defines all global and per-visitor limits
|
|
|
|
// - message size limit: the max number of bytes for a message
|
2022-01-04 00:55:08 +01:00
|
|
|
// - total topic limit: max number of topics overall
|
2022-01-13 00:52:07 +01:00
|
|
|
// - various attachment limits
|
|
|
|
const (
|
|
|
|
DefaultMessageLengthLimit = 4096 // Bytes
|
|
|
|
DefaultTotalTopicLimit = 15000
|
2022-01-13 03:24:48 +01:00
|
|
|
DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
|
|
|
|
DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
|
2022-01-13 00:52:07 +01:00
|
|
|
DefaultAttachmentExpiryDuration = 3 * time.Hour
|
|
|
|
)
|
|
|
|
|
|
|
|
// Defines all per-visitor limits
|
2022-01-04 00:55:08 +01:00
|
|
|
// - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
|
2022-02-14 23:07:17 +01:00
|
|
|
// - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
|
2021-12-24 00:03:04 +01:00
|
|
|
// - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
|
2022-01-13 00:52:07 +01:00
|
|
|
// - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
|
2022-01-13 03:24:48 +01:00
|
|
|
// - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
|
2021-11-05 18:46:27 +01:00
|
|
|
const (
|
2022-01-13 03:24:48 +01:00
|
|
|
DefaultVisitorSubscriptionLimit = 30
|
|
|
|
DefaultVisitorRequestLimitBurst = 60
|
2022-02-14 23:07:17 +01:00
|
|
|
DefaultVisitorRequestLimitReplenish = 5 * time.Second
|
2023-01-27 04:57:18 +01:00
|
|
|
DefaultVisitorMessageDailyLimit = 0
|
2022-01-13 03:24:48 +01:00
|
|
|
DefaultVisitorEmailLimitBurst = 16
|
|
|
|
DefaultVisitorEmailLimitReplenish = time.Hour
|
2023-01-26 04:26:04 +01:00
|
|
|
DefaultVisitorAccountCreationLimitBurst = 3
|
|
|
|
DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
|
2023-03-08 20:51:47 +01:00
|
|
|
DefaultVisitorAuthFailureLimitBurst = 30
|
2023-02-08 21:20:44 +01:00
|
|
|
DefaultVisitorAuthFailureLimitReplenish = time.Minute
|
2022-01-13 03:24:48 +01:00
|
|
|
DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
|
|
|
|
DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
|
2021-10-24 03:29:45 +02:00
|
|
|
)
|
|
|
|
|
2023-01-11 04:51:51 +01:00
|
|
|
var (
|
|
|
|
// DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
|
|
|
|
DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
|
2023-02-09 14:32:51 +01:00
|
|
|
|
|
|
|
// DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
|
|
|
|
// extended using the server.yml config. If updated, also update in Android and web app.
|
2023-03-16 03:34:06 +01:00
|
|
|
DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
|
2023-01-11 04:51:51 +01:00
|
|
|
)
|
|
|
|
|
2021-10-24 03:29:45 +02:00
|
|
|
// Config is the main config struct for the application. Use New to instantiate a default config struct.
|
|
|
|
type Config struct {
|
2023-02-08 21:20:44 +01:00
|
|
|
File string // Config file, only used for testing
|
2022-01-13 03:24:48 +01:00
|
|
|
BaseURL string
|
|
|
|
ListenHTTP string
|
|
|
|
ListenHTTPS string
|
2022-01-15 02:16:12 +01:00
|
|
|
ListenUnix string
|
2022-07-03 21:07:57 +02:00
|
|
|
ListenUnixMode fs.FileMode
|
2022-01-13 03:24:48 +01:00
|
|
|
KeyFile string
|
|
|
|
CertFile string
|
|
|
|
FirebaseKeyFile string
|
|
|
|
CacheFile string
|
|
|
|
CacheDuration time.Duration
|
2022-06-23 17:02:45 +02:00
|
|
|
CacheStartupQueries string
|
2022-11-16 16:28:20 +01:00
|
|
|
CacheBatchSize int
|
|
|
|
CacheBatchTimeout time.Duration
|
2022-01-23 05:01:20 +01:00
|
|
|
AuthFile string
|
2023-01-05 21:20:44 +01:00
|
|
|
AuthStartupQueries string
|
2023-01-03 03:12:42 +01:00
|
|
|
AuthDefault user.Permission
|
2023-01-28 15:03:14 +01:00
|
|
|
AuthBcryptCost int
|
2023-01-29 02:29:06 +01:00
|
|
|
AuthStatsQueueWriterInterval time.Duration
|
2022-01-13 03:24:48 +01:00
|
|
|
AttachmentCacheDir string
|
|
|
|
AttachmentTotalSizeLimit int64
|
|
|
|
AttachmentFileSizeLimit int64
|
|
|
|
AttachmentExpiryDuration time.Duration
|
|
|
|
KeepaliveInterval time.Duration
|
|
|
|
ManagerInterval time.Duration
|
2023-02-09 14:32:51 +01:00
|
|
|
DisallowedTopics []string
|
2023-05-01 17:58:49 +02:00
|
|
|
WebRoot string // empty to disable
|
2022-06-01 03:39:19 +02:00
|
|
|
DelayedSenderInterval time.Duration
|
2022-01-13 03:24:48 +01:00
|
|
|
FirebaseKeepaliveInterval time.Duration
|
2022-05-26 03:39:46 +02:00
|
|
|
FirebasePollInterval time.Duration
|
2022-06-01 05:27:24 +02:00
|
|
|
FirebaseQuotaExceededPenaltyDuration time.Duration
|
2022-05-28 02:30:20 +02:00
|
|
|
UpstreamBaseURL string
|
2023-05-18 19:08:10 +02:00
|
|
|
UpstreamAccessToken string
|
2022-01-13 03:24:48 +01:00
|
|
|
SMTPSenderAddr string
|
|
|
|
SMTPSenderUser string
|
|
|
|
SMTPSenderPass string
|
|
|
|
SMTPSenderFrom string
|
|
|
|
SMTPServerListen string
|
|
|
|
SMTPServerDomain string
|
|
|
|
SMTPServerAddrPrefix string
|
2023-05-05 22:22:54 +02:00
|
|
|
TwilioAccount string
|
|
|
|
TwilioAuthToken string
|
2023-05-18 19:32:27 +02:00
|
|
|
TwilioPhoneNumber string
|
2023-05-16 20:15:58 +02:00
|
|
|
TwilioCallsBaseURL string
|
2023-05-11 19:50:10 +02:00
|
|
|
TwilioVerifyBaseURL string
|
|
|
|
TwilioVerifyService string
|
2023-03-16 03:34:06 +01:00
|
|
|
MetricsEnable bool
|
|
|
|
MetricsListenHTTP string
|
2023-03-28 20:41:16 +02:00
|
|
|
ProfileListenHTTP string
|
2022-01-13 03:24:48 +01:00
|
|
|
MessageLimit int
|
|
|
|
MinDelay time.Duration
|
|
|
|
MaxDelay time.Duration
|
|
|
|
TotalTopicLimit int
|
|
|
|
TotalAttachmentSizeLimit int64
|
|
|
|
VisitorSubscriptionLimit int
|
|
|
|
VisitorAttachmentTotalSizeLimit int64
|
2023-01-25 16:05:54 +01:00
|
|
|
VisitorAttachmentDailyBandwidthLimit int64
|
2022-01-13 03:24:48 +01:00
|
|
|
VisitorRequestLimitBurst int
|
|
|
|
VisitorRequestLimitReplenish time.Duration
|
2022-10-05 22:42:07 +02:00
|
|
|
VisitorRequestExemptIPAddrs []netip.Prefix
|
2023-01-27 04:57:18 +01:00
|
|
|
VisitorMessageDailyLimit int
|
2022-01-13 03:24:48 +01:00
|
|
|
VisitorEmailLimitBurst int
|
|
|
|
VisitorEmailLimitReplenish time.Duration
|
2023-01-26 04:26:04 +01:00
|
|
|
VisitorAccountCreationLimitBurst int
|
|
|
|
VisitorAccountCreationLimitReplenish time.Duration
|
2023-02-08 21:20:44 +01:00
|
|
|
VisitorAuthFailureLimitBurst int
|
|
|
|
VisitorAuthFailureLimitReplenish time.Duration
|
2023-01-11 04:51:51 +01:00
|
|
|
VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
|
2023-03-04 02:23:18 +01:00
|
|
|
VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
|
2022-01-13 03:24:48 +01:00
|
|
|
BehindProxy bool
|
2023-01-16 22:35:37 +01:00
|
|
|
StripeSecretKey string
|
2023-01-14 12:43:44 +01:00
|
|
|
StripeWebhookKey string
|
2023-01-18 21:50:06 +01:00
|
|
|
StripePriceCacheDuration time.Duration
|
2023-02-28 20:38:31 +01:00
|
|
|
BillingContact string
|
2023-01-05 21:20:44 +01:00
|
|
|
EnableSignup bool // Enable creation of accounts via API and UI
|
2022-12-15 05:11:22 +01:00
|
|
|
EnableLogin bool
|
2023-03-16 03:34:06 +01:00
|
|
|
EnableReservations bool // Allow users with role "user" to own/reserve topics
|
|
|
|
EnableMetrics bool
|
2023-01-18 21:50:06 +01:00
|
|
|
AccessControlAllowOrigin string // CORS header field to restrict access from web clients
|
2022-06-12 17:54:58 +02:00
|
|
|
Version string // injected by App
|
2023-05-24 21:36:01 +02:00
|
|
|
WebPushEnabled bool
|
|
|
|
WebPushPrivateKey string
|
|
|
|
WebPushPublicKey string
|
|
|
|
WebPushSubscriptionsFile string
|
|
|
|
WebPushEmailAddress string
|
2021-10-24 03:29:45 +02:00
|
|
|
}
|
|
|
|
|
2021-12-19 20:27:26 +01:00
|
|
|
// NewConfig instantiates a default new server config
|
2021-12-22 14:17:50 +01:00
|
|
|
func NewConfig() *Config {
|
2021-10-24 03:29:45 +02:00
|
|
|
return &Config{
|
2023-02-08 21:20:44 +01:00
|
|
|
File: "", // Only used for testing
|
2022-01-13 03:24:48 +01:00
|
|
|
BaseURL: "",
|
|
|
|
ListenHTTP: DefaultListenHTTP,
|
|
|
|
ListenHTTPS: "",
|
2022-01-15 02:16:12 +01:00
|
|
|
ListenUnix: "",
|
2022-07-04 01:33:01 +02:00
|
|
|
ListenUnixMode: 0,
|
2022-01-13 03:24:48 +01:00
|
|
|
KeyFile: "",
|
|
|
|
CertFile: "",
|
|
|
|
FirebaseKeyFile: "",
|
|
|
|
CacheFile: "",
|
|
|
|
CacheDuration: DefaultCacheDuration,
|
2023-01-18 21:50:06 +01:00
|
|
|
CacheStartupQueries: "",
|
2022-11-16 16:28:20 +01:00
|
|
|
CacheBatchSize: 0,
|
|
|
|
CacheBatchTimeout: 0,
|
2022-01-23 05:01:20 +01:00
|
|
|
AuthFile: "",
|
2023-01-18 21:50:06 +01:00
|
|
|
AuthStartupQueries: "",
|
2023-02-09 04:57:10 +01:00
|
|
|
AuthDefault: user.PermissionReadWrite,
|
2023-01-28 15:03:14 +01:00
|
|
|
AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
|
2023-01-29 02:29:06 +01:00
|
|
|
AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
|
2022-01-13 03:24:48 +01:00
|
|
|
AttachmentCacheDir: "",
|
|
|
|
AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
|
|
|
|
AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
|
|
|
|
AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
|
|
|
|
KeepaliveInterval: DefaultKeepaliveInterval,
|
|
|
|
ManagerInterval: DefaultManagerInterval,
|
2023-02-09 21:24:12 +01:00
|
|
|
DisallowedTopics: DefaultDisallowedTopics,
|
2023-05-01 17:58:49 +02:00
|
|
|
WebRoot: "/",
|
2022-06-01 05:27:24 +02:00
|
|
|
DelayedSenderInterval: DefaultDelayedSenderInterval,
|
2022-01-13 03:24:48 +01:00
|
|
|
FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
|
2022-05-26 03:39:46 +02:00
|
|
|
FirebasePollInterval: DefaultFirebasePollInterval,
|
2022-06-01 05:27:24 +02:00
|
|
|
FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
|
2023-01-18 21:50:06 +01:00
|
|
|
UpstreamBaseURL: "",
|
2023-05-18 19:08:10 +02:00
|
|
|
UpstreamAccessToken: "",
|
2023-01-18 21:50:06 +01:00
|
|
|
SMTPSenderAddr: "",
|
|
|
|
SMTPSenderUser: "",
|
|
|
|
SMTPSenderPass: "",
|
|
|
|
SMTPSenderFrom: "",
|
|
|
|
SMTPServerListen: "",
|
|
|
|
SMTPServerDomain: "",
|
|
|
|
SMTPServerAddrPrefix: "",
|
2023-05-16 20:15:58 +02:00
|
|
|
TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
|
2023-05-05 22:22:54 +02:00
|
|
|
TwilioAccount: "",
|
|
|
|
TwilioAuthToken: "",
|
2023-05-18 19:32:27 +02:00
|
|
|
TwilioPhoneNumber: "",
|
2023-05-11 19:50:10 +02:00
|
|
|
TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
|
|
|
|
TwilioVerifyService: "",
|
2023-01-18 21:50:06 +01:00
|
|
|
MessageLimit: DefaultMessageLengthLimit,
|
|
|
|
MinDelay: DefaultMinDelay,
|
|
|
|
MaxDelay: DefaultMaxDelay,
|
2022-01-13 03:24:48 +01:00
|
|
|
TotalTopicLimit: DefaultTotalTopicLimit,
|
2023-01-18 21:50:06 +01:00
|
|
|
TotalAttachmentSizeLimit: 0,
|
2022-01-13 03:24:48 +01:00
|
|
|
VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
|
|
|
|
VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
|
|
|
|
VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
|
|
|
|
VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
|
|
|
|
VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
|
2022-10-05 22:42:07 +02:00
|
|
|
VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
|
2023-01-27 04:57:18 +01:00
|
|
|
VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
|
2022-01-13 03:24:48 +01:00
|
|
|
VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
|
|
|
|
VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
|
2023-01-26 04:26:04 +01:00
|
|
|
VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
|
|
|
|
VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
|
2023-02-08 21:20:44 +01:00
|
|
|
VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
|
|
|
|
VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
|
2023-01-11 04:51:51 +01:00
|
|
|
VisitorStatsResetTime: DefaultVisitorStatsResetTime,
|
2023-03-04 02:23:18 +01:00
|
|
|
VisitorSubscriberRateLimiting: false,
|
2022-01-13 03:24:48 +01:00
|
|
|
BehindProxy: false,
|
2023-01-18 21:50:06 +01:00
|
|
|
StripeSecretKey: "",
|
|
|
|
StripeWebhookKey: "",
|
|
|
|
StripePriceCacheDuration: DefaultStripePriceCacheDuration,
|
2023-03-04 02:23:18 +01:00
|
|
|
BillingContact: "",
|
2023-01-18 21:50:06 +01:00
|
|
|
EnableSignup: false,
|
|
|
|
EnableLogin: false,
|
|
|
|
EnableReservations: false,
|
|
|
|
AccessControlAllowOrigin: "*",
|
2022-06-12 17:54:58 +02:00
|
|
|
Version: "",
|
2023-05-29 17:57:21 +02:00
|
|
|
WebPushEnabled: false,
|
2023-05-24 21:36:01 +02:00
|
|
|
WebPushPrivateKey: "",
|
|
|
|
WebPushPublicKey: "",
|
|
|
|
WebPushSubscriptionsFile: "",
|
2023-05-29 17:57:21 +02:00
|
|
|
WebPushEmailAddress: "",
|
2021-10-24 03:29:45 +02:00
|
|
|
}
|
|
|
|
}
|