integration.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package form // import "miniflux.app/v2/internal/ui/form"
  4. import (
  5. "net/http"
  6. "strconv"
  7. "miniflux.app/v2/internal/model"
  8. )
  9. // IntegrationForm represents user integration settings form.
  10. type IntegrationForm struct {
  11. PinboardEnabled bool
  12. PinboardToken string
  13. PinboardTags string
  14. PinboardMarkAsUnread bool
  15. InstapaperEnabled bool
  16. InstapaperUsername string
  17. InstapaperPassword string
  18. FeverEnabled bool
  19. FeverUsername string
  20. FeverPassword string
  21. GoogleReaderEnabled bool
  22. GoogleReaderUsername string
  23. GoogleReaderPassword string
  24. WallabagEnabled bool
  25. WallabagOnlyURL bool
  26. WallabagURL string
  27. WallabagClientID string
  28. WallabagClientSecret string
  29. WallabagUsername string
  30. WallabagPassword string
  31. WallabagTags string
  32. NotionEnabled bool
  33. NotionPageID string
  34. NotionToken string
  35. NunuxKeeperEnabled bool
  36. NunuxKeeperURL string
  37. NunuxKeeperAPIKey string
  38. EspialEnabled bool
  39. EspialURL string
  40. EspialAPIKey string
  41. EspialTags string
  42. ReadwiseEnabled bool
  43. ReadwiseAPIKey string
  44. TelegramBotEnabled bool
  45. TelegramBotToken string
  46. TelegramBotChatID string
  47. TelegramBotTopicID *int64
  48. TelegramBotDisableWebPagePreview bool
  49. TelegramBotDisableNotification bool
  50. TelegramBotDisableButtons bool
  51. LinkAceEnabled bool
  52. LinkAceURL string
  53. LinkAceAPIKey string
  54. LinkAceTags string
  55. LinkAcePrivate bool
  56. LinkAceCheckDisabled bool
  57. LinkdingEnabled bool
  58. LinkdingURL string
  59. LinkdingAPIKey string
  60. LinkdingTags string
  61. LinkdingMarkAsUnread bool
  62. LinktacoEnabled bool
  63. LinktacoAPIToken string
  64. LinktacoOrgSlug string
  65. LinktacoTags string
  66. LinktacoVisibility string
  67. LinkwardenEnabled bool
  68. LinkwardenURL string
  69. LinkwardenAPIKey string
  70. LinkwardenCollectionID *int64
  71. MatrixBotEnabled bool
  72. MatrixBotUser string
  73. MatrixBotPassword string
  74. MatrixBotURL string
  75. MatrixBotChatID string
  76. AppriseEnabled bool
  77. AppriseURL string
  78. AppriseServicesURL string
  79. ReadeckEnabled bool
  80. ReadeckURL string
  81. ReadeckAPIKey string
  82. ReadeckLabels string
  83. ReadeckOnlyURL bool
  84. ShioriEnabled bool
  85. ShioriURL string
  86. ShioriUsername string
  87. ShioriPassword string
  88. ShaarliEnabled bool
  89. ShaarliURL string
  90. ShaarliAPISecret string
  91. WebhookEnabled bool
  92. WebhookURL string
  93. WebhookSecret string
  94. RSSBridgeEnabled bool
  95. RSSBridgeURL string
  96. RSSBridgeToken string
  97. OmnivoreEnabled bool
  98. OmnivoreAPIKey string
  99. OmnivoreURL string
  100. KarakeepEnabled bool
  101. KarakeepAPIKey string
  102. KarakeepURL string
  103. KarakeepTags string
  104. RaindropEnabled bool
  105. RaindropToken string
  106. RaindropCollectionID string
  107. RaindropTags string
  108. BetulaEnabled bool
  109. BetulaURL string
  110. BetulaToken string
  111. NtfyEnabled bool
  112. NtfyTopic string
  113. NtfyURL string
  114. NtfyAPIToken string
  115. NtfyUsername string
  116. NtfyPassword string
  117. NtfyIconURL string
  118. NtfyInternalLinks bool
  119. CuboxEnabled bool
  120. CuboxAPILink string
  121. DiscordEnabled bool
  122. DiscordWebhookLink string
  123. SlackEnabled bool
  124. SlackWebhookLink string
  125. PushoverEnabled bool
  126. PushoverUser string
  127. PushoverToken string
  128. PushoverDevice string
  129. PushoverPrefix string
  130. ArchiveorgEnabled bool
  131. }
  132. // Merge copy form values to the model.
  133. func (i IntegrationForm) Merge(integration *model.Integration) {
  134. integration.PinboardEnabled = i.PinboardEnabled
  135. integration.PinboardToken = i.PinboardToken
  136. integration.PinboardTags = i.PinboardTags
  137. integration.PinboardMarkAsUnread = i.PinboardMarkAsUnread
  138. integration.InstapaperEnabled = i.InstapaperEnabled
  139. integration.InstapaperUsername = i.InstapaperUsername
  140. integration.InstapaperPassword = i.InstapaperPassword
  141. integration.FeverEnabled = i.FeverEnabled
  142. integration.FeverUsername = i.FeverUsername
  143. integration.GoogleReaderEnabled = i.GoogleReaderEnabled
  144. integration.GoogleReaderUsername = i.GoogleReaderUsername
  145. integration.WallabagEnabled = i.WallabagEnabled
  146. integration.WallabagOnlyURL = i.WallabagOnlyURL
  147. integration.WallabagURL = i.WallabagURL
  148. integration.WallabagClientID = i.WallabagClientID
  149. integration.WallabagClientSecret = i.WallabagClientSecret
  150. integration.WallabagUsername = i.WallabagUsername
  151. integration.WallabagPassword = i.WallabagPassword
  152. integration.WallabagTags = i.WallabagTags
  153. integration.NotionEnabled = i.NotionEnabled
  154. integration.NotionPageID = i.NotionPageID
  155. integration.NotionToken = i.NotionToken
  156. integration.NunuxKeeperEnabled = i.NunuxKeeperEnabled
  157. integration.NunuxKeeperURL = i.NunuxKeeperURL
  158. integration.NunuxKeeperAPIKey = i.NunuxKeeperAPIKey
  159. integration.EspialEnabled = i.EspialEnabled
  160. integration.EspialURL = i.EspialURL
  161. integration.EspialAPIKey = i.EspialAPIKey
  162. integration.EspialTags = i.EspialTags
  163. integration.ReadwiseEnabled = i.ReadwiseEnabled
  164. integration.ReadwiseAPIKey = i.ReadwiseAPIKey
  165. integration.TelegramBotEnabled = i.TelegramBotEnabled
  166. integration.TelegramBotToken = i.TelegramBotToken
  167. integration.TelegramBotChatID = i.TelegramBotChatID
  168. integration.TelegramBotTopicID = i.TelegramBotTopicID
  169. integration.TelegramBotDisableWebPagePreview = i.TelegramBotDisableWebPagePreview
  170. integration.TelegramBotDisableNotification = i.TelegramBotDisableNotification
  171. integration.TelegramBotDisableButtons = i.TelegramBotDisableButtons
  172. integration.LinkAceEnabled = i.LinkAceEnabled
  173. integration.LinkAceURL = i.LinkAceURL
  174. integration.LinkAceAPIKey = i.LinkAceAPIKey
  175. integration.LinkAceTags = i.LinkAceTags
  176. integration.LinkAcePrivate = i.LinkAcePrivate
  177. integration.LinkAceCheckDisabled = i.LinkAceCheckDisabled
  178. integration.LinkdingEnabled = i.LinkdingEnabled
  179. integration.LinkdingURL = i.LinkdingURL
  180. integration.LinkdingAPIKey = i.LinkdingAPIKey
  181. integration.LinkdingTags = i.LinkdingTags
  182. integration.LinkdingMarkAsUnread = i.LinkdingMarkAsUnread
  183. integration.LinktacoEnabled = i.LinktacoEnabled
  184. integration.LinktacoAPIToken = i.LinktacoAPIToken
  185. integration.LinktacoOrgSlug = i.LinktacoOrgSlug
  186. integration.LinktacoTags = i.LinktacoTags
  187. integration.LinktacoVisibility = i.LinktacoVisibility
  188. integration.LinkwardenEnabled = i.LinkwardenEnabled
  189. integration.LinkwardenURL = i.LinkwardenURL
  190. integration.LinkwardenAPIKey = i.LinkwardenAPIKey
  191. integration.LinkwardenCollectionID = i.LinkwardenCollectionID
  192. integration.MatrixBotEnabled = i.MatrixBotEnabled
  193. integration.MatrixBotUser = i.MatrixBotUser
  194. integration.MatrixBotPassword = i.MatrixBotPassword
  195. integration.MatrixBotURL = i.MatrixBotURL
  196. integration.MatrixBotChatID = i.MatrixBotChatID
  197. integration.AppriseEnabled = i.AppriseEnabled
  198. integration.AppriseServicesURL = i.AppriseServicesURL
  199. integration.AppriseURL = i.AppriseURL
  200. integration.ReadeckEnabled = i.ReadeckEnabled
  201. integration.ReadeckURL = i.ReadeckURL
  202. integration.ReadeckAPIKey = i.ReadeckAPIKey
  203. integration.ReadeckLabels = i.ReadeckLabels
  204. integration.ReadeckOnlyURL = i.ReadeckOnlyURL
  205. integration.ShioriEnabled = i.ShioriEnabled
  206. integration.ShioriURL = i.ShioriURL
  207. integration.ShioriUsername = i.ShioriUsername
  208. integration.ShioriPassword = i.ShioriPassword
  209. integration.ShaarliEnabled = i.ShaarliEnabled
  210. integration.ShaarliURL = i.ShaarliURL
  211. integration.ShaarliAPISecret = i.ShaarliAPISecret
  212. integration.WebhookEnabled = i.WebhookEnabled
  213. integration.WebhookURL = i.WebhookURL
  214. integration.RSSBridgeEnabled = i.RSSBridgeEnabled
  215. integration.RSSBridgeURL = i.RSSBridgeURL
  216. integration.RSSBridgeToken = i.RSSBridgeToken
  217. integration.OmnivoreEnabled = i.OmnivoreEnabled
  218. integration.OmnivoreAPIKey = i.OmnivoreAPIKey
  219. integration.OmnivoreURL = i.OmnivoreURL
  220. integration.KarakeepEnabled = i.KarakeepEnabled
  221. integration.KarakeepAPIKey = i.KarakeepAPIKey
  222. integration.KarakeepURL = i.KarakeepURL
  223. integration.KarakeepTags = i.KarakeepTags
  224. integration.RaindropEnabled = i.RaindropEnabled
  225. integration.RaindropToken = i.RaindropToken
  226. integration.RaindropCollectionID = i.RaindropCollectionID
  227. integration.RaindropTags = i.RaindropTags
  228. integration.BetulaEnabled = i.BetulaEnabled
  229. integration.BetulaURL = i.BetulaURL
  230. integration.BetulaToken = i.BetulaToken
  231. integration.NtfyEnabled = i.NtfyEnabled
  232. integration.NtfyTopic = i.NtfyTopic
  233. integration.NtfyURL = i.NtfyURL
  234. integration.NtfyAPIToken = i.NtfyAPIToken
  235. integration.NtfyUsername = i.NtfyUsername
  236. integration.NtfyPassword = i.NtfyPassword
  237. integration.NtfyIconURL = i.NtfyIconURL
  238. integration.NtfyInternalLinks = i.NtfyInternalLinks
  239. integration.CuboxEnabled = i.CuboxEnabled
  240. integration.CuboxAPILink = i.CuboxAPILink
  241. integration.DiscordEnabled = i.DiscordEnabled
  242. integration.DiscordWebhookLink = i.DiscordWebhookLink
  243. integration.SlackEnabled = i.SlackEnabled
  244. integration.SlackWebhookLink = i.SlackWebhookLink
  245. integration.PushoverEnabled = i.PushoverEnabled
  246. integration.PushoverUser = i.PushoverUser
  247. integration.PushoverToken = i.PushoverToken
  248. integration.PushoverDevice = i.PushoverDevice
  249. integration.PushoverPrefix = i.PushoverPrefix
  250. integration.ArchiveorgEnabled = i.ArchiveorgEnabled
  251. }
  252. // NewIntegrationForm returns a new IntegrationForm.
  253. func NewIntegrationForm(r *http.Request) *IntegrationForm {
  254. return &IntegrationForm{
  255. PinboardEnabled: r.FormValue("pinboard_enabled") == "1",
  256. PinboardToken: r.FormValue("pinboard_token"),
  257. PinboardTags: r.FormValue("pinboard_tags"),
  258. PinboardMarkAsUnread: r.FormValue("pinboard_mark_as_unread") == "1",
  259. InstapaperEnabled: r.FormValue("instapaper_enabled") == "1",
  260. InstapaperUsername: r.FormValue("instapaper_username"),
  261. InstapaperPassword: r.FormValue("instapaper_password"),
  262. FeverEnabled: r.FormValue("fever_enabled") == "1",
  263. FeverUsername: r.FormValue("fever_username"),
  264. FeverPassword: r.FormValue("fever_password"),
  265. GoogleReaderEnabled: r.FormValue("googlereader_enabled") == "1",
  266. GoogleReaderUsername: r.FormValue("googlereader_username"),
  267. GoogleReaderPassword: r.FormValue("googlereader_password"),
  268. WallabagEnabled: r.FormValue("wallabag_enabled") == "1",
  269. WallabagOnlyURL: r.FormValue("wallabag_only_url") == "1",
  270. WallabagURL: r.FormValue("wallabag_url"),
  271. WallabagClientID: r.FormValue("wallabag_client_id"),
  272. WallabagClientSecret: r.FormValue("wallabag_client_secret"),
  273. WallabagUsername: r.FormValue("wallabag_username"),
  274. WallabagPassword: r.FormValue("wallabag_password"),
  275. WallabagTags: r.FormValue("wallabag_tags"),
  276. NotionEnabled: r.FormValue("notion_enabled") == "1",
  277. NotionPageID: r.FormValue("notion_page_id"),
  278. NotionToken: r.FormValue("notion_token"),
  279. NunuxKeeperEnabled: r.FormValue("nunux_keeper_enabled") == "1",
  280. NunuxKeeperURL: r.FormValue("nunux_keeper_url"),
  281. NunuxKeeperAPIKey: r.FormValue("nunux_keeper_api_key"),
  282. EspialEnabled: r.FormValue("espial_enabled") == "1",
  283. EspialURL: r.FormValue("espial_url"),
  284. EspialAPIKey: r.FormValue("espial_api_key"),
  285. EspialTags: r.FormValue("espial_tags"),
  286. ReadwiseEnabled: r.FormValue("readwise_enabled") == "1",
  287. ReadwiseAPIKey: r.FormValue("readwise_api_key"),
  288. TelegramBotEnabled: r.FormValue("telegram_bot_enabled") == "1",
  289. TelegramBotToken: r.FormValue("telegram_bot_token"),
  290. TelegramBotChatID: r.FormValue("telegram_bot_chat_id"),
  291. TelegramBotTopicID: optionalInt64Field(r.FormValue("telegram_bot_topic_id")),
  292. TelegramBotDisableWebPagePreview: r.FormValue("telegram_bot_disable_web_page_preview") == "1",
  293. TelegramBotDisableNotification: r.FormValue("telegram_bot_disable_notification") == "1",
  294. TelegramBotDisableButtons: r.FormValue("telegram_bot_disable_buttons") == "1",
  295. LinkAceEnabled: r.FormValue("linkace_enabled") == "1",
  296. LinkAceURL: r.FormValue("linkace_url"),
  297. LinkAceAPIKey: r.FormValue("linkace_api_key"),
  298. LinkAceTags: r.FormValue("linkace_tags"),
  299. LinkAcePrivate: r.FormValue("linkace_is_private") == "1",
  300. LinkAceCheckDisabled: r.FormValue("linkace_check_disabled") == "1",
  301. LinkdingEnabled: r.FormValue("linkding_enabled") == "1",
  302. LinkdingURL: r.FormValue("linkding_url"),
  303. LinkdingAPIKey: r.FormValue("linkding_api_key"),
  304. LinkdingTags: r.FormValue("linkding_tags"),
  305. LinkdingMarkAsUnread: r.FormValue("linkding_mark_as_unread") == "1",
  306. LinktacoEnabled: r.FormValue("linktaco_enabled") == "1",
  307. LinktacoAPIToken: r.FormValue("linktaco_api_token"),
  308. LinktacoOrgSlug: r.FormValue("linktaco_org_slug"),
  309. LinktacoTags: r.FormValue("linktaco_tags"),
  310. LinktacoVisibility: r.FormValue("linktaco_visibility"),
  311. LinkwardenEnabled: r.FormValue("linkwarden_enabled") == "1",
  312. LinkwardenURL: r.FormValue("linkwarden_url"),
  313. LinkwardenAPIKey: r.FormValue("linkwarden_api_key"),
  314. LinkwardenCollectionID: optionalInt64Field(r.FormValue("linkwarden_collection_id")),
  315. MatrixBotEnabled: r.FormValue("matrix_bot_enabled") == "1",
  316. MatrixBotUser: r.FormValue("matrix_bot_user"),
  317. MatrixBotPassword: r.FormValue("matrix_bot_password"),
  318. MatrixBotURL: r.FormValue("matrix_bot_url"),
  319. MatrixBotChatID: r.FormValue("matrix_bot_chat_id"),
  320. AppriseEnabled: r.FormValue("apprise_enabled") == "1",
  321. AppriseURL: r.FormValue("apprise_url"),
  322. AppriseServicesURL: r.FormValue("apprise_services_url"),
  323. ReadeckEnabled: r.FormValue("readeck_enabled") == "1",
  324. ReadeckURL: r.FormValue("readeck_url"),
  325. ReadeckAPIKey: r.FormValue("readeck_api_key"),
  326. ReadeckLabels: r.FormValue("readeck_labels"),
  327. ReadeckOnlyURL: r.FormValue("readeck_only_url") == "1",
  328. ShioriEnabled: r.FormValue("shiori_enabled") == "1",
  329. ShioriURL: r.FormValue("shiori_url"),
  330. ShioriUsername: r.FormValue("shiori_username"),
  331. ShioriPassword: r.FormValue("shiori_password"),
  332. ShaarliEnabled: r.FormValue("shaarli_enabled") == "1",
  333. ShaarliURL: r.FormValue("shaarli_url"),
  334. ShaarliAPISecret: r.FormValue("shaarli_api_secret"),
  335. WebhookEnabled: r.FormValue("webhook_enabled") == "1",
  336. WebhookURL: r.FormValue("webhook_url"),
  337. RSSBridgeEnabled: r.FormValue("rssbridge_enabled") == "1",
  338. RSSBridgeURL: r.FormValue("rssbridge_url"),
  339. RSSBridgeToken: r.FormValue("rssbridge_token"),
  340. OmnivoreEnabled: r.FormValue("omnivore_enabled") == "1",
  341. OmnivoreAPIKey: r.FormValue("omnivore_api_key"),
  342. OmnivoreURL: r.FormValue("omnivore_url"),
  343. KarakeepEnabled: r.FormValue("karakeep_enabled") == "1",
  344. KarakeepAPIKey: r.FormValue("karakeep_api_key"),
  345. KarakeepURL: r.FormValue("karakeep_url"),
  346. KarakeepTags: r.FormValue("karakeep_tags"),
  347. RaindropEnabled: r.FormValue("raindrop_enabled") == "1",
  348. RaindropToken: r.FormValue("raindrop_token"),
  349. RaindropCollectionID: r.FormValue("raindrop_collection_id"),
  350. RaindropTags: r.FormValue("raindrop_tags"),
  351. BetulaEnabled: r.FormValue("betula_enabled") == "1",
  352. BetulaURL: r.FormValue("betula_url"),
  353. BetulaToken: r.FormValue("betula_token"),
  354. NtfyEnabled: r.FormValue("ntfy_enabled") == "1",
  355. NtfyTopic: r.FormValue("ntfy_topic"),
  356. NtfyURL: r.FormValue("ntfy_url"),
  357. NtfyAPIToken: r.FormValue("ntfy_api_token"),
  358. NtfyUsername: r.FormValue("ntfy_username"),
  359. NtfyPassword: r.FormValue("ntfy_password"),
  360. NtfyIconURL: r.FormValue("ntfy_icon_url"),
  361. NtfyInternalLinks: r.FormValue("ntfy_internal_links") == "1",
  362. CuboxEnabled: r.FormValue("cubox_enabled") == "1",
  363. CuboxAPILink: r.FormValue("cubox_api_link"),
  364. DiscordEnabled: r.FormValue("discord_enabled") == "1",
  365. DiscordWebhookLink: r.FormValue("discord_webhook_link"),
  366. SlackEnabled: r.FormValue("slack_enabled") == "1",
  367. SlackWebhookLink: r.FormValue("slack_webhook_link"),
  368. PushoverEnabled: r.FormValue("pushover_enabled") == "1",
  369. PushoverUser: r.FormValue("pushover_user"),
  370. PushoverToken: r.FormValue("pushover_token"),
  371. PushoverDevice: r.FormValue("pushover_device"),
  372. PushoverPrefix: r.FormValue("pushover_prefix"),
  373. ArchiveorgEnabled: r.FormValue("archiveorg_enabled") == "1",
  374. }
  375. }
  376. func optionalInt64Field(formValue string) *int64 {
  377. if formValue == "" {
  378. return nil
  379. }
  380. value, _ := strconv.ParseInt(formValue, 10, 64)
  381. return &value
  382. }