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 @@
>