Forráskód Böngészése

feat(rssbridge): support auth token for RSS-Bridge

Anton Larionov 11 hónapja
szülő
commit
553c578f2e
31 módosított fájl, 90 hozzáadás és 29 törlés
  1. 3 0
      internal/api/subscription.go
  2. 7 0
      internal/database/migrations.go
  3. 3 1
      internal/googlereader/handler.go
  4. 13 1
      internal/integration/rssbridge/rssbridge.go
  5. 2 1
      internal/locale/translations/de_DE.json
  6. 2 1
      internal/locale/translations/el_EL.json
  7. 2 1
      internal/locale/translations/en_US.json
  8. 2 1
      internal/locale/translations/es_ES.json
  9. 2 1
      internal/locale/translations/fi_FI.json
  10. 2 1
      internal/locale/translations/fr_FR.json
  11. 2 1
      internal/locale/translations/hi_IN.json
  12. 2 1
      internal/locale/translations/id_ID.json
  13. 2 1
      internal/locale/translations/it_IT.json
  14. 2 1
      internal/locale/translations/ja_JP.json
  15. 2 1
      internal/locale/translations/nan_Latn_pehoeji.json
  16. 2 1
      internal/locale/translations/nl_NL.json
  17. 2 1
      internal/locale/translations/pl_PL.json
  18. 2 1
      internal/locale/translations/pt_BR.json
  19. 2 1
      internal/locale/translations/ro_RO.json
  20. 2 1
      internal/locale/translations/ru_RU.json
  21. 2 1
      internal/locale/translations/tr_TR.json
  22. 2 1
      internal/locale/translations/uk_UA.json
  23. 2 1
      internal/locale/translations/zh_CN.json
  24. 2 1
      internal/locale/translations/zh_TW.json
  25. 1 0
      internal/model/integration.go
  26. 6 4
      internal/reader/subscription/finder.go
  27. 7 3
      internal/storage/integration.go
  28. 3 0
      internal/template/templates/views/integrations.html
  29. 3 0
      internal/ui/form/integration.go
  30. 1 0
      internal/ui/integration_show.go
  31. 3 0
      internal/ui/subscription_submit.go

+ 3 - 0
internal/api/subscription.go

@@ -30,9 +30,11 @@ func (h *handler) discoverSubscriptions(w http.ResponseWriter, r *http.Request)
 	}
 
 	var rssbridgeURL string
+	var rssbridgeToken string
 	intg, err := h.store.Integration(request.UserID(r))
 	if err == nil && intg != nil && intg.RSSBridgeEnabled {
 		rssbridgeURL = intg.RSSBridgeURL
+		rssbridgeToken = intg.RSSBridgeToken
 	}
 
 	requestBuilder := fetcher.NewRequestBuilder()
@@ -50,6 +52,7 @@ func (h *handler) discoverSubscriptions(w http.ResponseWriter, r *http.Request)
 	subscriptions, localizedError := subscription.NewSubscriptionFinder(requestBuilder).FindSubscriptions(
 		subscriptionDiscoveryRequest.URL,
 		rssbridgeURL,
+		rssbridgeToken,
 	)
 
 	if localizedError != nil {

+ 7 - 0
internal/database/migrations.go

@@ -1066,4 +1066,11 @@ var migrations = []func(tx *sql.Tx, driver string) error{
 		_, err = tx.Exec(`ALTER TABLE feeds ADD COLUMN proxy_url text default ''`)
 		return err
 	},
+	func(tx *sql.Tx, _ string) (err error) {
+		sql := `
+			ALTER TABLE integrations ADD COLUMN rssbridge_token text default '';
+		`
+		_, err = tx.Exec(sql)
+		return
+	},
 }

+ 3 - 1
internal/googlereader/handler.go

@@ -418,11 +418,13 @@ func (h *handler) quickAddHandler(w http.ResponseWriter, r *http.Request) {
 	requestBuilder.WithProxyRotator(proxyrotator.ProxyRotatorInstance)
 
 	var rssBridgeURL string
+	var rssBridgeToken string
 	if intg, err := h.store.Integration(userID); err == nil && intg != nil && intg.RSSBridgeEnabled {
 		rssBridgeURL = intg.RSSBridgeURL
+		rssBridgeToken = intg.RSSBridgeToken
 	}
 
-	subscriptions, localizedError := mfs.NewSubscriptionFinder(requestBuilder).FindSubscriptions(feedURL, rssBridgeURL)
+	subscriptions, localizedError := mfs.NewSubscriptionFinder(requestBuilder).FindSubscriptions(feedURL, rssBridgeURL, rssBridgeToken)
 	if localizedError != nil {
 		json.ServerError(w, r, localizedError.Error())
 		return

+ 13 - 1
internal/integration/rssbridge/rssbridge.go

@@ -24,13 +24,16 @@ type BridgeMeta struct {
 	Name string `json:"name"`
 }
 
-func DetectBridges(rssBridgeURL, websiteURL string) ([]*Bridge, error) {
+func DetectBridges(rssBridgeURL, rssBridgeToken, websiteURL string) ([]*Bridge, error) {
 	endpointURL, err := url.Parse(rssBridgeURL)
 	if err != nil {
 		return nil, fmt.Errorf("RSS-Bridge: unable to parse bridge URL: %w", err)
 	}
 
 	values := endpointURL.Query()
+	if rssBridgeToken != "" {
+		values.Add("token", rssBridgeToken)
+	}
 	values.Add("action", "findfeed")
 	values.Add("format", "atom")
 	values.Add("url", websiteURL)
@@ -78,6 +81,15 @@ func DetectBridges(rssBridgeURL, websiteURL string) ([]*Bridge, error) {
 				slog.String("url", bridge.URL),
 			)
 		}
+
+		if rssBridgeToken != "" {
+			bridge.URL = bridge.URL + "&token=" + rssBridgeToken
+
+			slog.Debug("Appended token to RSS bridge URL",
+				slog.String("name", bridge.BridgeMeta.Name),
+				slog.String("url", bridge.URL),
+			)
+		}
 	}
 
 	return bridgeResponse, nil

+ 2 - 1
internal/locale/translations/de_DE.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise-Reader-Zugangstoken",
     "form.integration.readwise_api_key_link": "Erhalten Sie Ihren Readwise-Zugangstoken",
     "form.integration.rssbridge_activate": "Beim Hinzufügen von Abonnements RSS-Bridge prüfen.",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge-Server-URL",
     "form.integration.shaarli_activate": "Artikel in Shaarli speichern",
     "form.integration.shaarli_api_secret": "Shaarli-API-Geheimnis",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "gestern",
     "tooltip.keyboard_shortcuts": "Tastenkürzel: %s",
     "tooltip.logged_user": "Angemeldet als %s"
-}
+}

+ 2 - 1
internal/locale/translations/el_EL.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "χθες",
     "tooltip.keyboard_shortcuts": "Συντόμευση πληκτρολογίου: % s",
     "tooltip.logged_user": "Συνδεδεμένος/η ως %s"
-}
+}

+ 2 - 1
internal/locale/translations/en_US.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "yesterday",
     "tooltip.keyboard_shortcuts": "Keyboard Shortcut: %s",
     "tooltip.logged_user": "Logged in as %s"
-}
+}

+ 2 - 1
internal/locale/translations/es_ES.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Token de acceso a Readwise Reader",
     "form.integration.readwise_api_key_link": "Obtener tu token de acceso a Readwise",
     "form.integration.rssbridge_activate": "Vericar RSS-Bridge al agregar suscripciones",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "URL del servidro RSS-Bridge",
     "form.integration.shaarli_activate": "Guardar artículos en Shaarli",
     "form.integration.shaarli_api_secret": "Secreto API de Shaarli",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "ayer",
     "tooltip.keyboard_shortcuts": "Atajo de teclado: %s",
     "tooltip.logged_user": "Registrado como %s"
-}
+}

+ 2 - 1
internal/locale/translations/fi_FI.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "eilen",
     "tooltip.keyboard_shortcuts": "Pikanäppäin: %s",
     "tooltip.logged_user": "Kirjautunut %s-käyttäjänä"
-}
+}

+ 2 - 1
internal/locale/translations/fr_FR.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Jeton d'accès au lecteur Readwise",
     "form.integration.readwise_api_key_link": "Obtenez votre jeton d'accès Readwise",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Sauvegarder les articles vers Shaarli",
     "form.integration.shaarli_api_secret": "Clé d'API de Shaarli API",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "hier",
     "tooltip.keyboard_shortcuts": "Raccourci clavier : %s",
     "tooltip.logged_user": "Connecté en tant que %s"
-}
+}

+ 2 - 1
internal/locale/translations/hi_IN.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "कल",
     "tooltip.keyboard_shortcuts": "कुंजीपटल संक्षिप्त रीति: %s",
     "tooltip.logged_user": "%s के रूप में लॉग इन किया"
-}
+}

+ 2 - 1
internal/locale/translations/id_ID.json

@@ -293,6 +293,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -591,4 +592,4 @@
     "time_elapsed.yesterday": "kemarin",
     "tooltip.keyboard_shortcuts": "Pintasan Papan Tik: %s",
     "tooltip.logged_user": "Masuk sebagai %s"
-}
+}

+ 2 - 1
internal/locale/translations/it_IT.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "ieri",
     "tooltip.keyboard_shortcuts": "Scorciatoia da tastiera: %s",
     "tooltip.logged_user": "Autenticato come %s"
-}
+}

+ 2 - 1
internal/locale/translations/ja_JP.json

@@ -293,6 +293,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -591,4 +592,4 @@
     "time_elapsed.yesterday": "昨日",
     "tooltip.keyboard_shortcuts": "キーボードショートカット: %s",
     "tooltip.logged_user": "%s としてログイン中"
-}
+}

+ 2 - 1
internal/locale/translations/nan_Latn_pehoeji.json

@@ -293,6 +293,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Acess Token",
     "form.integration.readwise_api_key_link": "Chhú-tek lí ê Readwise Acess Token",
     "form.integration.rssbridge_activate": "Sin cheng-ka siau-sit lâi-goân ê sî tio̍h RSS-Bridge",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge su-hāu-khì的bāng-chí",
     "form.integration.shaarli_activate": "Pó-chûn siau-sit kàu Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API só-sî",
@@ -591,4 +592,4 @@
     "time_elapsed.yesterday": "cha-hng",
     "tooltip.keyboard_shortcuts": "Khoài-sok khí:%s",
     "tooltip.logged_user": "Chit-má teng-lo̍k--ê:  %s"
-}
+}

+ 2 - 1
internal/locale/translations/nl_NL.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Readwise Access Token ophalen",
     "form.integration.rssbridge_activate": "Controleer RSS-Bridge bij het toevoegen van abonnementen",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Artikelen opslaan in Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "gisteren",
     "tooltip.keyboard_shortcuts": "Sneltoets: %s",
     "tooltip.logged_user": "Ingelogd als %s"
-}
+}

+ 2 - 1
internal/locale/translations/pl_PL.json

@@ -297,6 +297,7 @@
     "form.integration.readwise_api_key": "Token dostępu do czytnika Readwise",
     "form.integration.readwise_api_key_link": "Zdobądź token dostępu Readwise",
     "form.integration.rssbridge_activate": "Sprawdź RSS-Bridge podczas dodawania subskrypcji",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "Adres URL serwera RSS-Bridge",
     "form.integration.shaarli_activate": "Zapisuj artykuły w Shaarli",
     "form.integration.shaarli_api_secret": "Tajny klucz API do Shaarli",
@@ -625,4 +626,4 @@
     "time_elapsed.yesterday": "wczoraj",
     "tooltip.keyboard_shortcuts": "Skróty klawiszowe: %s",
     "tooltip.logged_user": "Zalogowany jako %s"
-}
+}

+ 2 - 1
internal/locale/translations/pt_BR.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "ontem",
     "tooltip.keyboard_shortcuts": "Atalho do teclado: %s",
     "tooltip.logged_user": "Autenticado como %s"
-}
+}

+ 2 - 1
internal/locale/translations/ro_RO.json

@@ -297,6 +297,7 @@
     "form.integration.readwise_api_key": "Token Acces Readwise Reader",
     "form.integration.readwise_api_key_link": "Obțineți Token-ul de Acess pe Readwise",
     "form.integration.rssbridge_activate": "Verifică RSS-Bridge la adăugarea de abonamente",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "URL server RSS-Bridge",
     "form.integration.shaarli_activate": "Salvează articolele în Shaarli",
     "form.integration.shaarli_api_secret": "Secret API Shaarli",
@@ -625,4 +626,4 @@
     "time_elapsed.yesterday": "ieri",
     "tooltip.keyboard_shortcuts": "Scurtături Tastatură: %s",
     "tooltip.logged_user": "Atentificat ca %s"
-}
+}

+ 2 - 1
internal/locale/translations/ru_RU.json

@@ -297,6 +297,7 @@
     "form.integration.readwise_api_key": "Токен доступа в Readwise",
     "form.integration.readwise_api_key_link": "Получить токен доступа Readwise",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Сохранить статьи в Shaarli",
     "form.integration.shaarli_api_secret": "Секретный ключ Shaarli API",
@@ -625,4 +626,4 @@
     "time_elapsed.yesterday": "вчера",
     "tooltip.keyboard_shortcuts": "Сочетания клавиш: %s",
     "tooltip.logged_user": "Авторизован как %s"
-}
+}

+ 2 - 1
internal/locale/translations/tr_TR.json

@@ -295,6 +295,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Readwise Access Token'ınızı alın",
     "form.integration.rssbridge_activate": "Abonelik eklerken RSS-Bridge'i kontrol edin",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Makaleleri Shaarli'ye kaydet",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -608,4 +609,4 @@
     "time_elapsed.yesterday": "dün",
     "tooltip.keyboard_shortcuts": "Klavye Kısayolu: %s",
     "tooltip.logged_user": "%s olarak giriş yapıldı"
-}
+}

+ 2 - 1
internal/locale/translations/uk_UA.json

@@ -297,6 +297,7 @@
     "form.integration.readwise_api_key": "Readwise Reader Access Token",
     "form.integration.readwise_api_key_link": "Get your Readwise Access Token",
     "form.integration.rssbridge_activate": "Check RSS-Bridge when adding subscriptions",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge server URL",
     "form.integration.shaarli_activate": "Save articles to Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API Secret",
@@ -625,4 +626,4 @@
     "time_elapsed.yesterday": "вчора",
     "tooltip.keyboard_shortcuts": "Комбінація клавіш: %s",
     "tooltip.logged_user": "Здійснено вхід як %s"
-}
+}

+ 2 - 1
internal/locale/translations/zh_CN.json

@@ -293,6 +293,7 @@
     "form.integration.readwise_api_key": "Readwise Reader 访问令牌",
     "form.integration.readwise_api_key_link": "获取你的 Readwise 访问令牌",
     "form.integration.rssbridge_activate": "添加订阅时检查 RSS-Bridge",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge 服务器 URL",
     "form.integration.shaarli_activate": "保存文章到 Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API 密钥",
@@ -591,4 +592,4 @@
     "time_elapsed.yesterday": "昨天",
     "tooltip.keyboard_shortcuts": "快捷键: %s",
     "tooltip.logged_user": "当前登录 %s"
-}
+}

+ 2 - 1
internal/locale/translations/zh_TW.json

@@ -293,6 +293,7 @@
     "form.integration.readwise_api_key": "Readwise Reader 存取金鑰",
     "form.integration.readwise_api_key_link": "取得您的 Readwise 存取金鑰",
     "form.integration.rssbridge_activate": "新增訂閱時檢查 RSS-Bridge",
+    "form.integration.rssbridge_token": "RSS-Bridge authentication token",
     "form.integration.rssbridge_url": "RSS-Bridge 伺服器的網址",
     "form.integration.shaarli_activate": "儲存文章到 Shaarli",
     "form.integration.shaarli_api_secret": "Shaarli API 金鑰",
@@ -591,4 +592,4 @@
     "time_elapsed.yesterday": "昨天",
     "tooltip.keyboard_shortcuts": "快捷鍵:%s",
     "tooltip.logged_user": "目前登入 %s"
-}
+}

+ 1 - 0
internal/model/integration.go

@@ -90,6 +90,7 @@ type Integration struct {
 	WebhookSecret                    string
 	RSSBridgeEnabled                 bool
 	RSSBridgeURL                     string
+	RSSBridgeToken                   string
 	OmnivoreEnabled                  bool
 	OmnivoreAPIKey                   string
 	OmnivoreURL                      string

+ 6 - 4
internal/reader/subscription/finder.go

@@ -48,7 +48,7 @@ func (f *SubscriptionFinder) FeedResponseInfo() *model.FeedCreationRequestFromSu
 	return f.feedResponseInfo
 }
 
-func (f *SubscriptionFinder) FindSubscriptions(websiteURL, rssBridgeURL string) (Subscriptions, *locale.LocalizedErrorWrapper) {
+func (f *SubscriptionFinder) FindSubscriptions(websiteURL, rssBridgeURL string, rssBridgeToken string) (Subscriptions, *locale.LocalizedErrorWrapper) {
 	responseHandler := fetcher.NewResponseHandler(f.requestBuilder.ExecuteRequest(websiteURL))
 	defer responseHandler.Close()
 
@@ -108,7 +108,7 @@ func (f *SubscriptionFinder) FindSubscriptions(websiteURL, rssBridgeURL string)
 	// Step 5) Check if the website URL can use RSS-Bridge.
 	if rssBridgeURL != "" {
 		slog.Debug("Try to detect feeds with RSS-Bridge", slog.String("website_url", websiteURL))
-		if subscriptions, localizedError := f.FindSubscriptionsFromRSSBridge(websiteURL, rssBridgeURL); localizedError != nil {
+		if subscriptions, localizedError := f.FindSubscriptionsFromRSSBridge(websiteURL, rssBridgeURL, rssBridgeToken); localizedError != nil {
 			return nil, localizedError
 		} else if len(subscriptions) > 0 {
 			slog.Debug("Subscriptions found from RSS-Bridge", slog.String("website_url", websiteURL), slog.Any("subscriptions", subscriptions))
@@ -254,13 +254,14 @@ func (f *SubscriptionFinder) FindSubscriptionsFromWellKnownURLs(websiteURL strin
 	return subscriptions, nil
 }
 
-func (f *SubscriptionFinder) FindSubscriptionsFromRSSBridge(websiteURL, rssBridgeURL string) (Subscriptions, *locale.LocalizedErrorWrapper) {
+func (f *SubscriptionFinder) FindSubscriptionsFromRSSBridge(websiteURL, rssBridgeURL string, rssBridgeToken string) (Subscriptions, *locale.LocalizedErrorWrapper) {
 	slog.Debug("Trying to detect feeds using RSS-Bridge",
 		slog.String("website_url", websiteURL),
 		slog.String("rssbridge_url", rssBridgeURL),
+		slog.String("rssbridge_token", rssBridgeToken),
 	)
 
-	bridges, err := rssbridge.DetectBridges(rssBridgeURL, websiteURL)
+	bridges, err := rssbridge.DetectBridges(rssBridgeURL, rssBridgeToken, websiteURL)
 	if err != nil {
 		return nil, locale.NewLocalizedErrorWrapper(err, "error.unable_to_detect_rssbridge", err)
 	}
@@ -268,6 +269,7 @@ func (f *SubscriptionFinder) FindSubscriptionsFromRSSBridge(websiteURL, rssBridg
 	slog.Debug("RSS-Bridge results",
 		slog.String("website_url", websiteURL),
 		slog.String("rssbridge_url", rssBridgeURL),
+		slog.String("rssbridge_token", rssBridgeToken),
 		slog.Int("nb_bridges", len(bridges)),
 	)
 

+ 7 - 3
internal/storage/integration.go

@@ -219,7 +219,8 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
 			pushover_user,
 			pushover_token,
 			pushover_device,
-			pushover_prefix
+			pushover_prefix,
+			rssbridge_token
 		FROM
 			integrations
 		WHERE
@@ -338,6 +339,7 @@ func (s *Storage) Integration(userID int64) (*model.Integration, error) {
 		&integration.PushoverToken,
 		&integration.PushoverDevice,
 		&integration.PushoverPrefix,
+		&integration.RSSBridgeToken,
 	)
 	switch {
 	case err == sql.ErrNoRows:
@@ -464,9 +466,10 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
 			pushover_user=$107,
 			pushover_token=$108,
 			pushover_device=$109,
-			pushover_prefix=$110
+			pushover_prefix=$110,
+			rssbridge_token=$111
 		WHERE
-			user_id=$111
+			user_id=$112
 	`
 	_, err := s.db.Exec(
 		query,
@@ -580,6 +583,7 @@ func (s *Storage) UpdateIntegration(integration *model.Integration) error {
 		integration.PushoverToken,
 		integration.PushoverDevice,
 		integration.PushoverPrefix,
+		integration.RSSBridgeToken,
 		integration.UserID,
 	)
 

+ 3 - 0
internal/template/templates/views/integrations.html

@@ -513,6 +513,9 @@
             <label for="form-rssbridge-url">{{ t "form.integration.rssbridge_url" }}</label>
             <input type="url" name="rssbridge_url" id="form-rssbridge-url" value="{{ .form.RSSBridgeURL }}" spellcheck="false">
 
+            <label for="form-rssbridge-token">{{ t "form.integration.rssbridge_token" }}</label>
+            <input type="password" name="rssbridge_token" id="form-rssbridge-token" value="{{ .form.RSSBridgeToken }}" spellcheck="false">
+
             <div class="buttons">
                 <button type="submit" class="button button-primary" data-label-loading="{{ t "form.submit.saving" }}">{{ t "action.update" }}</button>
             </div>

+ 3 - 0
internal/ui/form/integration.go

@@ -93,6 +93,7 @@ type IntegrationForm struct {
 	WebhookSecret                    string
 	RSSBridgeEnabled                 bool
 	RSSBridgeURL                     string
+	RSSBridgeToken                   string
 	OmnivoreEnabled                  bool
 	OmnivoreAPIKey                   string
 	OmnivoreURL                      string
@@ -204,6 +205,7 @@ func (i IntegrationForm) Merge(integration *model.Integration) {
 	integration.WebhookURL = i.WebhookURL
 	integration.RSSBridgeEnabled = i.RSSBridgeEnabled
 	integration.RSSBridgeURL = i.RSSBridgeURL
+	integration.RSSBridgeToken = i.RSSBridgeToken
 	integration.OmnivoreEnabled = i.OmnivoreEnabled
 	integration.OmnivoreAPIKey = i.OmnivoreAPIKey
 	integration.OmnivoreURL = i.OmnivoreURL
@@ -318,6 +320,7 @@ func NewIntegrationForm(r *http.Request) *IntegrationForm {
 		WebhookURL:                       r.FormValue("webhook_url"),
 		RSSBridgeEnabled:                 r.FormValue("rssbridge_enabled") == "1",
 		RSSBridgeURL:                     r.FormValue("rssbridge_url"),
+		RSSBridgeToken:                   r.FormValue("rssbridge_token"),
 		OmnivoreEnabled:                  r.FormValue("omnivore_enabled") == "1",
 		OmnivoreAPIKey:                   r.FormValue("omnivore_api_key"),
 		OmnivoreURL:                      r.FormValue("omnivore_url"),

+ 1 - 0
internal/ui/integration_show.go

@@ -107,6 +107,7 @@ func (h *handler) showIntegrationPage(w http.ResponseWriter, r *http.Request) {
 		WebhookSecret:                    integration.WebhookSecret,
 		RSSBridgeEnabled:                 integration.RSSBridgeEnabled,
 		RSSBridgeURL:                     integration.RSSBridgeURL,
+		RSSBridgeToken:                   integration.RSSBridgeToken,
 		OmnivoreEnabled:                  integration.OmnivoreEnabled,
 		OmnivoreAPIKey:                   integration.OmnivoreAPIKey,
 		OmnivoreURL:                      integration.OmnivoreURL,

+ 3 - 0
internal/ui/subscription_submit.go

@@ -53,8 +53,10 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 	}
 
 	var rssBridgeURL string
+	var rssBridgeToken string
 	if intg, err := h.store.Integration(user.ID); err == nil && intg != nil && intg.RSSBridgeEnabled {
 		rssBridgeURL = intg.RSSBridgeURL
+		rssBridgeToken = intg.RSSBridgeToken
 	}
 
 	requestBuilder := fetcher.NewRequestBuilder()
@@ -73,6 +75,7 @@ func (h *handler) submitSubscription(w http.ResponseWriter, r *http.Request) {
 	subscriptions, localizedError := subscriptionFinder.FindSubscriptions(
 		subscriptionForm.URL,
 		rssBridgeURL,
+		rssBridgeToken,
 	)
 	if localizedError != nil {
 		v.Set("form", subscriptionForm)