@@ -146,8 +161,13 @@ function renderMermaids($els) {
}
renderedChars += source.length;
+ renderedMermaidBlocks += 1;
- renderMermaidEl(el);
+ const requestId = window.requestIdleCallback(() => {
+ renderMermaidEl(el);
+ });
+
+ elsProcessingMap.set(el, requestId);
});
})
.catch(err => {
diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb
index b3fa089a71..1f6f8e4429 100644
--- a/app/controllers/explore/projects_controller.rb
+++ b/app/controllers/explore/projects_controller.rb
@@ -8,6 +8,8 @@ class Explore::ProjectsController < Explore::ApplicationController
include SortingHelper
include SortingPreference
+ MIN_SEARCH_LENGTH = 3
+
before_action :set_non_archived_param
before_action :set_sorting
@@ -70,7 +72,7 @@ class Explore::ProjectsController < Explore::ApplicationController
def load_projects
load_project_counts
- projects = ProjectsFinder.new(current_user: current_user, params: params).execute
+ projects = ProjectsFinder.new(current_user: current_user, params: params.merge(minimum_search_length: MIN_SEARCH_LENGTH)).execute
projects = preload_associations(projects)
projects = projects.page(params[:page]).without_count
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index dedaf0c903..d041b2f4b7 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -126,7 +126,6 @@ class SearchController < ApplicationController
payload[:metadata] ||= {}
payload[:metadata]['meta.search.group_id'] = params[:group_id]
payload[:metadata]['meta.search.project_id'] = params[:project_id]
- payload[:metadata]['meta.search.search'] = params[:search]
payload[:metadata]['meta.search.scope'] = params[:scope]
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 75a861423e..f4757316e1 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -19,7 +19,7 @@ class UsersController < ApplicationController
prepend_before_action(only: [:show]) { authenticate_sessionless_user!(:rss) }
before_action :user, except: [:exists, :suggests]
before_action :authorize_read_user_profile!,
- only: [:calendar, :calendar_activities, :groups, :projects, :contributed_projects, :starred_projects, :snippets]
+ only: [:calendar, :calendar_activities, :groups, :projects, :contributed, :starred, :snippets]
def show
respond_to do |format|
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 471029c1ef..c3a7301aff 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -18,6 +18,7 @@
# personal: boolean
# search: string
# search_namespaces: boolean
+# minimum_search_length: int
# non_archived: boolean
# archived: 'only' or boolean
# min_access_level: integer
@@ -177,6 +178,9 @@ class ProjectsFinder < UnionFinder
def by_search(items)
params[:search] ||= params[:name]
+
+ return items.none if params[:search].present? && params[:minimum_search_length].present? && params[:search].length < params[:minimum_search_length].to_i
+
items.optionally_search(params[:search], include_namespace: params[:search_namespaces].present?)
end
diff --git a/app/finders/starred_projects_finder.rb b/app/finders/starred_projects_finder.rb
index fcb469d1d1..e209960c47 100644
--- a/app/finders/starred_projects_finder.rb
+++ b/app/finders/starred_projects_finder.rb
@@ -1,11 +1,22 @@
# frozen_string_literal: true
class StarredProjectsFinder < ProjectsFinder
+ include Gitlab::Allowable
+
def initialize(user, params: {}, current_user: nil)
+ @user = user
+
super(
params: params,
current_user: current_user,
project_ids_relation: user.starred_projects.select(:id)
)
end
+
+ def execute
+ # Do not show starred projects if the user has a private profile.
+ return Project.none unless can?(current_user, :read_user_profile, @user)
+
+ super
+ end
end
diff --git a/app/graphql/types/user_type.rb b/app/graphql/types/user_type.rb
index 8047708776..4fa62c4961 100644
--- a/app/graphql/types/user_type.rb
+++ b/app/graphql/types/user_type.rb
@@ -19,7 +19,7 @@ module Types
field :state, Types::UserStateEnum, null: false,
description: 'State of the user'
field :email, GraphQL::STRING_TYPE, null: true,
- description: 'User email'
+ description: 'User email', method: :public_email
field :avatar_url, GraphQL::STRING_TYPE, null: true,
description: "URL of the user's avatar"
field :web_url, GraphQL::STRING_TYPE, null: false,
@@ -30,13 +30,11 @@ module Types
resolver: Resolvers::TodoResolver,
description: 'Todos of the user'
field :group_memberships, Types::GroupMemberType.connection_type, null: true,
- description: 'Group memberships of the user',
- method: :group_members
+ description: 'Group memberships of the user'
field :status, Types::UserStatusType, null: true,
description: 'User status'
field :project_memberships, Types::ProjectMemberType.connection_type, null: true,
- description: 'Project memberships of the user',
- method: :project_members
+ description: 'Project memberships of the user'
field :starred_projects, Types::ProjectType.connection_type, null: true,
description: 'Projects starred by the user',
resolver: Resolvers::UserStarredProjectsResolver
diff --git a/app/models/operations/feature_flags/user_list.rb b/app/models/operations/feature_flags/user_list.rb
index b9bdcb59d5..75a457567a 100644
--- a/app/models/operations/feature_flags/user_list.rb
+++ b/app/models/operations/feature_flags/user_list.rb
@@ -23,6 +23,11 @@ module Operations
before_destroy :ensure_no_associated_strategies
+ def self.belongs_to?(project_id, user_list_ids)
+ uniq_ids = user_list_ids.uniq
+ where(id: uniq_ids, project_id: project_id).count == uniq_ids.count
+ end
+
private
def ensure_no_associated_strategies
diff --git a/app/presenters/user_presenter.rb b/app/presenters/user_presenter.rb
index f201b36346..0028e6d9ef 100644
--- a/app/presenters/user_presenter.rb
+++ b/app/presenters/user_presenter.rb
@@ -2,4 +2,18 @@
class UserPresenter < Gitlab::View::Presenter::Delegated
presents :user
+
+ def group_memberships
+ should_be_private? ? GroupMember.none : user.group_members
+ end
+
+ def project_memberships
+ should_be_private? ? ProjectMember.none : user.project_members
+ end
+
+ private
+
+ def should_be_private?
+ !can?(current_user, :read_user_profile, user)
+ end
end
diff --git a/app/services/todos/destroy/entity_leave_service.rb b/app/services/todos/destroy/entity_leave_service.rb
index 0c0548a17a..a7424c610c 100644
--- a/app/services/todos/destroy/entity_leave_service.rb
+++ b/app/services/todos/destroy/entity_leave_service.rb
@@ -24,7 +24,7 @@ module Todos
# if at least reporter, all entities including confidential issues can be accessed
return if user_has_reporter_access?
- remove_confidential_issue_todos
+ remove_confidential_resource_todos
if entity.private?
remove_project_todos
@@ -43,7 +43,7 @@ module Todos
end
# rubocop: disable CodeReuse/ActiveRecord
- def remove_confidential_issue_todos
+ def remove_confidential_resource_todos
Todo.where(
target_id: confidential_issues.select(:id), target_type: Issue.name, user_id: user.id
).delete_all
@@ -147,3 +147,5 @@ module Todos
end
end
end
+
+Todos::Destroy::EntityLeaveService.prepend_if_ee('EE::Todos::Destroy::EntityLeaveService')
diff --git a/app/validators/zoom_url_validator.rb b/app/validators/zoom_url_validator.rb
index dc4ca6b950..e0f8e4e34a 100644
--- a/app/validators/zoom_url_validator.rb
+++ b/app/validators/zoom_url_validator.rb
@@ -5,8 +5,13 @@
# Custom validator for zoom urls
#
class ZoomUrlValidator < ActiveModel::EachValidator
+ ALLOWED_SCHEMES = %w(https).freeze
+
def validate_each(record, attribute, value)
- return if Gitlab::ZoomLinkExtractor.new(value).links.size == 1
+ links_count = Gitlab::ZoomLinkExtractor.new(value).links.size
+ valid = Gitlab::UrlSanitizer.valid?(value, allowed_schemes: ALLOWED_SCHEMES)
+
+ return if links_count == 1 && valid
record.errors.add(:url, 'must contain one valid Zoom URL')
end
diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml
index f8aa3cf98d..8c0d076c77 100644
--- a/app/views/devise/confirmations/new.html.haml
+++ b/app/views/devise/confirmations/new.html.haml
@@ -6,7 +6,7 @@
= render "devise/shared/error_messages", resource: resource
.form-group
= f.label :email
- = f.email_field :email, class: "form-control", required: true, title: 'Please provide a valid email address.'
+ = f.email_field :email, class: "form-control", required: true, title: 'Please provide a valid email address.', value: nil
.clearfix
= f.submit "Resend", class: 'btn btn-success'
diff --git a/app/views/explore/projects/_projects.html.haml b/app/views/explore/projects/_projects.html.haml
index d819c4ea55..9b87314411 100644
--- a/app/views/explore/projects/_projects.html.haml
+++ b/app/views/explore/projects/_projects.html.haml
@@ -1,2 +1,6 @@
-- is_explore_page = defined?(explore_page) && explore_page
-= render 'shared/projects/list', projects: projects, user: current_user, explore_page: is_explore_page, pipeline_status: Feature.enabled?(:dashboard_pipeline_status, default_enabled: true)
+- if params[:name].present? && params[:name].size < Explore::ProjectsController::MIN_SEARCH_LENGTH
+ .nothing-here-block
+ %h5= _('Enter at least three characters to search')
+- else
+ - is_explore_page = defined?(explore_page) && explore_page
+ = render 'shared/projects/list', projects: projects, user: current_user, explore_page: is_explore_page, pipeline_status: Feature.enabled?(:dashboard_pipeline_status, default_enabled: true)
diff --git a/config/application.rb b/config/application.rb
index 4d2f3745b5..436bb288c3 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -135,6 +135,7 @@ module Gitlab
hook
import_url
elasticsearch_url
+ search
otp_attempt
sentry_dsn
trace
diff --git a/config/feature_categories.yml b/config/feature_categories.yml
index 7b85f910d8..5c6c11f01e 100644
--- a/config/feature_categories.yml
+++ b/config/feature_categories.yml
@@ -46,6 +46,7 @@
- dynamic_application_security_testing
- editor_extension
- epics
+- epic_tracking
- error_tracking
- feature_flags
- foundations
diff --git a/db/post_migrate/20201109114603_schedule_remove_inaccessible_epic_todos.rb b/db/post_migrate/20201109114603_schedule_remove_inaccessible_epic_todos.rb
new file mode 100644
index 0000000000..13d12675a2
--- /dev/null
+++ b/db/post_migrate/20201109114603_schedule_remove_inaccessible_epic_todos.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class ScheduleRemoveInaccessibleEpicTodos < ActiveRecord::Migration[6.0]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+ INTERVAL = 2.minutes
+ BATCH_SIZE = 10
+ MIGRATION = 'RemoveInaccessibleEpicTodos'
+
+ disable_ddl_transaction!
+
+ class Epic < ActiveRecord::Base
+ include EachBatch
+ end
+
+ def up
+ return unless Gitlab.ee?
+
+ relation = Epic.where(confidential: true)
+
+ queue_background_migration_jobs_by_range_at_intervals(
+ relation, MIGRATION, INTERVAL, batch_size: BATCH_SIZE)
+ end
+
+ def down
+ # no-op
+ end
+end
diff --git a/db/schema_migrations/20201109114603 b/db/schema_migrations/20201109114603
new file mode 100644
index 0000000000..c1df2223db
--- /dev/null
+++ b/db/schema_migrations/20201109114603
@@ -0,0 +1 @@
+ae8034ec52df47ce2ce3397715dd18347e4d297a963c17c7b26321f414dfa632
\ No newline at end of file
diff --git a/debian/changelog b/debian/changelog
index 6784ad320c..ea04a18d9f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,18 @@
+gitlab (13.4.7-1) unstable; urgency=medium
+
+ * Use packaged version of pdfjs-dist and adapt for worker-loader 3 api
+ * Remove schema-utils 3.0 from package.json (incompatibilities resolved)
+ All modules depending on schema-utils are now provided by debian packages
+ only
+ * Install grpc using gem command (ruby-grpc package has an unfixed
+ regression - see #966653)
+ * Update uuid to ^8.3.1 in package.json
+ * New upstream version 13.4.7 (Fixes: CVE-2020-26407, CVE-2020-26408,
+ CVE-2020-13357, CVE-2020-26411, CVE-2020-26409)
+ * Drop dependency on ruby-grpc (now handled by gem install)
+
+ -- Pirate Praveen
Tue, 08 Dec 2020 15:32:56 +0530
+
gitlab (13.4.6-3~fto10+1) buster-fasttrack; urgency=medium
* Rebuild for buster-fasttrack.
diff --git a/debian/control b/debian/control
index 3b4c253f28..3c4b7f7a6a 100644
--- a/debian/control
+++ b/debian/control
@@ -322,7 +322,8 @@ Depends: ${shlibs:Depends}, ${misc:Depends},
ruby-bcrypt-pbkdf (>= 1.0~),
# Gitaly GRPC client
ruby-gitaly (>= 13.4.6~),
- ruby-grpc (>= 1.30.2~),
+# See #966653
+# ruby-grpc (>= 1.30.2~),
ruby-google-protobuf (>= 3.12~),
#
ruby-toml-rb (>= 1.0.0-2~),
@@ -392,6 +393,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends},
node-lodash (>= 4.17.15~),
node-marked (>= 0.3~),
node-mousetrap,
+ node-pdfjs-dist,
# Include node-pikaday only after @gitlab/ui is accepted
# node-pikaday,
node-popper.js,
diff --git a/debian/patches/0740-use-packaged-modules.patch b/debian/patches/0740-use-packaged-modules.patch
index ee4c37508a..733d6341be 100644
--- a/debian/patches/0740-use-packaged-modules.patch
+++ b/debian/patches/0740-use-packaged-modules.patch
@@ -3,8 +3,8 @@ Use debian packaged node modules when available
- Remove webpack-bundle-analyzer
- Resolve .json files
- Add more plugins to babel.config.js
- - Add schema-utils 3.0, mkdirp 1.0 and loader-utils 2.0 to ensure compatibility
- for packaged modules (See #976310)
+ - Add mkdirp 1.0 and loader-utils 2.0 to ensure compatibility for packaged
+ modules (See #976310)
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -121,7 +121,7 @@ Use debian packaged node modules when available
"diff": "^3.4.0",
"document-register-element": "1.14.3",
"dompurify": "^2.0.11",
-@@ -85,81 +62,55 @@
+@@ -85,81 +62,53 @@
"editorconfig": "^0.15.3",
"emoji-regex": "^7.0.3",
"emoji-unicode-version": "^0.2.1",
@@ -160,7 +160,7 @@ Use debian packaged node modules when available
"monaco-editor-webpack-plugin": "^1.9.0",
"monaco-yaml": "^2.4.1",
- "mousetrap": "1.6.5",
- "pdfjs-dist": "^2.0.943",
+- "pdfjs-dist": "^2.0.943",
"pikaday": "^1.8.0",
- "popper.js": "^1.16.1",
- "prismjs": "^1.21.0",
@@ -168,7 +168,6 @@ Use debian packaged node modules when available
- "prosemirror-model": "^1.6.4",
"raphael": "^2.2.7",
- "raw-loader": "^4.0.0",
-+ "schema-utils": "^3.0.0",
"select2": "3.5.2-browserify",
"smooshpack": "^0.0.62",
"sortablejs": "^1.10.2",
@@ -222,3 +221,13 @@ Use debian packaged node modules when available
// See: https://gitlab.com/gitlab-org/gitlab/-/issues/229146
'@babel/plugin-transform-arrow-functions',
'lodash',
+--- a/app/assets/javascripts/pdf/index.vue
++++ b/app/assets/javascripts/pdf/index.vue
+@@ -1,6 +1,6 @@
+