Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-08-30 22:44:55 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-08-30 22:44:55 +0300
commitf526ce392a317feb5a125bb16adb2629a487ce70 (patch)
tree8ab2b3458181a6cce84b401ce7dc9326fc0f5384 /app/controllers
parentf19a0fa10a0024fab5ef3c556612944f2a62c298 (diff)
Add latest changes from gitlab-org/security/gitlab@14-2-stable-ee
Diffstat (limited to 'app/controllers')
-rw-r--r--app/controllers/jira_connect/app_descriptor_controller.rb8
-rw-r--r--app/controllers/jira_connect/application_controller.rb24
-rw-r--r--app/controllers/jira_connect/subscriptions_controller.rb6
3 files changed, 32 insertions, 6 deletions
diff --git a/app/controllers/jira_connect/app_descriptor_controller.rb b/app/controllers/jira_connect/app_descriptor_controller.rb
index a0f387631dd..74fac6ff9bb 100644
--- a/app/controllers/jira_connect/app_descriptor_controller.rb
+++ b/app/controllers/jira_connect/app_descriptor_controller.rb
@@ -47,7 +47,13 @@ class JiraConnect::AppDescriptorController < JiraConnect::ApplicationController
postInstallPage: {
key: 'gitlab-configuration',
name: { value: 'GitLab Configuration' },
- url: relative_to_base_path(jira_connect_subscriptions_path)
+ url: relative_to_base_path(jira_connect_subscriptions_path),
+ conditions: [
+ {
+ condition: 'user_is_admin',
+ invert: false
+ }
+ ]
}
}
diff --git a/app/controllers/jira_connect/application_controller.rb b/app/controllers/jira_connect/application_controller.rb
index a6529ecb4ce..352e78d6255 100644
--- a/app/controllers/jira_connect/application_controller.rb
+++ b/app/controllers/jira_connect/application_controller.rb
@@ -38,12 +38,30 @@ class JiraConnect::ApplicationController < ApplicationController
end
def installation_from_jwt
- return unless auth_token
-
strong_memoize(:installation_from_jwt) do
+ next unless claims['iss']
+
+ JiraConnectInstallation.find_by_client_key(claims['iss'])
+ end
+ end
+
+ def claims
+ strong_memoize(:claims) do
+ next {} unless auth_token
+
# Decode without verification to get `client_key` in `iss`
payload, _ = Atlassian::Jwt.decode(auth_token, nil, false)
- JiraConnectInstallation.find_by_client_key(payload['iss'])
+ payload
+ end
+ end
+
+ def jira_user
+ strong_memoize(:jira_user) do
+ next unless installation_from_jwt
+ next unless claims['sub']
+
+ # This only works for Jira Cloud installations.
+ installation_from_jwt.client.user_info(claims['sub'])
end
end
diff --git a/app/controllers/jira_connect/subscriptions_controller.rb b/app/controllers/jira_connect/subscriptions_controller.rb
index a9c4dbf2b17..903ad395e44 100644
--- a/app/controllers/jira_connect/subscriptions_controller.rb
+++ b/app/controllers/jira_connect/subscriptions_controller.rb
@@ -44,7 +44,9 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
def destroy
subscription = current_jira_installation.subscriptions.find(params[:id])
- if subscription.destroy
+ if !jira_user&.site_admin?
+ render json: { error: 'forbidden' }, status: :forbidden
+ elsif subscription.destroy
render json: { success: true }
else
render json: { error: subscription.errors.full_messages.join(', ') }, status: :unprocessable_entity
@@ -54,7 +56,7 @@ class JiraConnect::SubscriptionsController < JiraConnect::ApplicationController
private
def create_service
- JiraConnectSubscriptions::CreateService.new(current_jira_installation, current_user, namespace_path: params['namespace_path'])
+ JiraConnectSubscriptions::CreateService.new(current_jira_installation, current_user, namespace_path: params['namespace_path'], jira_user: jira_user)
end
def allow_rendering_in_iframe