config.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package server
  2. import (
  3. "io/fs"
  4. "net/netip"
  5. "text/template"
  6. "time"
  7. "heckel.io/ntfy/v2/user"
  8. )
  9. // Defines default config settings (excluding limits, see below)
  10. const (
  11. DefaultListenHTTP = ":80"
  12. DefaultCacheDuration = 12 * time.Hour
  13. DefaultCacheBatchTimeout = time.Duration(0)
  14. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  15. DefaultManagerInterval = time.Minute
  16. DefaultDelayedSenderInterval = 10 * time.Second
  17. DefaultMessageDelayMin = 10 * time.Second
  18. DefaultMessageDelayMax = 3 * 24 * time.Hour
  19. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  20. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  21. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  22. DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
  23. )
  24. // Platform-specific default paths (set in config_unix.go or config_windows.go)
  25. var (
  26. DefaultConfigFile string
  27. DefaultTemplateDir string
  28. )
  29. // Defines default Web Push settings
  30. const (
  31. DefaultWebPushExpiryWarningDuration = 55 * 24 * time.Hour
  32. DefaultWebPushExpiryDuration = 60 * 24 * time.Hour
  33. )
  34. // Defines all global and per-visitor limits
  35. // - message size limit: the max number of bytes for a message
  36. // - total topic limit: max number of topics overall
  37. // - various attachment limits
  38. const (
  39. DefaultMessageSizeLimit = 4096 // Bytes; note that FCM/APNS have a limit of ~4 KB for the entire message
  40. DefaultTotalTopicLimit = 15000
  41. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  42. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  43. DefaultAttachmentExpiryDuration = 3 * time.Hour
  44. )
  45. // Defines all per-visitor limits
  46. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  47. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  48. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  49. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  50. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  51. const (
  52. DefaultVisitorSubscriptionLimit = 30
  53. DefaultVisitorRequestLimitBurst = 60
  54. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  55. DefaultVisitorMessageDailyLimit = 0
  56. DefaultVisitorEmailLimitBurst = 16
  57. DefaultVisitorEmailLimitReplenish = time.Hour
  58. DefaultVisitorAccountCreationLimitBurst = 3
  59. DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
  60. DefaultVisitorAuthFailureLimitBurst = 30
  61. DefaultVisitorAuthFailureLimitReplenish = time.Minute
  62. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  63. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  64. DefaultVisitorPrefixBitsIPv4 = 32 // Use the entire IPv4 address for rate limiting
  65. DefaultVisitorPrefixBitsIPv6 = 64 // Use /64 for IPv6 rate limiting
  66. )
  67. var (
  68. // DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
  69. DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
  70. // DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
  71. // extended using the server.yml config. If updated, also update in Android and web app.
  72. DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
  73. )
  74. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  75. type Config struct {
  76. File string // Config file, only used for testing
  77. BaseURL string
  78. ListenHTTP string
  79. ListenHTTPS string
  80. ListenUnix string
  81. ListenUnixMode fs.FileMode
  82. KeyFile string
  83. CertFile string
  84. FirebaseKeyFile string
  85. CacheFile string
  86. CacheDuration time.Duration
  87. CacheStartupQueries string
  88. CacheBatchSize int
  89. CacheBatchTimeout time.Duration
  90. AuthFile string
  91. AuthStartupQueries string
  92. AuthDefault user.Permission
  93. AuthUsers []*user.User
  94. AuthAccess map[string][]*user.Grant
  95. AuthTokens map[string][]*user.Token
  96. AuthBcryptCost int
  97. AuthStatsQueueWriterInterval time.Duration
  98. AttachmentCacheDir string
  99. AttachmentTotalSizeLimit int64
  100. AttachmentFileSizeLimit int64
  101. AttachmentExpiryDuration time.Duration
  102. TemplateDir string // Directory to load named templates from
  103. KeepaliveInterval time.Duration
  104. ManagerInterval time.Duration
  105. DisallowedTopics []string
  106. WebRoot string // empty to disable
  107. DelayedSenderInterval time.Duration
  108. FirebaseKeepaliveInterval time.Duration
  109. FirebasePollInterval time.Duration
  110. FirebaseQuotaExceededPenaltyDuration time.Duration
  111. UpstreamBaseURL string
  112. UpstreamAccessToken string
  113. SMTPSenderAddr string
  114. SMTPSenderUser string
  115. SMTPSenderPass string
  116. SMTPSenderFrom string
  117. SMTPServerListen string
  118. SMTPServerDomain string
  119. SMTPServerAddrPrefix string
  120. TwilioAccount string
  121. TwilioAuthToken string
  122. TwilioPhoneNumber string
  123. TwilioCallsBaseURL string
  124. TwilioVerifyBaseURL string
  125. TwilioVerifyService string
  126. TwilioCallFormat *template.Template
  127. MetricsEnable bool
  128. MetricsListenHTTP string
  129. ProfileListenHTTP string
  130. MessageDelayMin time.Duration
  131. MessageDelayMax time.Duration
  132. MessageSizeLimit int
  133. TotalTopicLimit int
  134. TotalAttachmentSizeLimit int64
  135. VisitorSubscriptionLimit int
  136. VisitorAttachmentTotalSizeLimit int64
  137. VisitorAttachmentDailyBandwidthLimit int64
  138. VisitorRequestLimitBurst int
  139. VisitorRequestLimitReplenish time.Duration
  140. VisitorRequestExemptPrefixes []netip.Prefix
  141. VisitorMessageDailyLimit int
  142. VisitorEmailLimitBurst int
  143. VisitorEmailLimitReplenish time.Duration
  144. VisitorAccountCreationLimitBurst int
  145. VisitorAccountCreationLimitReplenish time.Duration
  146. VisitorAuthFailureLimitBurst int
  147. VisitorAuthFailureLimitReplenish time.Duration
  148. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  149. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  150. VisitorPrefixBitsIPv4 int // Number of bits for IPv4 rate limiting (default: 32)
  151. VisitorPrefixBitsIPv6 int // Number of bits for IPv6 rate limiting (default: 64)
  152. BehindProxy bool // If true, the server will trust the proxy client IP header to determine the client IP address (IPv4 and IPv6 supported)
  153. ProxyForwardedHeader string // The header field to read the real/client IP address from, if BehindProxy is true, defaults to "X-Forwarded-For" (IPv4 and IPv6 supported)
  154. ProxyTrustedPrefixes []netip.Prefix // List of trusted proxy networks (IPv4 or IPv6) that will be stripped from the Forwarded header if BehindProxy is true
  155. StripeSecretKey string
  156. StripeWebhookKey string
  157. StripePriceCacheDuration time.Duration
  158. BillingContact string
  159. EnableSignup bool // Enable creation of accounts via API and UI
  160. EnableLogin bool
  161. RequireLogin bool
  162. EnableReservations bool // Allow users with role "user" to own/reserve topics
  163. EnableMetrics bool
  164. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  165. WebPushPrivateKey string
  166. WebPushPublicKey string
  167. WebPushFile string
  168. WebPushEmailAddress string
  169. WebPushStartupQueries string
  170. WebPushExpiryDuration time.Duration
  171. WebPushExpiryWarningDuration time.Duration
  172. Version string // injected by App
  173. }
  174. // NewConfig instantiates a default new server config
  175. func NewConfig() *Config {
  176. return &Config{
  177. File: DefaultConfigFile, // Only used for testing
  178. BaseURL: "",
  179. ListenHTTP: DefaultListenHTTP,
  180. ListenHTTPS: "",
  181. ListenUnix: "",
  182. ListenUnixMode: 0,
  183. KeyFile: "",
  184. CertFile: "",
  185. FirebaseKeyFile: "",
  186. CacheFile: "",
  187. CacheDuration: DefaultCacheDuration,
  188. CacheStartupQueries: "",
  189. CacheBatchSize: 0,
  190. CacheBatchTimeout: 0,
  191. AuthFile: "",
  192. AuthStartupQueries: "",
  193. AuthDefault: user.PermissionReadWrite,
  194. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  195. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  196. AttachmentCacheDir: "",
  197. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  198. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  199. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  200. TemplateDir: DefaultTemplateDir,
  201. KeepaliveInterval: DefaultKeepaliveInterval,
  202. ManagerInterval: DefaultManagerInterval,
  203. DisallowedTopics: DefaultDisallowedTopics,
  204. WebRoot: "/",
  205. DelayedSenderInterval: DefaultDelayedSenderInterval,
  206. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  207. FirebasePollInterval: DefaultFirebasePollInterval,
  208. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  209. UpstreamBaseURL: "",
  210. UpstreamAccessToken: "",
  211. SMTPSenderAddr: "",
  212. SMTPSenderUser: "",
  213. SMTPSenderPass: "",
  214. SMTPSenderFrom: "",
  215. SMTPServerListen: "",
  216. SMTPServerDomain: "",
  217. SMTPServerAddrPrefix: "",
  218. TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
  219. TwilioAccount: "",
  220. TwilioAuthToken: "",
  221. TwilioPhoneNumber: "",
  222. TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
  223. TwilioVerifyService: "",
  224. TwilioCallFormat: nil,
  225. MessageSizeLimit: DefaultMessageSizeLimit,
  226. MessageDelayMin: DefaultMessageDelayMin,
  227. MessageDelayMax: DefaultMessageDelayMax,
  228. TotalTopicLimit: DefaultTotalTopicLimit,
  229. TotalAttachmentSizeLimit: 0,
  230. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  231. VisitorSubscriberRateLimiting: false,
  232. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  233. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  234. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  235. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  236. VisitorRequestExemptPrefixes: make([]netip.Prefix, 0),
  237. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  238. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  239. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  240. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  241. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  242. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  243. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  244. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  245. VisitorPrefixBitsIPv4: DefaultVisitorPrefixBitsIPv4, // Default: use full IPv4 address
  246. VisitorPrefixBitsIPv6: DefaultVisitorPrefixBitsIPv6, // Default: use /64 for IPv6
  247. BehindProxy: false, // If true, the server will trust the proxy client IP header to determine the client IP address
  248. ProxyForwardedHeader: "X-Forwarded-For", // Default header for reverse proxy client IPs
  249. StripeSecretKey: "",
  250. StripeWebhookKey: "",
  251. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  252. BillingContact: "",
  253. EnableSignup: false,
  254. EnableLogin: false,
  255. EnableReservations: false,
  256. RequireLogin: false,
  257. AccessControlAllowOrigin: "*",
  258. Version: "",
  259. WebPushPrivateKey: "",
  260. WebPushPublicKey: "",
  261. WebPushFile: "",
  262. WebPushEmailAddress: "",
  263. WebPushExpiryDuration: DefaultWebPushExpiryDuration,
  264. WebPushExpiryWarningDuration: DefaultWebPushExpiryWarningDuration,
  265. }
  266. }