integration.go 16 KB

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