integration.go 18 KB

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