From 6ec26c14b03ccbf18fedb68c49eab7845d9505a3 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 15 Oct 2025 18:29:24 +0100 Subject: [PATCH] added additional route for checking if url is reachable --- .../accounts/stack_managers_controller.rb | 11 ++++++++++- .../controllers/stack_manager/badge_controller.js | 2 +- app/javascript/utils/portainer.js | 12 ++++++++++++ app/views/devise/sessions/_portainer_badge.html.erb | 5 +---- config/routes.rb | 1 + 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/controllers/accounts/stack_managers_controller.rb b/app/controllers/accounts/stack_managers_controller.rb index 7d90982f..6af62097 100644 --- a/app/controllers/accounts/stack_managers_controller.rb +++ b/app/controllers/accounts/stack_managers_controller.rb @@ -2,7 +2,7 @@ module Accounts class StackManagersController < ApplicationController before_action :authenticate_user! before_action :set_stack, only: [ :sync_clusters, :sync_registries ] - skip_before_action :authenticate_user!, only: [ :verify_url ] + skip_before_action :authenticate_user!, only: [ :verify_url, :check_reachable ] def _verify_stack(stack) if stack.authenticated? @@ -29,6 +29,15 @@ module Accounts _verify_stack(stack) end + def check_reachable + url = params[:stack_manager][:url] + unless Portainer::Client.reachable?(url) + head :bad_gateway + return + end + head :ok + end + def verify_url url = params[:stack_manager][:url] access_code = params[:stack_manager][:access_code] diff --git a/app/javascript/controllers/stack_manager/badge_controller.js b/app/javascript/controllers/stack_manager/badge_controller.js index 821cec31..b230ab4d 100644 --- a/app/javascript/controllers/stack_manager/badge_controller.js +++ b/app/javascript/controllers/stack_manager/badge_controller.js @@ -20,7 +20,7 @@ export default class extends Controller { result = await portainerChecker.verifyPortainerAuthentication(); } else if (this.verificationMethodValue === URL_VERIFICATION_METHOD) { const url = this.verifyUrlValue; - result = await portainerChecker.verifyPortainerUrl(url); + result = await portainerChecker.checkReachable(url); } if (result === PortainerChecker.STATUS_UNAUTHORIZED) { diff --git a/app/javascript/utils/portainer.js b/app/javascript/utils/portainer.js index 94dce035..b8fc5271 100644 --- a/app/javascript/utils/portainer.js +++ b/app/javascript/utils/portainer.js @@ -40,6 +40,18 @@ export class PortainerChecker { return PortainerChecker.STATUS_ERROR; } + async checkReachable(url) { + const response = await fetch('/stack_manager/check_reachable', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': this.csrfToken() + }, + body: JSON.stringify({ stack_manager: { url } }) + }) + return this.toResult(response); + } + async verifyPortainerUrl(url, accessCode) { const response = await fetch('/stack_manager/verify_url', { method: 'POST', diff --git a/app/views/devise/sessions/_portainer_badge.html.erb b/app/views/devise/sessions/_portainer_badge.html.erb index cb3ee5b3..5cd92b6c 100644 --- a/app/views/devise/sessions/_portainer_badge.html.erb +++ b/app/views/devise/sessions/_portainer_badge.html.erb @@ -1,7 +1,4 @@ -<% - verification_method ||= "url" - logout_on_unauthorized ||= false -%> +<% verification_method ||= "url" %>