Commit bf0a2da9 authored by Robert Speicher's avatar Robert Speicher

Merge branch 'move-ee-helper-code' into 'master'

Move EE code out of app/helpers and into ee/app/helpers

See merge request gitlab-org/gitlab-ee!8702
parents 7b556982 1adb5bca
...@@ -82,9 +82,6 @@ module ApplicationHelper ...@@ -82,9 +82,6 @@ module ApplicationHelper
# Skip if user removed branch right after that # Skip if user removed branch right after that
return false unless project.repository.branch_exists?(event.branch_name) return false unless project.repository.branch_exists?(event.branch_name)
# Skip if this was a mirror update
return false if project.mirror? && project.repository.up_to_date_with_upstream?(event.branch_name)
true true
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
...@@ -139,8 +139,8 @@ module ApplicationSettingsHelper ...@@ -139,8 +139,8 @@ module ApplicationSettingsHelper
:enabled_git_access_protocol, :enabled_git_access_protocol,
:enforce_terms, :enforce_terms,
:gitaly_timeout_default, :gitaly_timeout_default,
:gitaly_timeout_fast,
:gitaly_timeout_medium, :gitaly_timeout_medium,
:gitaly_timeout_fast,
:gravatar_enabled, :gravatar_enabled,
:hashed_storage_enabled, :hashed_storage_enabled,
:help_page_hide_commercial_content, :help_page_hide_commercial_content,
...@@ -168,8 +168,8 @@ module ApplicationSettingsHelper ...@@ -168,8 +168,8 @@ module ApplicationSettingsHelper
:metrics_timeout, :metrics_timeout,
:mirror_available, :mirror_available,
:pages_domain_verification_enabled, :pages_domain_verification_enabled,
:password_authentication_enabled_for_git,
:password_authentication_enabled_for_web, :password_authentication_enabled_for_web,
:password_authentication_enabled_for_git,
:performance_bar_allowed_group_path, :performance_bar_allowed_group_path,
:performance_bar_enabled, :performance_bar_enabled,
:plantuml_enabled, :plantuml_enabled,
......
...@@ -96,28 +96,6 @@ module ButtonHelper ...@@ -96,28 +96,6 @@ module ButtonHelper
href: (href if href), href: (href if href),
data: (data if data) data: (data if data)
end end
def kerberos_clone_button(project)
klass = 'kerberos-selector has-tooltip'
content_tag :a, 'KRB5',
class: klass,
href: project.kerberos_url_to_repo,
data: {
html: 'true',
placement: 'right',
container: 'body',
title: 'Get a Kerberos token for your<br>account with kinit.'
}
end
def geo_button(modal_target: nil)
data = { placement: 'bottom', container: 'body', toggle: 'modal', target: modal_target }
content_tag :button,
sprite_icon('location-dot', size: 15),
class: 'btn btn-geo has-tooltip',
data: data,
type: :button,
title: 'See Geo-specific instructions'
end
end end
ButtonHelper.prepend(EE::ButtonHelper)
# frozen_string_literal: true # frozen_string_literal: true
module KerberosSpnegoHelper module KerberosSpnegoHelper
include ActionController::HttpAuthentication::Basic
attr_reader :spnego_response_token
def allow_basic_auth? def allow_basic_auth?
if Gitlab.config.kerberos.enabled && Gitlab.config.kerberos.use_dedicated_port true # different behavior in GitLab Enterprise Edition
!request_uses_kerberos_dedicated_port?
else
true
end
end end
def allow_kerberos_spnego_auth? def allow_kerberos_spnego_auth?
return false unless Gitlab.config.kerberos.enabled false # different behavior in GitLab Enterprise Edition
if Gitlab.config.kerberos.use_dedicated_port
request_uses_kerberos_dedicated_port?
else
true
end
end
def request_uses_kerberos_dedicated_port?
request.env['SERVER_PORT'] == Gitlab.config.kerberos.port.to_s
end
def spnego_challenge
if spnego_response_token
"Negotiate #{::Base64.strict_encode64(spnego_response_token)}"
else
'Negotiate'
end
end
def spnego_provided?
request.authorization.present? && (auth_scheme(request) == 'Negotiate')
end
def send_final_spnego_response
headers['Www-Authenticate'] = spnego_challenge if spnego_response_token
end
# rubocop: disable CodeReuse/ActiveRecord
def find_kerberos_user
krb_principal = spnego_credentials!(spnego_token)
return unless krb_principal
identity = ::Identity.with_extern_uid(:kerberos, krb_principal).take
identity&.user
end
# rubocop: enable CodeReuse/ActiveRecord
# The Kerberos backend will translate spnego_token into a Kerberos
# principal and/or provide a value for @spnego_response_token.
def spnego_credentials!(spnego_token)
require 'gssapi'
gss = GSSAPI::Simple.new(nil, nil, Gitlab.config.kerberos.keytab)
# the GSSAPI::Simple constructor transforms a nil service name into a default value, so
# pass service name to acquire_credentials explicitly to support the special meaning of nil
gss_service_name =
if Gitlab.config.kerberos.service_principal_name.present?
gss.import_name(Gitlab.config.kerberos.service_principal_name)
else
nil # accept any valid service principal name from keytab
end
gss.acquire_credentials(gss_service_name) # grab credentials from keytab
# Decode token
gss_result = gss.accept_context(spnego_token)
# gss_result will be 'true' if nothing has to be returned to the client
@spnego_response_token = gss_result if gss_result && gss_result != true
# Return user principal name if authentication succeeded
gss.display_name
rescue GSSAPI::GssApiError => ex
Rails.logger.error "#{self.class.name}: failed to process Negotiate/Kerberos authentication: #{ex.message}"
false
end
def spnego_token
Base64.strict_decode64(auth_param(request))
end end
end end
KerberosSpnegoHelper.prepend(EE::KerberosSpnegoHelper)
...@@ -25,14 +25,6 @@ module SelectsHelper ...@@ -25,14 +25,6 @@ module SelectsHelper
hidden_field_tag(id, value, html) hidden_field_tag(id, value, html)
end end
def ldap_server_select_options
options_from_collection_for_select(
Gitlab::Auth::LDAP::Config.available_servers,
'provider_name',
'label'
)
end
def groups_select_tag(id, opts = {}) def groups_select_tag(id, opts = {})
classes = Array.wrap(opts[:class]) classes = Array.wrap(opts[:class])
classes << 'ajax-groups-select' classes << 'ajax-groups-select'
...@@ -82,15 +74,6 @@ module SelectsHelper ...@@ -82,15 +74,6 @@ module SelectsHelper
hidden_field_tag(id, value, opts) hidden_field_tag(id, value, opts)
end end
def admin_email_select_tag(id, opts = {})
css_class = ["ajax-admin-email-select"]
css_class << "multiselect" if opts[:multiple]
css_class << opts[:class] if opts[:class]
value = opts[:selected] || ''
hidden_field_tag(id, value, class: css_class.join(' '))
end
private private
def users_select_data_attributes(opts) def users_select_data_attributes(opts)
...@@ -106,3 +89,5 @@ module SelectsHelper ...@@ -106,3 +89,5 @@ module SelectsHelper
} }
end end
end end
SelectsHelper.prepend(EE::SelectsHelper)
...@@ -113,7 +113,7 @@ module TabHelper ...@@ -113,7 +113,7 @@ module TabHelper
return 'active' return 'active'
end end
if %w(services hooks deploy_keys protected_branches push_rules).include? controller.controller_name if %w(services hooks deploy_keys protected_branches).include? controller.controller_name
"active" "active"
end end
end end
...@@ -134,3 +134,5 @@ module TabHelper ...@@ -134,3 +134,5 @@ module TabHelper
'active' if current_controller?('oauth/applications') 'active' if current_controller?('oauth/applications')
end end
end end
TabHelper.prepend(EE::TabHelper)
...@@ -90,6 +90,17 @@ module EE ...@@ -90,6 +90,17 @@ module EE
::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.admin? ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.admin?
end end
override :show_last_push_widget?
def show_last_push_widget?(event)
show = super
project = event.project
# Skip if this was a mirror update
return false if project.mirror? && project.repository.up_to_date_with_upstream?(event.branch_name)
show
end
private private
def appearance def appearance
......
...@@ -30,5 +30,29 @@ module EE ...@@ -30,5 +30,29 @@ module EE
dropdown_item_with_description(protocol, dropdown_description, href: append_url, data: { primary_url: geo_url, clone_type: 'http' }) dropdown_item_with_description(protocol, dropdown_description, href: append_url, data: { primary_url: geo_url, clone_type: 'http' })
end end
def kerberos_clone_button(project)
klass = 'kerberos-selector has-tooltip'
content_tag :a, 'KRB5',
class: klass,
href: project.kerberos_url_to_repo,
data: {
html: 'true',
placement: 'right',
container: 'body',
title: 'Get a Kerberos token for your<br>account with kinit.'
}
end
def geo_button(modal_target: nil)
data = { placement: 'bottom', container: 'body', toggle: 'modal', target: modal_target }
content_tag :button,
sprite_icon('location-dot', size: 15),
class: 'btn btn-geo has-tooltip',
data: data,
type: :button,
title: 'See Geo-specific instructions'
end
end end
end end
# frozen_string_literal: true
module EE
module KerberosSpnegoHelper
extend ::Gitlab::Utils::Override
include ActionController::HttpAuthentication::Basic
attr_reader :spnego_response_token
override :allow_basic_auth?
def allow_basic_auth?
if ::Gitlab.config.kerberos.enabled && ::Gitlab.config.kerberos.use_dedicated_port
!request_uses_kerberos_dedicated_port?
else
true
end
end
override :allow_kerberos_spnego_auth?
def allow_kerberos_spnego_auth?
return false unless ::Gitlab.config.kerberos.enabled
if ::Gitlab.config.kerberos.use_dedicated_port
request_uses_kerberos_dedicated_port?
else
true
end
end
def request_uses_kerberos_dedicated_port?
request.env['SERVER_PORT'] == ::Gitlab.config.kerberos.port.to_s
end
def spnego_challenge
if spnego_response_token
"Negotiate #{::Base64.strict_encode64(spnego_response_token)}"
else
'Negotiate'
end
end
def spnego_provided?
request.authorization.present? && (auth_scheme(request) == 'Negotiate')
end
def send_final_spnego_response
headers['Www-Authenticate'] = spnego_challenge if spnego_response_token
end
# rubocop: disable CodeReuse/ActiveRecord
def find_kerberos_user
krb_principal = spnego_credentials!(spnego_token)
return unless krb_principal
identity = ::Identity.with_extern_uid(:kerberos, krb_principal).take
identity&.user
end
# rubocop: enable CodeReuse/ActiveRecord
# The Kerberos backend will translate spnego_token into a Kerberos
# principal and/or provide a value for @spnego_response_token.
def spnego_credentials!(spnego_token)
require 'gssapi'
gss = GSSAPI::Simple.new(nil, nil, ::Gitlab.config.kerberos.keytab)
# the GSSAPI::Simple constructor transforms a nil service name into a default value, so
# pass service name to acquire_credentials explicitly to support the special meaning of nil
gss_service_name =
if ::Gitlab.config.kerberos.service_principal_name.present?
gss.import_name(Gitlab.config.kerberos.service_principal_name)
else
nil # accept any valid service principal name from keytab
end
gss.acquire_credentials(gss_service_name) # grab credentials from keytab
# Decode token
gss_result = gss.accept_context(spnego_token)
# gss_result will be 'true' if nothing has to be returned to the client
@spnego_response_token = gss_result if gss_result && gss_result != true
# Return user principal name if authentication succeeded
gss.display_name
rescue GSSAPI::GssApiError => ex
Rails.logger.error "#{self.class.name}: failed to process Negotiate/Kerberos authentication: #{ex.message}"
false
end
def spnego_token
Base64.strict_decode64(auth_param(request))
end
end
end
# frozen_string_literal: true
module EE
module SelectsHelper
def ldap_server_select_options
options_from_collection_for_select(
::Gitlab::Auth::LDAP::Config.available_servers,
'provider_name',
'label'
)
end
def admin_email_select_tag(id, opts = {})
css_class = ["ajax-admin-email-select"]
css_class << "multiselect" if opts[:multiple]
css_class << opts[:class] if opts[:class]
value = opts[:selected] || ''
hidden_field_tag(id, value, class: css_class.join(' '))
end
end
end
# frozen_string_literal: true
module EE
module TabHelper
extend ::Gitlab::Utils::Override
override :project_tab_class
def project_tab_class
if controller.controller_name == 'push_rules'
'active'
else
super
end
end
end
end
...@@ -59,4 +59,14 @@ describe AppearancesHelper do ...@@ -59,4 +59,14 @@ describe AppearancesHelper do
end end
end end
end end
describe '#brand_title' do
it 'returns the default EE title when no appearance is present' do
allow(helper)
.to receive(:current_appearance)
.and_return(nil)
expect(helper.brand_title).to eq('GitLab Enterprise Edition')
end
end
end end
# frozen_string_literal: true
require 'spec_helper'
describe TabHelper do
describe '#project_tab_class' do
it 'returns "active" for the push rules controller' do
controller = instance_double(
'controller',
controller_name: 'push_rules',
controller_path: '/push_rules/foo'
)
allow(helper)
.to receive(:controller)
.and_return(controller)
expect(helper.project_tab_class).to eq('active')
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment