diff --git a/app/controllers/accounts/stack_managers_controller.rb b/app/controllers/accounts/stack_managers_controller.rb index 7ecfaa0c..3711c1c7 100644 --- a/app/controllers/accounts/stack_managers_controller.rb +++ b/app/controllers/accounts/stack_managers_controller.rb @@ -12,6 +12,11 @@ module Accounts # If the user is not having an email domain end in the # portainer stack url, don't log them out, just return a different unauthorized. + if !stack_manager.is_user?(current_user) + head :method_not_allowed + return + end + if stack_manager.stack.client.authenticated? head :ok else diff --git a/app/javascript/controllers/stack_manager/badge_controller.js b/app/javascript/controllers/stack_manager/badge_controller.js index 98c6bf6d..821cec31 100644 --- a/app/javascript/controllers/stack_manager/badge_controller.js +++ b/app/javascript/controllers/stack_manager/badge_controller.js @@ -5,7 +5,7 @@ const AUTHENTICATION_VERIFICATION_METHOD = "authentication"; const URL_VERIFICATION_METHOD = "url"; export default class extends Controller { - static targets = [ "message", "verifyUrlSuccess", "verifyUrlError", "verifyUrlLoading" ] + static targets = [ "message", "verifyUrlSuccess", "verifyUrlError", "verifyUrlLoading", "verifyUrlNotAllowed" ] static values = { verificationMethod: String, @@ -27,6 +27,8 @@ export default class extends Controller { this.logout(); } else if (result === PortainerChecker.STATUS_OK) { this.verifyUrlSuccessTarget.classList.remove('hidden') + } else if (result === PortainerChecker.STATUS_NOT_ALLOWED) { + this.verifyUrlNotAllowedTarget.classList.remove('hidden') } else { this.verifyUrlErrorTarget.classList.remove('hidden') } diff --git a/app/javascript/utils/portainer.js b/app/javascript/utils/portainer.js index 7123e0ab..9a847d8d 100644 --- a/app/javascript/utils/portainer.js +++ b/app/javascript/utils/portainer.js @@ -1,6 +1,7 @@ export class PortainerChecker { static STATUS_OK = "ok"; static STATUS_UNAUTHORIZED = "unauthorized"; + static STATUS_NOT_ALLOWED = "not_allowed"; static STATUS_ERROR = "error"; csrfToken() { @@ -24,6 +25,10 @@ export class PortainerChecker { return PortainerChecker.STATUS_UNAUTHORIZED; } + if (response.status === 405) { + return PortainerChecker.STATUS_NOT_ALLOWED; + } + if (response.status === 502) { return PortainerChecker.STATUS_ERROR; } diff --git a/app/views/devise/sessions/_portainer_badge.html.erb b/app/views/devise/sessions/_portainer_badge.html.erb index 50eaea00..80b2aebd 100644 --- a/app/views/devise/sessions/_portainer_badge.html.erb +++ b/app/views/devise/sessions/_portainer_badge.html.erb @@ -27,6 +27,13 @@ > +