options.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. // Copyright 2019 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package config // import "miniflux.app/config"
  5. import (
  6. "fmt"
  7. "strings"
  8. )
  9. const (
  10. defaultHTTPS = false
  11. defaultLogDateTime = false
  12. defaultHSTS = true
  13. defaultHTTPService = true
  14. defaultSchedulerService = true
  15. defaultDebug = false
  16. defaultBaseURL = "http://localhost"
  17. defaultRootURL = "http://localhost"
  18. defaultBasePath = ""
  19. defaultWorkerPoolSize = 5
  20. defaultPollingFrequency = 60
  21. defaultBatchSize = 10
  22. defaultRunMigrations = false
  23. defaultDatabaseURL = "user=postgres password=postgres dbname=miniflux2 sslmode=disable"
  24. defaultDatabaseMaxConns = 20
  25. defaultDatabaseMinConns = 1
  26. defaultListenAddr = "127.0.0.1:8080"
  27. defaultCertFile = ""
  28. defaultKeyFile = ""
  29. defaultCertDomain = ""
  30. defaultCertCache = "/tmp/cert_cache"
  31. defaultCleanupFrequencyHours = 24
  32. defaultCleanupArchiveReadDays = 60
  33. defaultCleanupRemoveSessionsDays = 30
  34. defaultProxyImages = "http-only"
  35. defaultCreateAdmin = false
  36. defaultOAuth2UserCreation = false
  37. defaultOAuth2ClientID = ""
  38. defaultOAuth2ClientSecret = ""
  39. defaultOAuth2RedirectURL = ""
  40. defaultOAuth2OidcDiscoveryEndpoint = ""
  41. defaultOAuth2Provider = ""
  42. defaultPocketConsumerKey = ""
  43. defaultHTTPClientTimeout = 20
  44. defaultHTTPClientMaxBodySize = 15
  45. defaultAuthProxyHeader = ""
  46. defaultAuthProxyUserCreation = false
  47. )
  48. // Options contains configuration options.
  49. type Options struct {
  50. HTTPS bool
  51. logDateTime bool
  52. hsts bool
  53. httpService bool
  54. schedulerService bool
  55. debug bool
  56. baseURL string
  57. rootURL string
  58. basePath string
  59. databaseURL string
  60. databaseMaxConns int
  61. databaseMinConns int
  62. runMigrations bool
  63. listenAddr string
  64. certFile string
  65. certDomain string
  66. certCache string
  67. certKeyFile string
  68. cleanupFrequencyHours int
  69. cleanupArchiveReadDays int
  70. cleanupRemoveSessionsDays int
  71. pollingFrequency int
  72. batchSize int
  73. workerPoolSize int
  74. createAdmin bool
  75. proxyImages string
  76. oauth2UserCreationAllowed bool
  77. oauth2ClientID string
  78. oauth2ClientSecret string
  79. oauth2RedirectURL string
  80. oauth2OidcDiscoveryEndpoint string
  81. oauth2Provider string
  82. pocketConsumerKey string
  83. httpClientTimeout int
  84. httpClientMaxBodySize int64
  85. authProxyHeader string
  86. authProxyUserCreation bool
  87. }
  88. // NewOptions returns Options with default values.
  89. func NewOptions() *Options {
  90. return &Options{
  91. HTTPS: defaultHTTPS,
  92. logDateTime: defaultLogDateTime,
  93. hsts: defaultHSTS,
  94. httpService: defaultHTTPService,
  95. schedulerService: defaultSchedulerService,
  96. debug: defaultDebug,
  97. baseURL: defaultBaseURL,
  98. rootURL: defaultRootURL,
  99. basePath: defaultBasePath,
  100. databaseURL: defaultDatabaseURL,
  101. databaseMaxConns: defaultDatabaseMaxConns,
  102. databaseMinConns: defaultDatabaseMinConns,
  103. runMigrations: defaultRunMigrations,
  104. listenAddr: defaultListenAddr,
  105. certFile: defaultCertFile,
  106. certDomain: defaultCertDomain,
  107. certCache: defaultCertCache,
  108. certKeyFile: defaultKeyFile,
  109. cleanupFrequencyHours: defaultCleanupFrequencyHours,
  110. cleanupArchiveReadDays: defaultCleanupArchiveReadDays,
  111. cleanupRemoveSessionsDays: defaultCleanupRemoveSessionsDays,
  112. pollingFrequency: defaultPollingFrequency,
  113. batchSize: defaultBatchSize,
  114. workerPoolSize: defaultWorkerPoolSize,
  115. createAdmin: defaultCreateAdmin,
  116. proxyImages: defaultProxyImages,
  117. oauth2UserCreationAllowed: defaultOAuth2UserCreation,
  118. oauth2ClientID: defaultOAuth2ClientID,
  119. oauth2ClientSecret: defaultOAuth2ClientSecret,
  120. oauth2RedirectURL: defaultOAuth2RedirectURL,
  121. oauth2OidcDiscoveryEndpoint: defaultOAuth2OidcDiscoveryEndpoint,
  122. oauth2Provider: defaultOAuth2Provider,
  123. pocketConsumerKey: defaultPocketConsumerKey,
  124. httpClientTimeout: defaultHTTPClientTimeout,
  125. httpClientMaxBodySize: defaultHTTPClientMaxBodySize * 1024 * 1024,
  126. authProxyHeader: defaultAuthProxyHeader,
  127. authProxyUserCreation: defaultAuthProxyUserCreation,
  128. }
  129. }
  130. // LogDateTime returns true if the date/time should be displayed in log messages.
  131. func (o *Options) LogDateTime() bool {
  132. return o.logDateTime
  133. }
  134. // HasDebugMode returns true if debug mode is enabled.
  135. func (o *Options) HasDebugMode() bool {
  136. return o.debug
  137. }
  138. // BaseURL returns the application base URL with path.
  139. func (o *Options) BaseURL() string {
  140. return o.baseURL
  141. }
  142. // RootURL returns the base URL without path.
  143. func (o *Options) RootURL() string {
  144. return o.rootURL
  145. }
  146. // BasePath returns the application base path according to the base URL.
  147. func (o *Options) BasePath() string {
  148. return o.basePath
  149. }
  150. // IsDefaultDatabaseURL returns true if the default database URL is used.
  151. func (o *Options) IsDefaultDatabaseURL() bool {
  152. return o.databaseURL == defaultDatabaseURL
  153. }
  154. // DatabaseURL returns the database URL.
  155. func (o *Options) DatabaseURL() string {
  156. return o.databaseURL
  157. }
  158. // DatabaseMaxConns returns the maximum number of database connections.
  159. func (o *Options) DatabaseMaxConns() int {
  160. return o.databaseMaxConns
  161. }
  162. // DatabaseMinConns returns the minimum number of database connections.
  163. func (o *Options) DatabaseMinConns() int {
  164. return o.databaseMinConns
  165. }
  166. // ListenAddr returns the listen address for the HTTP server.
  167. func (o *Options) ListenAddr() string {
  168. return o.listenAddr
  169. }
  170. // CertFile returns the SSL certificate filename if any.
  171. func (o *Options) CertFile() string {
  172. return o.certFile
  173. }
  174. // CertKeyFile returns the private key filename for custom SSL certificate.
  175. func (o *Options) CertKeyFile() string {
  176. return o.certKeyFile
  177. }
  178. // CertDomain returns the domain to use for Let's Encrypt certificate.
  179. func (o *Options) CertDomain() string {
  180. return o.certDomain
  181. }
  182. // CertCache returns the directory to use for Let's Encrypt session cache.
  183. func (o *Options) CertCache() string {
  184. return o.certCache
  185. }
  186. // CleanupFrequencyHours returns the interval in hours for cleanup jobs.
  187. func (o *Options) CleanupFrequencyHours() int {
  188. return o.cleanupFrequencyHours
  189. }
  190. // CleanupArchiveReadDays returns the number of days after which marking read items as removed.
  191. func (o *Options) CleanupArchiveReadDays() int {
  192. return o.cleanupArchiveReadDays
  193. }
  194. // CleanupRemoveSessionsDays returns the number of days after which to remove sessions.
  195. func (o *Options) CleanupRemoveSessionsDays() int {
  196. return o.cleanupRemoveSessionsDays
  197. }
  198. // WorkerPoolSize returns the number of background worker.
  199. func (o *Options) WorkerPoolSize() int {
  200. return o.workerPoolSize
  201. }
  202. // PollingFrequency returns the interval to refresh feeds in the background.
  203. func (o *Options) PollingFrequency() int {
  204. return o.pollingFrequency
  205. }
  206. // BatchSize returns the number of feeds to send for background processing.
  207. func (o *Options) BatchSize() int {
  208. return o.batchSize
  209. }
  210. // IsOAuth2UserCreationAllowed returns true if user creation is allowed for OAuth2 users.
  211. func (o *Options) IsOAuth2UserCreationAllowed() bool {
  212. return o.oauth2UserCreationAllowed
  213. }
  214. // OAuth2ClientID returns the OAuth2 Client ID.
  215. func (o *Options) OAuth2ClientID() string {
  216. return o.oauth2ClientID
  217. }
  218. // OAuth2ClientSecret returns the OAuth2 client secret.
  219. func (o *Options) OAuth2ClientSecret() string {
  220. return o.oauth2ClientSecret
  221. }
  222. // OAuth2RedirectURL returns the OAuth2 redirect URL.
  223. func (o *Options) OAuth2RedirectURL() string {
  224. return o.oauth2RedirectURL
  225. }
  226. // OAuth2OidcDiscoveryEndpoint returns the OAuth2 OIDC discovery endpoint.
  227. func (o *Options) OAuth2OidcDiscoveryEndpoint() string {
  228. return o.oauth2OidcDiscoveryEndpoint
  229. }
  230. // OAuth2Provider returns the name of the OAuth2 provider configured.
  231. func (o *Options) OAuth2Provider() string {
  232. return o.oauth2Provider
  233. }
  234. // HasHSTS returns true if HTTP Strict Transport Security is enabled.
  235. func (o *Options) HasHSTS() bool {
  236. return o.hsts
  237. }
  238. // RunMigrations returns true if the environment variable RUN_MIGRATIONS is not empty.
  239. func (o *Options) RunMigrations() bool {
  240. return o.runMigrations
  241. }
  242. // CreateAdmin returns true if the environment variable CREATE_ADMIN is not empty.
  243. func (o *Options) CreateAdmin() bool {
  244. return o.createAdmin
  245. }
  246. // ProxyImages returns "none" to never proxy, "http-only" to proxy non-HTTPS, "all" to always proxy.
  247. func (o *Options) ProxyImages() string {
  248. return o.proxyImages
  249. }
  250. // HasHTTPService returns true if the HTTP service is enabled.
  251. func (o *Options) HasHTTPService() bool {
  252. return o.httpService
  253. }
  254. // HasSchedulerService returns true if the scheduler service is enabled.
  255. func (o *Options) HasSchedulerService() bool {
  256. return o.schedulerService
  257. }
  258. // PocketConsumerKey returns the Pocket Consumer Key if configured.
  259. func (o *Options) PocketConsumerKey(defaultValue string) string {
  260. if o.pocketConsumerKey != "" {
  261. return o.pocketConsumerKey
  262. }
  263. return defaultValue
  264. }
  265. // HTTPClientTimeout returns the time limit in seconds before the HTTP client cancel the request.
  266. func (o *Options) HTTPClientTimeout() int {
  267. return o.httpClientTimeout
  268. }
  269. // HTTPClientMaxBodySize returns the number of bytes allowed for the HTTP client to transfer.
  270. func (o *Options) HTTPClientMaxBodySize() int64 {
  271. return o.httpClientMaxBodySize
  272. }
  273. // AuthProxyHeader returns an HTTP header name that contains username for
  274. // authentication using auth proxy.
  275. func (o *Options) AuthProxyHeader() string {
  276. return o.authProxyHeader
  277. }
  278. // IsAuthProxyUserCreationAllowed returns true if user creation is allowed for
  279. // users authenticated using auth proxy.
  280. func (o *Options) IsAuthProxyUserCreationAllowed() bool {
  281. return o.authProxyUserCreation
  282. }
  283. func (o *Options) String() string {
  284. var builder strings.Builder
  285. builder.WriteString(fmt.Sprintf("LOG_DATE_TIME: %v\n", o.logDateTime))
  286. builder.WriteString(fmt.Sprintf("DEBUG: %v\n", o.debug))
  287. builder.WriteString(fmt.Sprintf("HTTP_SERVICE: %v\n", o.httpService))
  288. builder.WriteString(fmt.Sprintf("SCHEDULER_SERVICE: %v\n", o.schedulerService))
  289. builder.WriteString(fmt.Sprintf("HTTPS: %v\n", o.HTTPS))
  290. builder.WriteString(fmt.Sprintf("HSTS: %v\n", o.hsts))
  291. builder.WriteString(fmt.Sprintf("BASE_URL: %v\n", o.baseURL))
  292. builder.WriteString(fmt.Sprintf("ROOT_URL: %v\n", o.rootURL))
  293. builder.WriteString(fmt.Sprintf("BASE_PATH: %v\n", o.basePath))
  294. builder.WriteString(fmt.Sprintf("LISTEN_ADDR: %v\n", o.listenAddr))
  295. builder.WriteString(fmt.Sprintf("DATABASE_URL: %v\n", o.databaseURL))
  296. builder.WriteString(fmt.Sprintf("DATABASE_MAX_CONNS: %v\n", o.databaseMaxConns))
  297. builder.WriteString(fmt.Sprintf("DATABASE_MIN_CONNS: %v\n", o.databaseMinConns))
  298. builder.WriteString(fmt.Sprintf("RUN_MIGRATIONS: %v\n", o.runMigrations))
  299. builder.WriteString(fmt.Sprintf("CERT_FILE: %v\n", o.certFile))
  300. builder.WriteString(fmt.Sprintf("KEY_FILE: %v\n", o.certKeyFile))
  301. builder.WriteString(fmt.Sprintf("CERT_DOMAIN: %v\n", o.certDomain))
  302. builder.WriteString(fmt.Sprintf("CERT_CACHE: %v\n", o.certCache))
  303. builder.WriteString(fmt.Sprintf("CLEANUP_FREQUENCY_HOURS: %v\n", o.cleanupFrequencyHours))
  304. builder.WriteString(fmt.Sprintf("CLEANUP_ARCHIVE_READ_DAYS: %v\n", o.cleanupArchiveReadDays))
  305. builder.WriteString(fmt.Sprintf("CLEANUP_REMOVE_SESSIONS_DAYS: %v\n", o.cleanupRemoveSessionsDays))
  306. builder.WriteString(fmt.Sprintf("WORKER_POOL_SIZE: %v\n", o.workerPoolSize))
  307. builder.WriteString(fmt.Sprintf("POLLING_FREQUENCY: %v\n", o.pollingFrequency))
  308. builder.WriteString(fmt.Sprintf("BATCH_SIZE: %v\n", o.batchSize))
  309. builder.WriteString(fmt.Sprintf("PROXY_IMAGES: %v\n", o.proxyImages))
  310. builder.WriteString(fmt.Sprintf("CREATE_ADMIN: %v\n", o.createAdmin))
  311. builder.WriteString(fmt.Sprintf("POCKET_CONSUMER_KEY: %v\n", o.pocketConsumerKey))
  312. builder.WriteString(fmt.Sprintf("OAUTH2_USER_CREATION: %v\n", o.oauth2UserCreationAllowed))
  313. builder.WriteString(fmt.Sprintf("OAUTH2_CLIENT_ID: %v\n", o.oauth2ClientID))
  314. builder.WriteString(fmt.Sprintf("OAUTH2_CLIENT_SECRET: %v\n", o.oauth2ClientSecret))
  315. builder.WriteString(fmt.Sprintf("OAUTH2_REDIRECT_URL: %v\n", o.oauth2RedirectURL))
  316. builder.WriteString(fmt.Sprintf("OAUTH2_OIDC_DISCOVERY_ENDPOINT: %v\n", o.oauth2OidcDiscoveryEndpoint))
  317. builder.WriteString(fmt.Sprintf("OAUTH2_PROVIDER: %v\n", o.oauth2Provider))
  318. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_TIMEOUT: %v\n", o.httpClientTimeout))
  319. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_MAX_BODY_SIZE: %v\n", o.httpClientMaxBodySize))
  320. builder.WriteString(fmt.Sprintf("AUTH_PROXY_HEADER: %v\n", o.authProxyHeader))
  321. builder.WriteString(fmt.Sprintf("AUTH_PROXY_USER_CREATION: %v\n", o.authProxyUserCreation))
  322. return builder.String()
  323. }