PageRenderTime 24ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/app/helpers/auth_helper.rb

https://gitlab.com/sandish/gitlab-ce
Ruby | 219 lines | 166 code | 48 blank | 5 comment | 15 complexity | 38f8ff210e7af77d8db3735488e8322f MD5 | raw file
  1. # frozen_string_literal: true
  2. module AuthHelper
  3. PROVIDERS_WITH_ICONS = %w(
  4. atlassian_oauth2
  5. auth0
  6. authentiq
  7. azure_activedirectory_v2
  8. azure_oauth2
  9. bitbucket
  10. facebook
  11. dingtalk
  12. github
  13. gitlab
  14. google_oauth2
  15. jwt
  16. openid_connect
  17. salesforce
  18. shibboleth
  19. twitter
  20. ).freeze
  21. LDAP_PROVIDER = /\Aldap/.freeze
  22. POPULAR_PROVIDERS = %w(google_oauth2 github).freeze
  23. def ldap_enabled?
  24. Gitlab::Auth::Ldap::Config.enabled?
  25. end
  26. def ldap_sign_in_enabled?
  27. Gitlab::Auth::Ldap::Config.sign_in_enabled?
  28. end
  29. def omniauth_enabled?
  30. Gitlab::Auth.omniauth_enabled?
  31. end
  32. def provider_has_custom_icon?(name)
  33. icon_for_provider(name.to_s)
  34. end
  35. def provider_has_builtin_icon?(name)
  36. PROVIDERS_WITH_ICONS.include?(name.to_s)
  37. end
  38. def provider_has_icon?(name)
  39. provider_has_builtin_icon?(name) || provider_has_custom_icon?(name)
  40. end
  41. def qa_class_for_provider(provider)
  42. {
  43. saml: 'qa-saml-login-button'
  44. }[provider.to_sym]
  45. end
  46. def auth_providers
  47. Gitlab::Auth::OAuth::Provider.providers
  48. end
  49. def label_for_provider(name)
  50. Gitlab::Auth::OAuth::Provider.label_for(name)
  51. end
  52. def icon_for_provider(name)
  53. Gitlab::Auth::OAuth::Provider.icon_for(name)
  54. end
  55. def form_based_provider_priority
  56. ['crowd', /^ldap/, 'kerberos']
  57. end
  58. def form_based_provider_with_highest_priority
  59. @form_based_provider_with_highest_priority ||= begin
  60. form_based_provider_priority.each do |provider_regexp|
  61. highest_priority = form_based_providers.find { |provider| provider.match?(provider_regexp) }
  62. break highest_priority unless highest_priority.nil?
  63. end
  64. end
  65. end
  66. def form_based_auth_provider_has_active_class?(provider)
  67. form_based_provider_with_highest_priority == provider
  68. end
  69. def form_based_provider?(name)
  70. [LDAP_PROVIDER, 'crowd'].any? { |pattern| pattern === name.to_s }
  71. end
  72. def form_based_providers
  73. auth_providers.select { |provider| form_based_provider?(provider) }
  74. end
  75. def saml_providers
  76. auth_providers.select { |provider| auth_strategy_class(provider) == 'OmniAuth::Strategies::SAML' }
  77. end
  78. def auth_strategy_class(provider)
  79. config = Gitlab::Auth::OAuth::Provider.config_for(provider)
  80. return if config.nil? || config['args'].blank?
  81. config.args['strategy_class']
  82. end
  83. def any_form_based_providers_enabled?
  84. form_based_providers.any? { |provider| form_enabled_for_sign_in?(provider) }
  85. end
  86. def form_enabled_for_sign_in?(provider)
  87. return true unless provider.to_s.match?(LDAP_PROVIDER)
  88. ldap_sign_in_enabled?
  89. end
  90. def crowd_enabled?
  91. auth_providers.include? :crowd
  92. end
  93. def button_based_providers
  94. auth_providers.reject { |provider| form_based_provider?(provider) }
  95. end
  96. def display_providers_on_profile?
  97. button_based_providers.any?
  98. end
  99. def providers_for_base_controller
  100. auth_providers.reject { |provider| LDAP_PROVIDER === provider }
  101. end
  102. def enabled_button_based_providers
  103. disabled_providers = Gitlab::CurrentSettings.disabled_oauth_sign_in_sources || []
  104. providers = button_based_providers.map(&:to_s) - disabled_providers
  105. providers.sort_by do |provider|
  106. POPULAR_PROVIDERS.index(provider) || POPULAR_PROVIDERS.length
  107. end
  108. end
  109. def popular_enabled_button_based_providers
  110. enabled_button_based_providers & POPULAR_PROVIDERS
  111. end
  112. def button_based_providers_enabled?
  113. enabled_button_based_providers.any?
  114. end
  115. def provider_image_tag(provider, size = 64)
  116. label = label_for_provider(provider)
  117. if provider_has_custom_icon?(provider)
  118. image_tag(icon_for_provider(provider), alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
  119. elsif provider_has_builtin_icon?(provider)
  120. file_name = "#{provider.to_s.split('_').first}_#{size}.png"
  121. image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}", class: "gl-button-icon")
  122. else
  123. label
  124. end
  125. end
  126. # rubocop: disable CodeReuse/ActiveRecord
  127. def auth_active?(provider)
  128. return current_user.atlassian_identity.present? if provider == :atlassian_oauth2
  129. current_user.identities.exists?(provider: provider.to_s)
  130. end
  131. # rubocop: enable CodeReuse/ActiveRecord
  132. def unlink_provider_allowed?(provider)
  133. IdentityProviderPolicy.new(current_user, provider).can?(:unlink)
  134. end
  135. def link_provider_allowed?(provider)
  136. IdentityProviderPolicy.new(current_user, provider).can?(:link)
  137. end
  138. def allow_admin_mode_password_authentication_for_web?
  139. current_user.allow_password_authentication_for_web? && !current_user.password_automatically_set?
  140. end
  141. def google_tag_manager_enabled?
  142. return false unless Gitlab.com?
  143. if Feature.enabled?(:gtm_nonce, type: :ops)
  144. extra_config.has_key?('google_tag_manager_nonce_id') &&
  145. extra_config.google_tag_manager_nonce_id.present?
  146. else
  147. extra_config.has_key?('google_tag_manager_id') &&
  148. extra_config.google_tag_manager_id.present?
  149. end
  150. end
  151. def google_tag_manager_id
  152. return unless google_tag_manager_enabled?
  153. return extra_config.google_tag_manager_nonce_id if Feature.enabled?(:gtm_nonce, type: :ops)
  154. extra_config.google_tag_manager_id
  155. end
  156. def auth_app_owner_text(owner)
  157. return unless owner
  158. if owner.is_a?(Group)
  159. group_link = link_to(owner.name, group_path(owner))
  160. _("This application was created for group %{group_link}.").html_safe % { group_link: group_link }
  161. else
  162. user_link = link_to(owner.name, user_path(owner))
  163. _("This application was created by %{user_link}.").html_safe % { user_link: user_link }
  164. end
  165. end
  166. extend self
  167. end
  168. AuthHelper.prepend_mod_with('AuthHelper')
  169. # The methods added in EE should be available as both class and instance
  170. # methods, just like the methods provided by `AuthHelper` itself.
  171. AuthHelper.extend_mod_with('AuthHelper')