diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/api/helpers/services_helpers.rb | 40 | ||||
-rw-r--r-- | lib/api/import_github.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/git/repository.rb | 9 | ||||
-rw-r--r-- | lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/kubernetes/namespace.rb | 29 | ||||
-rw-r--r-- | lib/gitlab/legacy_github_import/project_creator.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/url_blocker.rb | 10 | ||||
-rw-r--r-- | lib/gitlab/visibility_level.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/workhorse.rb | 38 | ||||
-rw-r--r-- | lib/tasks/gemojione.rake | 15 | ||||
-rw-r--r-- | lib/tasks/karma.rake | 10 |
11 files changed, 100 insertions, 61 deletions
diff --git a/lib/api/helpers/services_helpers.rb b/lib/api/helpers/services_helpers.rb index 8582c45798f..953be7f3798 100644 --- a/lib/api/helpers/services_helpers.rb +++ b/lib/api/helpers/services_helpers.rb @@ -1,3 +1,4 @@ +# coding: utf-8 # frozen_string_literal: true module API @@ -386,6 +387,44 @@ module API }, chat_notification_events ].flatten, + 'hipchat' => [ + { + required: true, + name: :token, + type: String, + desc: 'The room token' + }, + { + required: false, + name: :room, + type: String, + desc: 'The room name or ID' + }, + { + required: false, + name: :color, + type: String, + desc: 'The room color' + }, + { + required: false, + name: :notify, + type: Boolean, + desc: 'Enable notifications' + }, + { + required: false, + name: :api_version, + type: String, + desc: 'Leave blank for default (v2)' + }, + { + required: false, + name: :server, + type: String, + desc: 'Leave blank for default. https://hipchat.example.com' + } + ], 'irker' => [ { required: true, @@ -690,6 +729,7 @@ module API ::ExternalWikiService, ::FlowdockService, ::HangoutsChatService, + ::HipchatService, ::IrkerService, ::JiraService, ::KubernetesService, diff --git a/lib/api/import_github.rb b/lib/api/import_github.rb index bb4e536cf57..e7504051808 100644 --- a/lib/api/import_github.rb +++ b/lib/api/import_github.rb @@ -20,6 +20,10 @@ module API def provider :github end + + def provider_unauthorized + error!("Access denied to your #{Gitlab::ImportSources.title(provider.to_s)} account.", 401) + end end desc 'Import a GitHub project' do diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index c33d243330d..be9e926728c 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -231,12 +231,12 @@ module Gitlab end end - def archive_metadata(ref, storage_path, project_path, format = "tar.gz", append_sha:, path: nil) + def archive_metadata(ref, storage_path, project_path, format = "tar.gz", append_sha:) ref ||= root_ref commit = Gitlab::Git::Commit.find(self, ref) return {} if commit.nil? - prefix = archive_prefix(ref, commit.id, project_path, append_sha: append_sha, path: path) + prefix = archive_prefix(ref, commit.id, project_path, append_sha: append_sha) { 'ArchivePrefix' => prefix, @@ -248,14 +248,13 @@ module Gitlab # This is both the filename of the archive (missing the extension) and the # name of the top-level member of the archive under which all files go - def archive_prefix(ref, sha, project_path, append_sha:, path:) + def archive_prefix(ref, sha, project_path, append_sha:) append_sha = (ref != sha) if append_sha.nil? formatted_ref = ref.tr('/', '-') prefix_segments = [project_path, formatted_ref] prefix_segments << sha if append_sha - prefix_segments << path.tr('/', '-').gsub(%r{^/|/$}, '') if path prefix_segments.join('-') end @@ -466,7 +465,7 @@ module Gitlab @refs_hash = Hash.new { |h, k| h[k] = [] } (tags + branches).each do |ref| - next unless ref.target && ref.name + next unless ref.target && ref.name && ref.dereferenced_target&.id @refs_hash[ref.dereferenced_target.id] << ref.name end diff --git a/lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb b/lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb index b30900f7c61..fcf6a25ab00 100644 --- a/lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb +++ b/lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb @@ -8,7 +8,7 @@ module Gitlab POST_METHOD = 'POST'.freeze INVALID_HTTP_METHOD = 'invalid. Only PUT and POST methods allowed.'.freeze - validates :url, url: true + validates :url, addressable_url: true validate do unless [PUT_METHOD, POST_METHOD].include?(http_method.upcase) diff --git a/lib/gitlab/kubernetes/namespace.rb b/lib/gitlab/kubernetes/namespace.rb index 919f19c86d7..8a3bea95a04 100644 --- a/lib/gitlab/kubernetes/namespace.rb +++ b/lib/gitlab/kubernetes/namespace.rb @@ -19,11 +19,40 @@ module Gitlab def create! resource = ::Kubeclient::Resource.new(metadata: { name: name }) + log_event(:begin_create) @client.create_namespace(resource) end def ensure_exists! exists? || create! + rescue ::Kubeclient::HttpError => error + log_create_failed(error) + raise + end + + private + + def log_create_failed(error) + logger.error({ + exception: error.class.name, + status_code: error.error_code, + namespace: name, + class_name: self.class.name, + event: :failed_to_create_namespace, + message: error.message + }) + end + + def log_event(event) + logger.info( + namespace: name, + class_name: self.class.name, + event: event + ) + end + + def logger + @logger ||= Gitlab::Kubernetes::Logger.build end end end diff --git a/lib/gitlab/legacy_github_import/project_creator.rb b/lib/gitlab/legacy_github_import/project_creator.rb index ca1a1b8e9bd..b484b69c932 100644 --- a/lib/gitlab/legacy_github_import/project_creator.rb +++ b/lib/gitlab/legacy_github_import/project_creator.rb @@ -37,7 +37,7 @@ module Gitlab end def visibility_level - visibility_level = repo.private ? Gitlab::VisibilityLevel::PRIVATE : Gitlab::VisibilityLevel::PUBLIC + visibility_level = repo.private ? Gitlab::VisibilityLevel::PRIVATE : @namespace.visibility_level visibility_level = Gitlab::CurrentSettings.default_project_visibility if Gitlab::CurrentSettings.restricted_visibility_levels.include?(visibility_level) visibility_level diff --git a/lib/gitlab/url_blocker.rb b/lib/gitlab/url_blocker.rb index 9b7b0db9525..641ba70ef83 100644 --- a/lib/gitlab/url_blocker.rb +++ b/lib/gitlab/url_blocker.rb @@ -8,7 +8,7 @@ module Gitlab BlockedUrlError = Class.new(StandardError) class << self - def validate!(url, ports: [], protocols: [], allow_localhost: false, allow_local_network: true, ascii_only: false, enforce_user: false, enforce_sanitization: false) + def validate!(url, ports: [], schemes: [], allow_localhost: false, allow_local_network: true, ascii_only: false, enforce_user: false, enforce_sanitization: false) return true if url.nil? # Param url can be a string, URI or Addressable::URI @@ -20,7 +20,7 @@ module Gitlab return true if internal?(uri) port = get_port(uri) - validate_protocol!(uri.scheme, protocols) + validate_scheme!(uri.scheme, schemes) validate_port!(port, ports) if ports.any? validate_user!(uri.user) if enforce_user validate_hostname!(uri.hostname) @@ -85,9 +85,9 @@ module Gitlab raise BlockedUrlError, "Only allowed ports are #{ports.join(', ')}, and any over 1024" end - def validate_protocol!(protocol, protocols) - if protocol.blank? || (protocols.any? && !protocols.include?(protocol)) - raise BlockedUrlError, "Only allowed protocols are #{protocols.join(', ')}" + def validate_scheme!(scheme, schemes) + if scheme.blank? || (schemes.any? && !schemes.include?(scheme)) + raise BlockedUrlError, "Only allowed schemes are #{schemes.join(', ')}" end end diff --git a/lib/gitlab/visibility_level.rb b/lib/gitlab/visibility_level.rb index a3c7de87765..8f9d5cf1e63 100644 --- a/lib/gitlab/visibility_level.rb +++ b/lib/gitlab/visibility_level.rb @@ -75,8 +75,8 @@ module Gitlab user.admin? || allowed_level?(level.to_i) end + # Level should be a numeric value, e.g. `20` # Return true if the specified level is allowed for the current user. - # Level should be a numeric value, e.g. `20`. def allowed_level?(level) valid_level?(level) && non_restricted_level?(level) end diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb index 533757d2237..0c2acac3d1e 100644 --- a/lib/gitlab/workhorse.rb +++ b/lib/gitlab/workhorse.rb @@ -63,26 +63,13 @@ module Gitlab ] end - def send_git_archive(repository, ref:, format:, append_sha:, path: nil) + def send_git_archive(repository, ref:, format:, append_sha:) format ||= 'tar.gz' format = format.downcase - metadata = repository.archive_metadata(ref, Gitlab.config.gitlab.repository_downloads_path, format, append_sha: append_sha, path: path) + params = repository.archive_metadata(ref, Gitlab.config.gitlab.repository_downloads_path, format, append_sha: append_sha) + raise "Repository or ref not found" if params.empty? - raise "Repository or ref not found" if metadata.empty? - - params = { - 'GitalyServer' => gitaly_server_hash(repository), - 'ArchivePath' => metadata['ArchivePath'], - 'GetArchiveRequest' => encode_binary( - Gitaly::GetArchiveRequest.new( - repository: repository.gitaly_repository, - commit_id: metadata['CommitId'], - prefix: metadata['ArchivePrefix'], - format: archive_format(format), - path: path.presence || "" - ).to_proto - ) - } + params['GitalyServer'] = gitaly_server_hash(repository) # If present DisableCache must be a Boolean. Otherwise workhorse ignores it. params['DisableCache'] = true if git_archive_cache_disabled? @@ -233,10 +220,6 @@ module Gitlab Base64.urlsafe_encode64(JSON.dump(hash)) end - def encode_binary(binary) - Base64.urlsafe_encode64(binary) - end - def gitaly_server_hash(repository) { address: Gitlab::GitalyClient.address(repository.project.repository_storage), @@ -255,19 +238,6 @@ module Gitlab def git_archive_cache_disabled? ENV['WORKHORSE_ARCHIVE_CACHE_DISABLED'].present? || Feature.enabled?(:workhorse_archive_cache_disabled) end - - def archive_format(format) - case format - when "tar.bz2", "tbz", "tbz2", "tb2", "bz2" - Gitaly::GetArchiveRequest::Format::TAR_BZ2 - when "tar" - Gitaly::GetArchiveRequest::Format::TAR - when "zip" - Gitaly::GetArchiveRequest::Format::ZIP - else - Gitaly::GetArchiveRequest::Format::TAR_GZ - end - end end end end diff --git a/lib/tasks/gemojione.rake b/lib/tasks/gemojione.rake index c24207b134a..560a52053d8 100644 --- a/lib/tasks/gemojione.rake +++ b/lib/tasks/gemojione.rake @@ -30,28 +30,33 @@ namespace :gemojione do # We don't have `node_modules` available in built versions of GitLab FileUtils.cp_r(Rails.root.join('node_modules', 'emoji-unicode-version', 'emoji-unicode-version-map.json'), File.join(Rails.root, 'fixtures', 'emojis')) + dir = Gemojione.images_path resultant_emoji_map = {} Gitlab::Emoji.emojis.each do |name, emoji_hash| # Ignore aliases unless Gitlab::Emoji.emojis_aliases.key?(name) + fpath = File.join(dir, "#{emoji_hash['unicode']}.png") + hash_digest = Digest::SHA256.file(fpath).hexdigest + category = emoji_hash['category'] if name == 'gay_pride_flag' category = 'flags' end entry = { - c: category, - e: emoji_hash['moji'], - d: emoji_hash['description'], - u: Gitlab::Emoji.emoji_unicode_version(name) + category: category, + moji: emoji_hash['moji'], + description: emoji_hash['description'], + unicodeVersion: Gitlab::Emoji.emoji_unicode_version(name), + digest: hash_digest } resultant_emoji_map[name] = entry end end - out = File.join(Rails.root, 'public', '-', 'emojis', '1', 'emojis.json') + out = File.join(Rails.root, 'fixtures', 'emojis', 'digests.json') File.open(out, 'w') do |handle| handle.write(JSON.pretty_generate(resultant_emoji_map)) end diff --git a/lib/tasks/karma.rake b/lib/tasks/karma.rake index 02987f2beef..2dc14183fa3 100644 --- a/lib/tasks/karma.rake +++ b/lib/tasks/karma.rake @@ -1,7 +1,7 @@ unless Rails.env.production? namespace :karma do desc 'GitLab | Karma | Generate fixtures for JavaScript tests' - task fixtures: ['karma:copy_emojis_from_public_folder', 'karma:rspec_fixtures'] + task fixtures: ['karma:rspec_fixtures'] desc 'GitLab | Karma | Generate fixtures using RSpec' RSpec::Core::RakeTask.new(:rspec_fixtures, [:pattern]) do |t, args| @@ -11,14 +11,6 @@ unless Rails.env.production? t.rspec_opts = '--format documentation' end - desc 'GitLab | Karma | Copy emojis file' - task :copy_emojis_from_public_folder do - # Copying the emojis.json from the public folder - fixture_file_name = Rails.root.join('spec/javascripts/fixtures/emojis/emojis.json') - FileUtils.mkdir_p(File.dirname(fixture_file_name)) - FileUtils.cp(Rails.root.join('public/-/emojis/1/emojis.json'), fixture_file_name) - end - desc 'GitLab | Karma | Run JavaScript tests' task tests: ['yarn:check'] do sh "yarn run karma" do |ok, res| |