config.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package server
  2. import (
  3. "heckel.io/ntfy/user"
  4. "io/fs"
  5. "net/netip"
  6. "time"
  7. )
  8. // Defines default config settings (excluding limits, see below)
  9. const (
  10. DefaultListenHTTP = ":80"
  11. DefaultCacheDuration = 12 * time.Hour
  12. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  13. DefaultManagerInterval = time.Minute
  14. DefaultDelayedSenderInterval = 10 * time.Second
  15. DefaultMinDelay = 10 * time.Second
  16. DefaultMaxDelay = 3 * 24 * time.Hour
  17. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  18. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  19. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  20. DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
  21. )
  22. // Defines all global and per-visitor limits
  23. // - message size limit: the max number of bytes for a message
  24. // - total topic limit: max number of topics overall
  25. // - various attachment limits
  26. const (
  27. DefaultMessageLengthLimit = 4096 // Bytes
  28. DefaultTotalTopicLimit = 15000
  29. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  30. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  31. DefaultAttachmentExpiryDuration = 3 * time.Hour
  32. )
  33. // Defines all per-visitor limits
  34. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  35. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  36. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  37. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  38. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  39. const (
  40. DefaultVisitorSubscriptionLimit = 30
  41. DefaultVisitorRequestLimitBurst = 60
  42. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  43. DefaultVisitorMessageDailyLimit = 0
  44. DefaultVisitorEmailLimitBurst = 16
  45. DefaultVisitorEmailLimitReplenish = time.Hour
  46. DefaultVisitorCallDailyLimit = 10
  47. DefaultVisitorAccountCreationLimitBurst = 3
  48. DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
  49. DefaultVisitorAuthFailureLimitBurst = 30
  50. DefaultVisitorAuthFailureLimitReplenish = time.Minute
  51. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  52. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  53. )
  54. var (
  55. // DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
  56. DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
  57. // DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
  58. // extended using the server.yml config. If updated, also update in Android and web app.
  59. DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
  60. )
  61. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  62. type Config struct {
  63. File string // Config file, only used for testing
  64. BaseURL string
  65. ListenHTTP string
  66. ListenHTTPS string
  67. ListenUnix string
  68. ListenUnixMode fs.FileMode
  69. KeyFile string
  70. CertFile string
  71. FirebaseKeyFile string
  72. CacheFile string
  73. CacheDuration time.Duration
  74. CacheStartupQueries string
  75. CacheBatchSize int
  76. CacheBatchTimeout time.Duration
  77. AuthFile string
  78. AuthStartupQueries string
  79. AuthDefault user.Permission
  80. AuthBcryptCost int
  81. AuthStatsQueueWriterInterval time.Duration
  82. AttachmentCacheDir string
  83. AttachmentTotalSizeLimit int64
  84. AttachmentFileSizeLimit int64
  85. AttachmentExpiryDuration time.Duration
  86. KeepaliveInterval time.Duration
  87. ManagerInterval time.Duration
  88. DisallowedTopics []string
  89. WebRoot string // empty to disable
  90. DelayedSenderInterval time.Duration
  91. FirebaseKeepaliveInterval time.Duration
  92. FirebasePollInterval time.Duration
  93. FirebaseQuotaExceededPenaltyDuration time.Duration
  94. UpstreamBaseURL string
  95. SMTPSenderAddr string
  96. SMTPSenderUser string
  97. SMTPSenderPass string
  98. SMTPSenderFrom string
  99. SMTPServerListen string
  100. SMTPServerDomain string
  101. SMTPServerAddrPrefix string
  102. TwilioMessagingBaseURL string
  103. TwilioAccount string
  104. TwilioAuthToken string
  105. TwilioFromNumber string
  106. TwilioVerifyBaseURL string
  107. TwilioVerifyService string
  108. MetricsEnable bool
  109. MetricsListenHTTP string
  110. ProfileListenHTTP string
  111. MessageLimit int
  112. MinDelay time.Duration
  113. MaxDelay time.Duration
  114. TotalTopicLimit int
  115. TotalAttachmentSizeLimit int64
  116. VisitorSubscriptionLimit int
  117. VisitorAttachmentTotalSizeLimit int64
  118. VisitorAttachmentDailyBandwidthLimit int64
  119. VisitorRequestLimitBurst int
  120. VisitorRequestLimitReplenish time.Duration
  121. VisitorRequestExemptIPAddrs []netip.Prefix
  122. VisitorMessageDailyLimit int
  123. VisitorEmailLimitBurst int
  124. VisitorEmailLimitReplenish time.Duration
  125. VisitorAccountCreationLimitBurst int
  126. VisitorAccountCreationLimitReplenish time.Duration
  127. VisitorAuthFailureLimitBurst int
  128. VisitorAuthFailureLimitReplenish time.Duration
  129. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  130. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  131. BehindProxy bool
  132. StripeSecretKey string
  133. StripeWebhookKey string
  134. StripePriceCacheDuration time.Duration
  135. BillingContact string
  136. EnableSignup bool // Enable creation of accounts via API and UI
  137. EnableLogin bool
  138. EnableReservations bool // Allow users with role "user" to own/reserve topics
  139. EnableMetrics bool
  140. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  141. Version string // injected by App
  142. }
  143. // NewConfig instantiates a default new server config
  144. func NewConfig() *Config {
  145. return &Config{
  146. File: "", // Only used for testing
  147. BaseURL: "",
  148. ListenHTTP: DefaultListenHTTP,
  149. ListenHTTPS: "",
  150. ListenUnix: "",
  151. ListenUnixMode: 0,
  152. KeyFile: "",
  153. CertFile: "",
  154. FirebaseKeyFile: "",
  155. CacheFile: "",
  156. CacheDuration: DefaultCacheDuration,
  157. CacheStartupQueries: "",
  158. CacheBatchSize: 0,
  159. CacheBatchTimeout: 0,
  160. AuthFile: "",
  161. AuthStartupQueries: "",
  162. AuthDefault: user.PermissionReadWrite,
  163. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  164. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  165. AttachmentCacheDir: "",
  166. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  167. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  168. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  169. KeepaliveInterval: DefaultKeepaliveInterval,
  170. ManagerInterval: DefaultManagerInterval,
  171. DisallowedTopics: DefaultDisallowedTopics,
  172. WebRoot: "/",
  173. DelayedSenderInterval: DefaultDelayedSenderInterval,
  174. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  175. FirebasePollInterval: DefaultFirebasePollInterval,
  176. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  177. UpstreamBaseURL: "",
  178. SMTPSenderAddr: "",
  179. SMTPSenderUser: "",
  180. SMTPSenderPass: "",
  181. SMTPSenderFrom: "",
  182. SMTPServerListen: "",
  183. SMTPServerDomain: "",
  184. SMTPServerAddrPrefix: "",
  185. TwilioMessagingBaseURL: "https://api.twilio.com", // Override for tests
  186. TwilioAccount: "",
  187. TwilioAuthToken: "",
  188. TwilioFromNumber: "",
  189. TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
  190. TwilioVerifyService: "",
  191. MessageLimit: DefaultMessageLengthLimit,
  192. MinDelay: DefaultMinDelay,
  193. MaxDelay: DefaultMaxDelay,
  194. TotalTopicLimit: DefaultTotalTopicLimit,
  195. TotalAttachmentSizeLimit: 0,
  196. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  197. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  198. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  199. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  200. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  201. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  202. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  203. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  204. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  205. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  206. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  207. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  208. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  209. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  210. VisitorSubscriberRateLimiting: false,
  211. BehindProxy: false,
  212. StripeSecretKey: "",
  213. StripeWebhookKey: "",
  214. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  215. BillingContact: "",
  216. EnableSignup: false,
  217. EnableLogin: false,
  218. EnableReservations: false,
  219. AccessControlAllowOrigin: "*",
  220. Version: "",
  221. }
  222. }