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
path: root/spec
diff options
context:
space:
mode:
authorGitLab Release Tools Bot <delivery-team+release-tools@gitlab.com>2021-03-31 19:41:24 +0300
committerGitLab Release Tools Bot <delivery-team+release-tools@gitlab.com>2021-03-31 19:41:24 +0300
commit38b3003b67db3f2eadfa81fd28b13d168f665766 (patch)
treebe836d10a991163527d2e349ff1e770276ecbea2 /spec
parentb2ce3643e27db4cc0ad30cc09d651c00ec799887 (diff)
parentc93927607f55350f2e2af4bdaf03ff9dba80ab1d (diff)
Merge remote-tracking branch 'dev/13-10-stable' into 13-10-stable
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/pool_repositories.rb2
-rw-r--r--spec/features/merge_request/user_views_open_merge_request_spec.rb17
-rw-r--r--spec/initializers/json_validator_patch_spec.rb39
-rw-r--r--spec/lib/gitlab/asciidoc_spec.rb43
-rw-r--r--spec/lib/gitlab/user_access_spec.rb9
-rw-r--r--spec/models/project_spec.rb58
-rw-r--r--spec/requests/api/system_hooks_spec.rb10
-rw-r--r--spec/services/projects/fork_service_spec.rb2
-rw-r--r--spec/services/projects/unlink_fork_service_spec.rb11
9 files changed, 184 insertions, 7 deletions
diff --git a/spec/factories/pool_repositories.rb b/spec/factories/pool_repositories.rb
index f0905d28c70..f3f3e33189b 100644
--- a/spec/factories/pool_repositories.rb
+++ b/spec/factories/pool_repositories.rb
@@ -6,7 +6,7 @@ FactoryBot.define do
state { :none }
before(:create) do |pool|
- pool.source_project = create(:project, :repository)
+ pool.source_project ||= create(:project, :repository)
pool.source_project.update!(pool_repository: pool)
end
diff --git a/spec/features/merge_request/user_views_open_merge_request_spec.rb b/spec/features/merge_request/user_views_open_merge_request_spec.rb
index 9bda48a3ec5..5f99d762ecb 100644
--- a/spec/features/merge_request/user_views_open_merge_request_spec.rb
+++ b/spec/features/merge_request/user_views_open_merge_request_spec.rb
@@ -111,4 +111,21 @@ RSpec.describe 'User views an open merge request' do
end
end
end
+
+ context 'XSS source branch' do
+ let(:project) { create(:project, :public, :repository) }
+ let(:source_branch) { "&#39;&gt;&lt;iframe/srcdoc=&#39;&#39;&gt;&lt;/iframe&gt;" }
+
+ before do
+ project.repository.create_branch(source_branch, "master")
+
+ mr = create(:merge_request, source_project: project, target_project: project, source_branch: source_branch)
+
+ visit(merge_request_path(mr))
+ end
+
+ it 'encodes branch name' do
+ expect(find('cite.ref-name')[:title]).to eq(source_branch)
+ end
+ end
end
diff --git a/spec/initializers/json_validator_patch_spec.rb b/spec/initializers/json_validator_patch_spec.rb
new file mode 100644
index 00000000000..5d90364ae92
--- /dev/null
+++ b/spec/initializers/json_validator_patch_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require 'rspec-parameterized'
+
+RSpec.describe 'JSON validator patch' do
+ using RSpec::Parameterized::TableSyntax
+
+ let(:schema) { '{"format": "string"}' }
+
+ subject { JSON::Validator.validate(schema, data) }
+
+ context 'with invalid JSON' do
+ where(:data) do
+ [
+ 'https://example.com',
+ '/tmp/test.txt'
+ ]
+ end
+
+ with_them do
+ it 'does not attempt to open a file or URI' do
+ allow(File).to receive(:read).and_call_original
+ allow(URI).to receive(:open).and_call_original
+ expect(File).not_to receive(:read).with(data)
+ expect(URI).not_to receive(:open).with(data)
+ expect(subject).to be true
+ end
+ end
+ end
+
+ context 'with valid JSON' do
+ let(:data) { %({ 'somekey': 'value' }) }
+
+ it 'validates successfully' do
+ expect(subject).to be true
+ end
+ end
+end
diff --git a/spec/lib/gitlab/asciidoc_spec.rb b/spec/lib/gitlab/asciidoc_spec.rb
index 08510d4652b..3eb015a5a22 100644
--- a/spec/lib/gitlab/asciidoc_spec.rb
+++ b/spec/lib/gitlab/asciidoc_spec.rb
@@ -92,6 +92,15 @@ module Gitlab
expect(render(data[:input], context)).to include(data[:output])
end
end
+
+ it 'does not allow locked attributes to be overridden' do
+ input = <<~ADOC
+ {counter:max-include-depth:1234}
+ <|-- {max-include-depth}
+ ADOC
+
+ expect(render(input, {})).not_to include('1234')
+ end
end
context "images" do
@@ -543,6 +552,40 @@ module Gitlab
expect(render(input, context)).to include(output.strip)
end
+
+ it 'does not allow kroki-plantuml-include to be overridden' do
+ input = <<~ADOC
+ [plantuml, test="{counter:kroki-plantuml-include:/etc/passwd}", format="png"]
+ ....
+ class BlockProcessor
+
+ BlockProcessor <|-- {counter:kroki-plantuml-include}
+ ....
+ ADOC
+
+ output = <<~HTML
+ <div>
+ <div>
+ <a class=\"no-attachment-icon\" href=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" alt=\"Diagram\" class=\"lazy\" data-src=\"https://kroki.io/plantuml/png/eNpLzkksLlZwyslPzg4oyk9OLS7OL-LiQuUr2NTo6ipUJ-eX5pWkFlllF-VnZ-oW5CTmlZTm5uhm5iXnlKak1gIABQEb8A==\"></a>
+ </div>
+ </div>
+ HTML
+
+ expect(render(input, {})).to include(output.strip)
+ end
+
+ it 'does not allow kroki-server-url to be overridden' do
+ input = <<~ADOC
+ [plantuml, test="{counter:kroki-server-url:evilsite}", format="png"]
+ ....
+ class BlockProcessor
+
+ BlockProcessor
+ ....
+ ADOC
+
+ expect(render(input, {})).not_to include('evilsite')
+ end
end
context 'with Kroki and BlockDiag (additional format) enabled' do
diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb
index 97fff030906..01890305df4 100644
--- a/spec/lib/gitlab/user_access_spec.rb
+++ b/spec/lib/gitlab/user_access_spec.rb
@@ -216,6 +216,15 @@ RSpec.describe Gitlab::UserAccess do
expect(access.can_merge_to_branch?(@branch.name)).to be_falsey
end
end
+
+ context 'when skip_collaboration_check is true' do
+ let(:access) { described_class.new(user, container: project, skip_collaboration_check: true) }
+
+ it 'does not call Project#branch_allows_collaboration?' do
+ expect(project).not_to receive(:branch_allows_collaboration?)
+ expect(access.can_push_to_branch?('master')).to be_falsey
+ end
+ end
end
describe '#can_create_tag?' do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 1cee494989d..49d9fd56d70 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -5291,6 +5291,64 @@ RSpec.describe Project, factory_default: :keep do
end
end
+ describe '#branch_allows_collaboration?' do
+ context 'when there are open merge requests that have their source/target branches point to each other' do
+ let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:developer) { create(:user) }
+ let_it_be(:reporter) { create(:user) }
+ let_it_be(:guest) { create(:user) }
+
+ before_all do
+ create(
+ :merge_request,
+ target_project: project,
+ target_branch: 'master',
+ source_project: project,
+ source_branch: 'merge-test',
+ allow_collaboration: true
+ )
+
+ create(
+ :merge_request,
+ target_project: project,
+ target_branch: 'merge-test',
+ source_project: project,
+ source_branch: 'master',
+ allow_collaboration: true
+ )
+
+ project.add_developer(developer)
+ project.add_reporter(reporter)
+ project.add_guest(guest)
+ end
+
+ shared_examples_for 'successful check' do
+ it 'does not go into an infinite loop' do
+ expect { project.branch_allows_collaboration?(user, 'master') }
+ .not_to raise_error
+ end
+ end
+
+ context 'when user is a developer' do
+ let(:user) { developer }
+
+ it_behaves_like 'successful check'
+ end
+
+ context 'when user is a reporter' do
+ let(:user) { reporter }
+
+ it_behaves_like 'successful check'
+ end
+
+ context 'when user is a guest' do
+ let(:user) { guest }
+
+ it_behaves_like 'successful check'
+ end
+ end
+ end
+
context 'with cross project merge requests' do
let(:user) { create(:user) }
let(:target_project) { create(:project, :repository) }
diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb
index 01b46053d52..3cea1af686e 100644
--- a/spec/requests/api/system_hooks_spec.rb
+++ b/spec/requests/api/system_hooks_spec.rb
@@ -103,15 +103,15 @@ RSpec.describe API::SystemHooks do
end
end
- describe "GET /hooks/:id" do
- it "returns hook by id" do
- get api("/hooks/#{hook.id}", admin)
- expect(response).to have_gitlab_http_status(:ok)
+ describe 'POST /hooks/:id' do
+ it "returns and trigger hook by id" do
+ post api("/hooks/#{hook.id}", admin)
+ expect(response).to have_gitlab_http_status(:created)
expect(json_response['event_name']).to eq('project_create')
end
it "returns 404 on failure" do
- get api("/hooks/404", admin)
+ post api("/hooks/404", admin)
expect(response).to have_gitlab_http_status(:not_found)
end
end
diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb
index df02f8ea15d..276656656ec 100644
--- a/spec/services/projects/fork_service_spec.rb
+++ b/spec/services/projects/fork_service_spec.rb
@@ -403,7 +403,7 @@ RSpec.describe Projects::ForkService do
end
context 'when forking with object pools' do
- let(:fork_from_project) { create(:project, :public) }
+ let(:fork_from_project) { create(:project, :repository, :public) }
let(:forker) { create(:user) }
context 'when no pool exists' do
diff --git a/spec/services/projects/unlink_fork_service_spec.rb b/spec/services/projects/unlink_fork_service_spec.rb
index 2a8965e62ce..90def365fca 100644
--- a/spec/services/projects/unlink_fork_service_spec.rb
+++ b/spec/services/projects/unlink_fork_service_spec.rb
@@ -207,6 +207,17 @@ RSpec.describe Projects::UnlinkForkService, :use_clean_rails_memory_store_cachin
end
end
+ context 'a project with pool repository' do
+ let(:project) { create(:project, :public, :repository) }
+ let!(:pool_repository) { create(:pool_repository, :ready, source_project: project) }
+
+ subject { described_class.new(project, user) }
+
+ it 'when unlinked leaves pool repository' do
+ expect { subject.execute }.to change { project.reload.has_pool_repository? }.from(true).to(false)
+ end
+ end
+
context 'when given project is not part of a fork network' do
let!(:project_without_forks) { create(:project, :public) }