Commit 4ba55564 authored by GitLab Bot's avatar GitLab Bot

Add latest changes from gitlab-org/gitlab@master

parent 115c8ea7
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
## 12.5.4
### Security (1 change)
- Fix stale Elasticsearch permissions when moving group from public group to private parent group.
## 12.5.3 ## 12.5.3
### Performance (1 change) ### Performance (1 change)
...@@ -251,6 +258,13 @@ Please view this file on the master branch, on stable branches it's out of date. ...@@ -251,6 +258,13 @@ Please view this file on the master branch, on stable branches it's out of date.
- Docs for protected branch code owner approval API. !17132 - Docs for protected branch code owner approval API. !17132
## 12.3.9
### Security (1 change)
- Fix stale Elasticsearch permissions when moving group from public group to private parent group.
## 12.3.7 ## 12.3.7
### Security (6 changes) ### Security (6 changes)
......
...@@ -2,6 +2,13 @@ ...@@ -2,6 +2,13 @@
documentation](doc/development/changelog.md) for instructions on adding your own documentation](doc/development/changelog.md) for instructions on adding your own
entry. entry.
## 12.5.4
### Security (1 change)
- Update maven_file_name_regex for full string match.
## 12.5.3 ## 12.5.3
### Fixed (4 changes) ### Fixed (4 changes)
...@@ -756,6 +763,13 @@ entry. ...@@ -756,6 +763,13 @@ entry.
- Remove Postgresql specific setup tasks and move to schema.rb. - Remove Postgresql specific setup tasks and move to schema.rb.
## 12.3.9
### Security (1 change)
- Update maven_file_name_regex for full string match.
## 12.3.7 ## 12.3.7
### Security (12 changes) ### Security (12 changes)
......
...@@ -7,7 +7,7 @@ module AwardEmojiHelper ...@@ -7,7 +7,7 @@ module AwardEmojiHelper
if awardable.is_a?(Note) if awardable.is_a?(Note)
# We render a list of notes very frequently and calling the specific method is a lot faster than the generic one (4.5x) # We render a list of notes very frequently and calling the specific method is a lot faster than the generic one (4.5x)
if awardable.for_personal_snippet? if awardable.for_personal_snippet?
toggle_award_emoji_snippet_note_path(awardable.noteable, awardable) gitlab_toggle_award_emoji_snippet_note_path(awardable.noteable, awardable)
else else
toggle_award_emoji_project_note_path(@project, awardable.id) toggle_award_emoji_project_note_path(@project, awardable.id)
end end
......
...@@ -141,7 +141,7 @@ module BlobHelper ...@@ -141,7 +141,7 @@ module BlobHelper
if @build && @entry if @build && @entry
raw_project_job_artifacts_url(@project, @build, path: @entry.path, **kwargs) raw_project_job_artifacts_url(@project, @build, path: @entry.path, **kwargs)
elsif @snippet elsif @snippet
raw_snippet_url(@snippet) gitlab_raw_snippet_url(@snippet)
elsif @blob elsif @blob
project_raw_url(@project, @id, **kwargs) project_raw_url(@project, @id, **kwargs)
end end
......
...@@ -194,88 +194,84 @@ module GitlabRoutingHelper ...@@ -194,88 +194,84 @@ module GitlabRoutingHelper
take_ownership_project_pipeline_schedule_path(project, schedule, *args) take_ownership_project_pipeline_schedule_path(project, schedule, *args)
end end
def snippet_path(snippet, *args) def gitlab_snippet_path(snippet, *args)
if snippet.type == "ProjectSnippet" if snippet.is_a?(ProjectSnippet)
application_url_helpers.project_snippet_path(snippet.project, snippet, *args) project_snippet_path(snippet.project, snippet, *args)
else else
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_path(snippet, *new_args) snippet_path(snippet, *new_args)
end end
end end
def snippet_url(snippet, *args) def gitlab_snippet_url(snippet, *args)
if snippet.type == "ProjectSnippet" if snippet.is_a?(ProjectSnippet)
application_url_helpers.project_snippet_url(snippet.project, snippet, *args) project_snippet_url(snippet.project, snippet, *args)
else else
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_url(snippet, *new_args) snippet_url(snippet, *new_args)
end end
end end
def raw_snippet_path(snippet, *args) def gitlab_raw_snippet_path(snippet, *args)
if snippet.type == "ProjectSnippet" if snippet.is_a?(ProjectSnippet)
application_url_helpers.raw_project_snippet_path(snippet.project, snippet, *args) raw_project_snippet_path(snippet.project, snippet, *args)
else else
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.raw_snippet_path(snippet, *new_args) raw_snippet_path(snippet, *new_args)
end end
end end
def raw_snippet_url(snippet, *args) def gitlab_raw_snippet_url(snippet, *args)
if snippet.type == "ProjectSnippet" if snippet.is_a?(ProjectSnippet)
application_url_helpers.raw_project_snippet_url(snippet.project, snippet, *args) raw_project_snippet_url(snippet.project, snippet, *args)
else else
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.raw_snippet_url(snippet, *new_args) raw_snippet_url(snippet, *new_args)
end end
end end
def snippet_notes_path(snippet, *args) def gitlab_snippet_notes_path(snippet, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_notes_path(snippet, *new_args) snippet_notes_path(snippet, *new_args)
end end
def snippet_notes_url(snippet, *args) def gitlab_snippet_notes_url(snippet, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_notes_url(snippet, *new_args) snippet_notes_url(snippet, *new_args)
end end
def snippet_note_path(snippet, note, *args) def gitlab_snippet_note_path(snippet, note, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_note_path(snippet, note, *new_args) snippet_note_path(snippet, note, *new_args)
end end
def snippet_note_url(snippet, note, *args) def gitlab_snippet_note_url(snippet, note, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.snippet_note_url(snippet, note, *new_args) snippet_note_url(snippet, note, *new_args)
end end
def toggle_award_emoji_snippet_note_path(snippet, note, *args) def gitlab_toggle_award_emoji_snippet_note_path(snippet, note, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.toggle_award_emoji_snippet_note_path(snippet, note, *new_args) toggle_award_emoji_snippet_note_path(snippet, note, *new_args)
end end
def toggle_award_emoji_snippet_note_url(snippet, note, *args) def gitlab_toggle_award_emoji_snippet_note_url(snippet, note, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.toggle_award_emoji_snippet_note_url(snippet, note, *new_args) toggle_award_emoji_snippet_note_url(snippet, note, *new_args)
end end
def toggle_award_emoji_snippet_path(snippet, *args) def gitlab_toggle_award_emoji_snippet_path(snippet, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.toggle_award_emoji_snippet_path(snippet, *new_args) toggle_award_emoji_snippet_path(snippet, *new_args)
end end
def toggle_award_emoji_snippet_url(snippet, *args) def gitlab_toggle_award_emoji_snippet_url(snippet, *args)
new_args = snippet_query_params(snippet, *args) new_args = snippet_query_params(snippet, *args)
application_url_helpers.toggle_award_emoji_snippet_url(snippet, *new_args) toggle_award_emoji_snippet_url(snippet, *new_args)
end end
private private
def application_url_helpers
Gitlab::Routing.url_helpers
end
def snippet_query_params(snippet, *args) def snippet_query_params(snippet, *args)
opts = case args.last opts = case args.last
when Hash when Hash
......
...@@ -279,19 +279,30 @@ module IssuablesHelper ...@@ -279,19 +279,30 @@ module IssuablesHelper
initialDescriptionText: issuable.description, initialDescriptionText: issuable.description,
initialTaskStatus: issuable.task_status initialTaskStatus: issuable.task_status
} }
data.merge!(issue_only_initial_data(issuable))
data.merge!(path_data(parent))
data.merge!(updated_at_by(issuable))
data[:hasClosingMergeRequest] = issuable.merge_requests_count(current_user) != 0 if issuable.is_a?(Issue) data
data[:zoomMeetingUrl] = ZoomMeeting.canonical_meeting_url(issuable) if issuable.is_a?(Issue) end
if parent.is_a?(Group) def issue_only_initial_data(issuable)
data[:groupPath] = parent.path return {} unless issuable.is_a?(Issue)
else
data.merge!(projectPath: ref_project.path, projectNamespace: ref_project.namespace.full_path)
end
data.merge!(updated_at_by(issuable)) {
hasClosingMergeRequest: issuable.merge_requests_count(current_user) != 0,
zoomMeetingUrl: ZoomMeeting.canonical_meeting_url(issuable),
sentryIssueIdentifier: SentryIssue.find_by(issue: issuable)&.sentry_issue_identifier # rubocop:disable CodeReuse/ActiveRecord
}
end
data def path_data(parent)
return { groupPath: parent.path } if parent.is_a?(Group)
{
projectPath: ref_project.path,
projectNamespace: ref_project.namespace.full_path
}
end end
def updated_at_by(issuable) def updated_at_by(issuable)
......
...@@ -95,7 +95,7 @@ module NotesHelper ...@@ -95,7 +95,7 @@ module NotesHelper
def notes_url(params = {}) def notes_url(params = {})
if @snippet.is_a?(PersonalSnippet) if @snippet.is_a?(PersonalSnippet)
snippet_notes_path(@snippet, params) gitlab_snippet_notes_path(@snippet, params)
else else
params.merge!(target_id: @noteable.id, target_type: @noteable.class.name.underscore) params.merge!(target_id: @noteable.id, target_type: @noteable.class.name.underscore)
...@@ -105,7 +105,7 @@ module NotesHelper ...@@ -105,7 +105,7 @@ module NotesHelper
def note_url(note, project = @project) def note_url(note, project = @project)
if note.noteable.is_a?(PersonalSnippet) if note.noteable.is_a?(PersonalSnippet)
snippet_note_path(note.noteable, note) gitlab_snippet_note_path(note.noteable, note)
else else
project_note_path(project, note) project_note_path(project, note)
end end
...@@ -126,7 +126,7 @@ module NotesHelper ...@@ -126,7 +126,7 @@ module NotesHelper
def new_form_url def new_form_url
return unless @snippet.is_a?(PersonalSnippet) return unless @snippet.is_a?(PersonalSnippet)
snippet_notes_path(@snippet) gitlab_snippet_notes_path(@snippet)
end end
def can_create_note? def can_create_note?
......
...@@ -13,7 +13,7 @@ module SnippetsHelper ...@@ -13,7 +13,7 @@ module SnippetsHelper
def download_raw_snippet_button(snippet) def download_raw_snippet_button(snippet)
link_to(icon('download'), link_to(icon('download'),
raw_snippet_path(snippet, inline: false), gitlab_raw_snippet_path(snippet, inline: false),
target: '_blank', target: '_blank',
rel: 'noopener noreferrer', rel: 'noopener noreferrer',
class: "btn btn-sm has-tooltip", class: "btn btn-sm has-tooltip",
...@@ -109,7 +109,7 @@ module SnippetsHelper ...@@ -109,7 +109,7 @@ module SnippetsHelper
end end
def snippet_embed_tag(snippet) def snippet_embed_tag(snippet)
content_tag(:script, nil, src: snippet_url(snippet, format: :js)) content_tag(:script, nil, src: gitlab_snippet_url(snippet, format: :js))
end end
def snippet_badge(snippet) def snippet_badge(snippet)
...@@ -134,7 +134,7 @@ module SnippetsHelper ...@@ -134,7 +134,7 @@ module SnippetsHelper
return if blob.empty? || blob.binary? || blob.stored_externally? return if blob.empty? || blob.binary? || blob.stored_externally?
link_to(external_snippet_icon('doc-code'), link_to(external_snippet_icon('doc-code'),
raw_snippet_url(@snippet), gitlab_raw_snippet_url(@snippet),
class: 'btn', class: 'btn',
target: '_blank', target: '_blank',
rel: 'noopener noreferrer', rel: 'noopener noreferrer',
...@@ -143,7 +143,7 @@ module SnippetsHelper ...@@ -143,7 +143,7 @@ module SnippetsHelper
def embedded_snippet_download_button def embedded_snippet_download_button
link_to(external_snippet_icon('download'), link_to(external_snippet_icon('download'),
raw_snippet_url(@snippet, inline: false), gitlab_raw_snippet_url(@snippet, inline: false),
class: 'btn', class: 'btn',
target: '_blank', target: '_blank',
title: 'Download', title: 'Download',
......
...@@ -38,7 +38,7 @@ module Emails ...@@ -38,7 +38,7 @@ module Emails
setup_note_mail(note_id, recipient_id) setup_note_mail(note_id, recipient_id)
@snippet = @note.noteable @snippet = @note.noteable
@target_url = snippet_url(@note.noteable) @target_url = gitlab_snippet_url(@note.noteable)
mail_answer_note_thread(@snippet, @note, note_thread_options(recipient_id, reason)) mail_answer_note_thread(@snippet, @note, note_thread_options(recipient_id, reason))
end end
......
...@@ -39,9 +39,15 @@ module Groups ...@@ -39,9 +39,15 @@ module Groups
ensure_ownership ensure_ownership
end end
post_update_hooks(@updated_project_ids)
true true
end end
# Overridden in EE
def post_update_hooks(updated_project_ids)
end
def ensure_allowed_transfer def ensure_allowed_transfer
raise_transfer_error(:group_is_already_root) if group_is_already_root? raise_transfer_error(:group_is_already_root) if group_is_already_root?
raise_transfer_error(:same_parent_as_current) if same_parent? raise_transfer_error(:same_parent_as_current) if same_parent?
...@@ -96,9 +102,16 @@ module Groups ...@@ -96,9 +102,16 @@ module Groups
.where(id: descendants.select(:id)) .where(id: descendants.select(:id))
.update_all(visibility_level: @new_parent_group.visibility_level) .update_all(visibility_level: @new_parent_group.visibility_level)
@group projects_to_update = @group
.all_projects .all_projects
.where("visibility_level > ?", @new_parent_group.visibility_level) .where("visibility_level > ?", @new_parent_group.visibility_level)
# Used in post_update_hooks in EE. Must use pluck (and not select)
# here as after we perform the update below we won't be able to find
# these records again.
@updated_project_ids = projects_to_update.pluck(:id)
projects_to_update
.update_all(visibility_level: @new_parent_group.visibility_level) .update_all(visibility_level: @new_parent_group.visibility_level)
end end
# rubocop: enable CodeReuse/ActiveRecord # rubocop: enable CodeReuse/ActiveRecord
......
- if readme.rich_viewer - if readme.rich_viewer
%article.file-holder.readme-holder{ id: 'readme', class: [("limited-width-container" unless fluid_layout), ("js-show-on-root" if vue_file_list_enabled?)] } %article.file-holder.readme-holder{ id: 'readme', class: [("limited-width-container" unless fluid_layout), ("js-show-on-root" if vue_file_list_enabled?)] }
.js-file-title.file-title .js-file-title.file-title-flex-parent
= blob_icon readme.mode, readme.name .file-header-content
= link_to project_blob_path(@project, tree_join(@ref, readme.path)) do = blob_icon readme.mode, readme.name
%strong = link_to project_blob_path(@project, tree_join(@ref, readme.path)) do
= readme.name %strong
= readme.name
= render 'projects/blob/viewer', viewer: readme.rich_viewer, viewer_url: project_blob_path(@project, tree_join(@ref, readme.path), viewer: :rich, format: :json) = render 'projects/blob/viewer', viewer: readme.rich_viewer, viewer_url: project_blob_path(@project, tree_join(@ref, readme.path), viewer: :rich, format: :json)
- snippet_blob = chunk_snippet(snippet_blob, @search_term) - snippet_blob = chunk_snippet(snippet_blob, @search_term)
- snippet = snippet_blob[:snippet_object] - snippet = snippet_blob[:snippet_object]
- snippet_chunks = snippet_blob[:snippet_chunks] - snippet_chunks = snippet_blob[:snippet_chunks]
- snippet_path = snippet_path(snippet) - snippet_path = gitlab_snippet_path(snippet)
.search-result-row .search-result-row
%span %span
......
.search-result-row .search-result-row
%h4.snippet-title.term %h4.snippet-title.term
= link_to snippet_path(snippet_title) do = link_to gitlab_snippet_path(snippet_title) do
= truncate(snippet_title.title, length: 60) = truncate(snippet_title.title, length: 60)
= snippet_badge(snippet_title) = snippet_badge(snippet_title)
%span.cgray.monospace.tiny.float-right.term %span.cgray.monospace.tiny.float-right.term
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
= image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: '' = image_tag avatar_icon_for_user(snippet.author), class: "avatar s40 d-none d-sm-block", alt: ''
.title .title
= link_to snippet_path(snippet) do = link_to gitlab_snippet_path(snippet) do
= snippet.title = snippet.title
- if snippet.file_name.present? - if snippet.file_name.present?
%span.snippet-filename.d-none.d-sm-inline-block.ml-2 %span.snippet-filename.d-none.d-sm-inline-block.ml-2
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
%ul.controls %ul.controls
%li %li
= link_to snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count.zero?) do = link_to gitlab_snippet_path(snippet, anchor: 'notes'), class: ('no-comments' if notes_count.zero?) do
= icon('comments') = icon('comments')
= notes_count = notes_count
%li %li
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
= link_to edit_snippet_path(@snippet), class: "btn btn-grouped" do = link_to edit_snippet_path(@snippet), class: "btn btn-grouped" do
= _("Edit") = _("Edit")
- if can?(current_user, :admin_personal_snippet, @snippet) - if can?(current_user, :admin_personal_snippet, @snippet)
= link_to snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do = link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do
= _("Delete") = _("Delete")
- if can?(current_user, :create_personal_snippet) - if can?(current_user, :create_personal_snippet)
= link_to new_snippet_path, class: "btn btn-grouped btn-success btn-inverted", title: _("New snippet") do = link_to new_snippet_path, class: "btn btn-grouped btn-success btn-inverted", title: _("New snippet") do
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
= _("New snippet") = _("New snippet")
- if can?(current_user, :admin_personal_snippet, @snippet) - if can?(current_user, :admin_personal_snippet, @snippet)
%li %li
= link_to snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do = link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do
= _("Delete") = _("Delete")
- if can?(current_user, :update_personal_snippet, @snippet) - if can?(current_user, :update_personal_snippet, @snippet)
%li %li
......
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
%h3.page-title %h3.page-title
= _("Edit Snippet") = _("Edit Snippet")
%hr %hr
= render 'shared/snippets/form', url: snippet_path(@snippet) = render 'shared/snippets/form', url: gitlab_snippet_path(@snippet)
---
title: Fix top border of README file header in file list
merge_request: 21314
author:
type: fixed
---
title: Rename snippet refactored routes
merge_request: 21267
author:
type: fixed
---
title: Update maven_file_name_regex for full string match
merge_request:
author:
type: security
...@@ -25,7 +25,7 @@ module Gitlab ...@@ -25,7 +25,7 @@ module Gitlab
when WikiPage when WikiPage
wiki_page_url wiki_page_url
when Snippet when Snippet
opts[:raw].present? ? raw_snippet_url(object) : snippet_url(object) opts[:raw].present? ? gitlab_raw_snippet_url(object) : gitlab_snippet_url(object)
when Milestone when Milestone
milestone_url(object) milestone_url(object)
when ::Ci::Build when ::Ci::Build
...@@ -65,7 +65,7 @@ module Gitlab ...@@ -65,7 +65,7 @@ module Gitlab
merge_request_url(object.noteable, anchor: dom_id(object)) merge_request_url(object.noteable, anchor: dom_id(object))
elsif object.for_snippet? elsif object.for_snippet?
snippet_url(object.noteable, anchor: dom_id(object)) gitlab_snippet_url(object.noteable, anchor: dom_id(object))
end end
end end
......
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
# https://gitlab.com/gitlab-org/gitlab-foss/issues/58158 # https://gitlab.com/gitlab-org/gitlab/issues/26952
# BUG_IN_CODE
context 'Manage', :github, :quarantine do context 'Manage', :github, :quarantine do
describe 'Project import from GitHub' do describe 'Project import from GitHub' do
let(:imported_project) do let(:imported_project) do
......
# frozen_string_literal: true # frozen_string_literal: true
module QA module QA
# Failure issue: https://gitlab.com/gitlab-org/quality/staging/issues/66 # Failure issue: https://gitlab.com/gitlab-org/gitlab/issues/36817
# BUG_IN_CODE
context 'Create', :quarantine do context 'Create', :quarantine do
describe 'Merge request rebasing' do describe 'Merge request rebasing' do
it 'user rebases source branch of merge request' do it 'user rebases source branch of merge request' do
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
module QA module QA
# Git protocol v2 is temporarily disabled # Git protocol v2 is temporarily disabled
# https://gitlab.com/gitlab-org/gitlab-foss/issues/55769 (confidential) # https://gitlab.com/gitlab-org/gitlab/issues/27828
# BUG_IN_CODE
context 'Create', :quarantine do context 'Create', :quarantine do
describe 'Push over HTTP using Git protocol version 2', :requires_git_protocol_v2 do describe 'Push over HTTP using Git protocol version 2', :requires_git_protocol_v2 do
it 'user pushes to the repository' do it 'user pushes to the repository' do
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
module QA module QA
# Git protocol v2 is temporarily disabled # Git protocol v2 is temporarily disabled
# https://gitlab.com/gitlab-org/gitlab-foss/issues/55769 (confidential) # https://gitlab.com/gitlab-org/gitlab/issues/27828
# BUG_IN_CODE
context 'Create', :quarantine do context 'Create', :quarantine do
describe 'Push over SSH using Git protocol version 2', :requires_git_protocol_v2 do describe 'Push over SSH using Git protocol version 2', :requires_git_protocol_v2 do
# Note: If you run this test against GDK make sure you've enabled sshd and # Note: If you run this test against GDK make sure you've enabled sshd and
......
#!/usr/bin/env ruby #!/usr/bin/env ruby
# frozen_string_literal: true
require 'digest' require 'digest'
require 'fileutils' require 'fileutils'
harness_path = File.expand_path('../.git/security_harness', __dir__) if ENV['NO_COLOR']
hook_path = File.expand_path("../.git/hooks/pre-push", __dir__) SHELL_RED = ''
SHELL_GREEN = ''
SHELL_YELLOW = ''
SHELL_CLEAR = ''
else
SHELL_RED = "\e[1;31m"
SHELL_GREEN = "\e[1;32m"
SHELL_YELLOW = "\e[1;33m"
SHELL_CLEAR = "\e[0m"
end
if File.exist?(hook_path) HOOK_PATH = File.expand_path("../.git/hooks/pre-push", __dir__)
# Deal with a pre-existing hook HOOK_DATA = <<~HOOK
source_sum = Digest::SHA256.hexdigest(DATA.read) #!/bin/bash
dest_sum = Digest::SHA256.file(hook_path).hexdigest
if source_sum != dest_sum set -e
puts "#{hook_path} exists and is different from our hook!"
puts "Remove it and re-run this script to continue."
exit 1 url="$2"
end harness=`dirname "$0"`/../security_harness
else
File.open(hook_path, 'w') do |file| if [ -e "$harness" ]
IO.copy_stream(DATA, file) then
end if [[ ("$url" != *"dev.gitlab.org"*) && ("$url" != *"gitlab-org/security/"*) ]]
then
echo "Pushing to remotes other than dev.gitlab.org and gitlab.com/gitlab-org/security has been disabled!"
echo "Run scripts/security-harness to disable this check."
echo
exit 1
fi
fi
HOOK
File.chmod(0755, hook_path) def write_hook
FileUtils.mkdir_p(File.dirname(HOOK_PATH))
File.open(HOOK_PATH, 'w') do |file|
file.write(HOOK_DATA)
end
File.chmod(0755, HOOK_PATH)
end end
# Toggle the harness on or off # Toggle the harness on or off
if File.exist?(harness_path) def toggle
FileUtils.rm(harness_path) harness_path = File.expand_path('../.git/security_harness', __dir__)
puts "Security harness removed -- you can now push to all remotes." if File.exist?(harness_path)
else FileUtils.rm(harness_path)
FileUtils.touch(harness_path)
puts "Security harness installed -- you will only be able to push to dev.gitlab.org!" puts "#{SHELL_YELLOW}Security harness removed -- you can now push to all remotes.#{SHELL_CLEAR}"
end else
FileUtils.touch(harness_path)
__END__ puts "#{SHELL_GREEN}Security harness installed -- you will only be able to push to dev.gitlab.org or gitlab.com/gitlab-org/security!#{SHELL_CLEAR}"
#!/bin/bash end
end
set -e # If we were to change the script and then check for a pre-existing hook before
# writing, the check would fail even if the user had an unmodified version of
# the old hook. Checking previous version hashes allows us to safely overwrite a
# script that differs from the current version, as long as it's an old one and
# not custom.
def previous_version?(dest_sum)
# SHA256 hashes of previous iterations of the script contained in `DATA`
%w[
010bf0363a911ebab2bd5728d80795ed02388da51815f0b2530d08ae8ac574f0
].include?(dest_sum)
end
url="$2" if !File.exist?(HOOK_PATH)
harness=`dirname "$0"`/../security_harness write_hook
toggle
else
# Deal with a pre-existing hook
source_sum = Digest::SHA256.hexdigest(HOOK_DATA)
dest_sum = Digest::SHA256.file(HOOK_PATH).hexdigest
if [ -e "$harness" ] if previous_version?(dest_sum)
then # Upgrading from a previous version, update in-place
if [[ "$url" != *"dev.gitlab.org"* ]] write_hook
then toggle
echo "Pushing to remotes other than dev.gitlab.org has been disabled!" elsif source_sum != dest_sum
echo "Run scripts/security-harness to disable this check." # Pre-existing hook we didn't create; do nothing
echo puts "#{SHELL_RED}#{HOOK_PATH} exists and is different from our hook!"
puts "Remove it and re-run this script to continue.#{SHELL_CLEAR}"
exit 1 exit 1
fi else
fi # No hook update needed, just toggle
toggle
end
end
...@@ -28,7 +28,7 @@ describe 'Projects > Snippets > User views snippets' do ...@@ -28,7 +28,7 @@ describe 'Projects > Snippets > User views snippets' do
end end
it 'shows snippets' do it 'shows snippets' do
expect(page).to have_content(project_snippet.title) expect(page).to have_link(project_snippet.title, href: project_snippet_path(project, project_snippet))
expect(page).not_to have_content(snippet.title) expect(page).not_to have_content(snippet.title)
end end
end end
...@@ -14,9 +14,9 @@ describe 'User Snippets' do ...@@ -14,9 +14,9 @@ describe 'User Snippets' do
end end
it 'View all of my snippets' do it 'View all of my snippets' do
expect(page).to have_content(public_snippet.title) expect(page).to have_link(public_snippet.title, href: snippet_path(public_snippet))
expect(page).to have_content(internal_snippet.title) expect(page).to have_link(internal_snippet.title, href: snippet_path(internal_snippet))
expect(page).to have_content(private_snippet.title) expect(page).to have_link(private_snippet.title, href: snippet_path(private_snippet))
end end
it 'View my public snippets' do it 'View my public snippets' do
......
...@@ -118,91 +118,91 @@ describe GitlabRoutingHelper do ...@@ -118,91 +118,91 @@ describe GitlabRoutingHelper do
let_it_be(:project_snippet) { create(:project_snippet) } let_it_be(:project_snippet) { create(:project_snippet) }
let_it_be(:note) { create(:note_on_personal_snippet, noteable: personal_snippet) } let_it_be(:note) { create(:note_on_personal_snippet, noteable: personal_snippet) }
describe '#snippet_path' do describe '#gitlab_snippet_path' do
it 'returns the personal snippet path' do it 'returns the personal snippet path' do
expect(snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}") expect(gitlab_snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}")
end end
it 'returns the project snippet path' do it 'returns the project snippet path' do
expect(snippet_path(project_snippet)).to eq("/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}") expect(gitlab_snippet_path(project_snippet)).to eq("/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}")
end end
end end
describe '#snippet_url' do describe '#gitlab_snippet_url' do
it 'returns the personal snippet url' do it 'returns the personal snippet url' do
expect(snippet_url(personal_snippet)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}") expect(gitlab_snippet_url(personal_snippet)).to eq("http://test.host/snippets/#{personal_snippet.id}")
end end
it 'returns the project snippet url' do it 'returns the project snippet url' do
expect(snippet_url(project_snippet)).to eq("#{Settings.gitlab['url']}/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}") expect(gitlab_snippet_url(project_snippet)).to eq("http://test.host/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}")
end end
end end
describe '#raw_snippet_path' do describe '#gitlab_raw_snippet_path' do
it 'returns the raw personal snippet path' do it 'returns the raw personal snippet path' do
expect(raw_snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/raw") expect(gitlab_raw_snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/raw")
end end
it 'returns the raw project snippet path' do it 'returns the raw project snippet path' do
expect(raw_snippet_path(project_snippet)).to eq("/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}/raw") expect(gitlab_raw_snippet_path(project_snippet)).to eq("/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}/raw")
end end
end end
describe '#raw_snippet_url' do describe '#gitlab_raw_snippet_url' do
it 'returns the raw personal snippet url' do it 'returns the raw personal snippet url' do
expect(raw_snippet_url(personal_snippet)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}/raw") expect(gitlab_raw_snippet_url(personal_snippet)).to eq("http://test.host/snippets/#{personal_snippet.id}/raw")
end end
it 'returns the raw project snippet url' do it 'returns the raw project snippet url' do
expect(raw_snippet_url(project_snippet)).to eq("#{Settings.gitlab['url']}/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}/raw") expect(gitlab_raw_snippet_url(project_snippet)).to eq("http://test.host/#{project_snippet.project.full_path}/snippets/#{project_snippet.id}/raw")
end end
end end
describe '#snippet_notes_path' do describe '#gitlab_snippet_notes_path' do
it 'returns the notes path for the personal snippet' do it 'returns the notes path for the personal snippet' do
expect(snippet_notes_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/notes") expect(gitlab_snippet_notes_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/notes")
end end
end end
describe '#snippet_notes_url' do describe '#gitlab_snippet_notes_url' do
it 'returns the notes url for the personal snippet' do it 'returns the notes url for the personal snippet' do
expect(snippet_notes_url(personal_snippet)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}/notes") expect(gitlab_snippet_notes_url(personal_snippet)).to eq("http://test.host/snippets/#{personal_snippet.id}/notes")
end end
end end
describe '#snippet_note_path' do describe '#gitlab_snippet_note_path' do
it 'returns the note path for the personal snippet' do it 'returns the note path for the personal snippet' do
expect(snippet_note_path(personal_snippet, note)).to eq("/snippets/#{personal_snippet.id}/notes/#{note.id}") expect(gitlab_snippet_note_path(personal_snippet, note)).to eq("/snippets/#{personal_snippet.id}/notes/#{note.id}")
end end
end end
describe '#snippet_note_url' do describe '#gitlab_snippet_note_url' do
it 'returns the note url for the personal snippet' do it 'returns the note url for the personal snippet' do
expect(snippet_note_url(personal_snippet, note)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}/notes/#{note.id}") expect(gitlab_snippet_note_url(personal_snippet, note)).to eq("http://test.host/snippets/#{personal_snippet.id}/notes/#{note.id}")
end end
end end
describe '#toggle_award_emoji_snippet_note_path' do describe '#gitlab_toggle_award_emoji_snippet_note_path' do
it 'returns the note award emoji path for the personal snippet' do it 'returns the note award emoji path for the personal snippet' do
expect(toggle_award_emoji_snippet_note_path(personal_snippet, note)).to eq("/snippets/#{personal_snippet.id}/notes/#{note.id}/toggle_award_emoji") expect(gitlab_toggle_award_emoji_snippet_note_path(personal_snippet, note)).to eq("/snippets/#{personal_snippet.id}/notes/#{note.id}/toggle_award_emoji")
end end
end end
describe '#toggle_award_emoji_snippet_note_url' do describe '#gitlab_toggle_award_emoji_snippet_note_url' do
it 'returns the note award emoji url for the personal snippet' do it 'returns the note award emoji url for the personal snippet' do
expect(toggle_award_emoji_snippet_note_url(personal_snippet, note)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}/notes/#{note.id}/toggle_award_emoji") expect(gitlab_toggle_award_emoji_snippet_note_url(personal_snippet, note)).to eq("http://test.host/snippets/#{personal_snippet.id}/notes/#{note.id}/toggle_award_emoji")
end end
end end
describe '#toggle_award_emoji_snippet_path' do describe '#gitlab_toggle_award_emoji_snippet_path' do
it 'returns the award emoji path for the personal snippet' do it 'returns the award emoji path for the personal snippet' do
expect(toggle_award_emoji_snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/toggle_award_emoji") expect(gitlab_toggle_award_emoji_snippet_path(personal_snippet)).to eq("/snippets/#{personal_snippet.id}/toggle_award_emoji")
end end
end end
describe '#toggle_award_emoji_snippet_url' do describe '#gitlab_toggle_award_emoji_snippet_url' do
it 'returns the award url for the personal snippet' do it 'returns the award url for the personal snippet' do
expect(toggle_award_emoji_snippet_url(personal_snippet)).to eq("#{Settings.gitlab['url']}/snippets/#{personal_snippet.id}/toggle_award_emoji") expect(gitlab_toggle_award_emoji_snippet_url(personal_snippet)).to eq("http://test.host/snippets/#{personal_snippet.id}/toggle_award_emoji")
end end
end end
end end
......
...@@ -202,6 +202,26 @@ describe IssuablesHelper do ...@@ -202,6 +202,26 @@ describe IssuablesHelper do
expect(helper.issuable_initial_data(issue)).to match(hash_including(expected_data)) expect(helper.issuable_initial_data(issue)).to match(hash_including(expected_data))
end end
describe '#sentryIssueIdentifier' do
let(:issue) { create(:issue, author: user) }
before do
assign(:project, issue.project)
end
it 'sets sentryIssueIdentifier to nil with no sentry issue ' do
expect(helper.issuable_initial_data(issue)[:sentryIssueIdentifier])
.to be_nil
end
it 'sets sentryIssueIdentifier to sentry_issue_identifier' do
sentry_issue = create(:sentry_issue, issue: issue)
expect(helper.issuable_initial_data(issue)[:sentryIssueIdentifier])
.to eq(sentry_issue.sentry_issue_identifier)
end
end
describe '#zoomMeetingUrl in issue' do describe '#zoomMeetingUrl in issue' do
let(:issue) { create(:issue, author: user) } let(:issue) { create(:issue, author: user) }
......
...@@ -14,13 +14,13 @@ describe SnippetsHelper do ...@@ -14,13 +14,13 @@ describe SnippetsHelper do
it 'returns view raw button of embedded snippets for personal snippets' do it 'returns view raw button of embedded snippets for personal snippets' do
@snippet = create(:personal_snippet, :public) @snippet = create(:personal_snippet, :public)
expect(subject).to eq(download_link("#{Settings.gitlab['url']}/snippets/#{@snippet.id}/raw")) expect(subject).to eq(download_link("http://test.host/snippets/#{@snippet.id}/raw"))
end end
it 'returns view raw button of embedded snippets for project snippets' do it 'returns view raw button of embedded snippets for project snippets' do
@snippet = create(:project_snippet, :public) @snippet = create(:project_snippet, :public)
expect(subject).to eq(download_link("#{Settings.gitlab['url']}/#{@snippet.project.path_with_namespace}/snippets/#{@snippet.id}/raw")) expect(subject).to eq(download_link("http://test.host/#{@snippet.project.path_with_namespace}/snippets/#{@snippet.id}/raw"))
end end
def download_link(url) def download_link(url)
...@@ -34,13 +34,13 @@ describe SnippetsHelper do ...@@ -34,13 +34,13 @@ describe SnippetsHelper do
it 'returns download button of embedded snippets for personal snippets' do it 'returns download button of embedded snippets for personal snippets' do
@snippet = create(:personal_snippet, :public) @snippet = create(:personal_snippet, :public)
expect(subject).to eq(download_link("#{Settings.gitlab['url']}/snippets/#{@snippet.id}/raw")) expect(subject).to eq(download_link("http://test.host/snippets/#{@snippet.id}/raw"))
end end
it 'returns download button of embedded snippets for project snippets' do it 'returns download button of embedded snippets for project snippets' do
@snippet = create(:project_snippet, :public) @snippet = create(:project_snippet, :public)
expect(subject).to eq(download_link("#{Settings.gitlab['url']}/#{@snippet.project.path_with_namespace}/snippets/#{@snippet.id}/raw")) expect(subject).to eq(download_link("http://test.host/#{@snippet.project.path_with_namespace}/snippets/#{@snippet.id}/raw"))
end end
def download_link(url) def download_link(url)
...@@ -56,7 +56,7 @@ describe SnippetsHelper do ...@@ -56,7 +56,7 @@ describe SnippetsHelper do
context 'public' do context 'public' do
it 'returns a script tag with the snippet full url' do it 'returns a script tag with the snippet full url' do
expect(subject).to eq(script_embed("#{Settings.gitlab['url']}/snippets/#{snippet.id}")) expect(subject).to eq(script_embed("http://test.host/snippets/#{snippet.id}"))
end end
end end
end end
...@@ -65,7 +65,7 @@ describe SnippetsHelper do ...@@ -65,7 +65,7 @@ describe SnippetsHelper do
let(:snippet) { public_project_snippet } let(:snippet) { public_project_snippet }
it 'returns a script tag with the snippet full url' do it 'returns a script tag with the snippet full url' do
expect(subject).to eq(script_embed("#{Settings.gitlab['url']}/#{snippet.project.path_with_namespace}/snippets/#{snippet.id}")) expect(subject).to eq(script_embed("http://test.host/#{snippet.project.path_with_namespace}/snippets/#{snippet.id}"))
end 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