From 2e28214d63c2d287fa14ee8773afb445be528f5f Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 14 Mar 2022 00:08:04 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- app/graphql/types/merge_request_type.rb | 4 +- .../types/merge_requests/assignee_type.rb | 1 - .../types/merge_requests/author_type.rb | 14 + .../types/merge_requests/participant_type.rb | 14 + .../types/merge_requests/reviewer_type.rb | 1 - app/models/wiki_page.rb | 3 +- .../development/wiki_front_matter.yml | 8 - .../ops/api_kaminari_count_with_limit.yml | 4 +- doc/administration/job_artifacts.md | 43 ++ doc/api/features.md | 2 +- doc/api/graphql/reference/index.md | 489 +++++++++++++++++- doc/development/integrations/secure.md | 38 +- doc/user/admin_area/credentials_inventory.md | 8 +- .../credentials_inventory_gpg_keys_v13_10.png | Bin 20600 -> 0 bytes .../credentials_inventory_gpg_keys_v14_9.png | Bin 0 -> 16956 bytes ...inventory_personal_access_tokens_v14_9.png | Bin 0 -> 34445 bytes ..._inventory_project_access_tokens_v14_9.png | Bin 0 -> 19849 bytes .../credentials_inventory_ssh_keys_v13_5.png | Bin 26813 -> 0 bytes .../credentials_inventory_ssh_keys_v14_9.png | Bin 0 -> 29612 bytes .../dependency_scanning/index.md | 8 +- doc/user/application_security/index.md | 2 + doc/user/group/index.md | 2 +- lib/gitlab/pagination/offset_pagination.rb | 2 +- lib/gitlab/wiki_pages/front_matter_parser.rb | 18 +- qa/Gemfile | 1 - qa/Gemfile.lock | 15 - qa/qa/tools/test_resources_handler.rb | 31 +- .../merge_requests/assignee_type_spec.rb | 7 + .../types/merge_requests/author_type_spec.rb | 7 + .../merge_requests/participant_type_spec.rb | 7 + .../merge_requests/reviewer_type_spec.rb | 52 +- .../wiki_pages/front_matter_parser_spec.rb | 29 +- spec/models/wiki_page_spec.rb | 57 +- ...quest_interactions_type_shared_examples.rb | 57 ++ 34 files changed, 712 insertions(+), 212 deletions(-) create mode 100644 app/graphql/types/merge_requests/author_type.rb create mode 100644 app/graphql/types/merge_requests/participant_type.rb delete mode 100644 config/feature_flags/development/wiki_front_matter.yml delete mode 100644 doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png create mode 100644 doc/user/admin_area/img/credentials_inventory_gpg_keys_v14_9.png create mode 100644 doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png create mode 100644 doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png delete mode 100644 doc/user/admin_area/img/credentials_inventory_ssh_keys_v13_5.png create mode 100644 doc/user/admin_area/img/credentials_inventory_ssh_keys_v14_9.png create mode 100644 spec/graphql/types/merge_requests/assignee_type_spec.rb create mode 100644 spec/graphql/types/merge_requests/author_type_spec.rb create mode 100644 spec/graphql/types/merge_requests/participant_type_spec.rb create mode 100644 spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index 95b7438460d..af198d03c3f 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -137,7 +137,7 @@ module Types null: true, complexity: 5, description: 'Assignees of the merge request.' - field :author, Types::UserType, null: true, + field :author, Types::MergeRequests::AuthorType, null: true, description: 'User who created this merge request.' field :discussion_locked, GraphQL::Types::Boolean, description: 'Indicates if comments on the merge request are locked to members only.', @@ -150,7 +150,7 @@ module Types description: 'Labels of the merge request.' field :milestone, Types::MilestoneType, null: true, description: 'Milestone of the merge request.' - field :participants, Types::UserType.connection_type, null: true, complexity: 15, + field :participants, Types::MergeRequests::ParticipantType.connection_type, null: true, complexity: 15, description: 'Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes.', resolver: Resolvers::Users::ParticipantsResolver field :reference, GraphQL::Types::String, null: false, method: :to_reference, diff --git a/app/graphql/types/merge_requests/assignee_type.rb b/app/graphql/types/merge_requests/assignee_type.rb index 24321d057a3..a0ba74597ba 100644 --- a/app/graphql/types/merge_requests/assignee_type.rb +++ b/app/graphql/types/merge_requests/assignee_type.rb @@ -6,7 +6,6 @@ module Types graphql_name 'MergeRequestAssignee' description 'A user assigned to a merge request.' - include FindClosest include ::Types::MergeRequests::InteractsWithMergeRequest authorize :read_user diff --git a/app/graphql/types/merge_requests/author_type.rb b/app/graphql/types/merge_requests/author_type.rb new file mode 100644 index 00000000000..56ad3190547 --- /dev/null +++ b/app/graphql/types/merge_requests/author_type.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module MergeRequests + class AuthorType < ::Types::UserType + graphql_name 'MergeRequestAuthor' + description 'The author of the merge request.' + + include ::Types::MergeRequests::InteractsWithMergeRequest + + authorize :read_user + end + end +end diff --git a/app/graphql/types/merge_requests/participant_type.rb b/app/graphql/types/merge_requests/participant_type.rb new file mode 100644 index 00000000000..86d627097b2 --- /dev/null +++ b/app/graphql/types/merge_requests/participant_type.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Types + module MergeRequests + class ParticipantType < ::Types::UserType + graphql_name 'MergeRequestParticipant' + description 'A user participating in a merge request.' + + include ::Types::MergeRequests::InteractsWithMergeRequest + + authorize :read_user + end + end +end diff --git a/app/graphql/types/merge_requests/reviewer_type.rb b/app/graphql/types/merge_requests/reviewer_type.rb index 11f7ceaf461..e5bc5812816 100644 --- a/app/graphql/types/merge_requests/reviewer_type.rb +++ b/app/graphql/types/merge_requests/reviewer_type.rb @@ -6,7 +6,6 @@ module Types graphql_name 'MergeRequestReviewer' description 'A user assigned to a merge request as a reviewer.' - include FindClosest include ::Types::MergeRequests::InteractsWithMergeRequest authorize :read_user diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index de9497a2f40..803b9781ac4 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -316,7 +316,6 @@ class WikiPage end def update_front_matter(attrs) - return unless Gitlab::WikiPages::FrontMatterParser.enabled?(container) return unless attrs.has_key?(:front_matter) fm_yaml = serialize_front_matter(attrs[:front_matter]) @@ -327,7 +326,7 @@ class WikiPage def parsed_content strong_memoize(:parsed_content) do - Gitlab::WikiPages::FrontMatterParser.new(raw_content, container).parse + Gitlab::WikiPages::FrontMatterParser.new(raw_content).parse end end diff --git a/config/feature_flags/development/wiki_front_matter.yml b/config/feature_flags/development/wiki_front_matter.yml deleted file mode 100644 index 39196440d17..00000000000 --- a/config/feature_flags/development/wiki_front_matter.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: wiki_front_matter -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/27706 -rollout_issue_url: -milestone: '12.10' -type: development -group: group::editor -default_enabled: false diff --git a/config/feature_flags/ops/api_kaminari_count_with_limit.yml b/config/feature_flags/ops/api_kaminari_count_with_limit.yml index a55e3e67710..c11c6758189 100644 --- a/config/feature_flags/ops/api_kaminari_count_with_limit.yml +++ b/config/feature_flags/ops/api_kaminari_count_with_limit.yml @@ -1,8 +1,8 @@ --- name: api_kaminari_count_with_limit introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931 -rollout_issue_url: +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/353077 milestone: '11.8' type: ops group: group::integrations -default_enabled: false +default_enabled: true diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md index 58d2953fa7a..544a5973052 100644 --- a/doc/administration/job_artifacts.md +++ b/doc/administration/job_artifacts.md @@ -414,6 +414,37 @@ space, and in some cases, manually delete job artifacts to reclaim disk space. One possible first step is to [clean up _orphaned_ artifact files](../raketasks/cleanup.md#remove-orphan-artifact-files). +#### List projects and builds with artifacts with a specific expiration (or no expiration) + +Using a [Rails console](operations/rails_console.md), you can find projects that have job artifacts with either: + +- No expiration date. +- An expiration date more than 7 days in the future. + +Similar to [deleting artifacts](#delete-job-artifacts-from-jobs-completed-before-a-specific-date), use the following example time frames +and alter them as needed: + +- `7.days.from_now` +- `10.days.from_now` +- `2.weeks.from_now` +- `3.months.from_now` + +Each of the following scripts also limits the search to 50 results with `.limit(50)`, but this number can also be changed as needed: + +```ruby +# Find builds & projects with artifacts that never expire +builds_with_artifacts_that_never_expire = Ci::Build.with_downloadable_artifacts.where(artifacts_expire_at: nil).limit(50) +builds_with_artifacts_that_never_expire.find_each do |build| + puts "Build with id #{build.id} has artifacts that don't expire and belongs to project #{build.project.full_path}" +end + +# Find builds & projects with artifacts that expire after 7 days from today +builds_with_artifacts_that_expire_in_a_week = Ci::Build.with_downloadable_artifacts.where('artifacts_expire_at > ?', 7.days.from_now).limit(50) +builds_with_artifacts_that_expire_in_a_week.find_each do |build| + puts "Build with id #{build.id} has artifacts that expire at #{build.artifacts_expire_at} and belongs to project #{build.project.full_path}" +end +``` + #### List projects by total size of job artifacts stored List the top 20 projects, sorted by the total size of job artifacts stored, by @@ -599,3 +630,15 @@ review: ``` In both cases, you might need to add `region` to the job artifact [object storage configuration](#connection-settings). + +### Job artifact upload fails with `500 Internal Server Error (Missing file)` + +Bucket names that include folder paths are not supported with [consolidated object storage](object_storage.md#consolidated-object-storage-configuration). +For example, `bucket/path`. If a bucket name has a path in it, you might receive an error similar to: + +```plaintext +WARNING: Uploading artifacts as "archive" to coordinator... POST https://gitlab.example.com/api/v4/jobs/job_id/artifacts?artifact_format=zip&artifact_type=archive&expire_in=1+day: 500 Internal Server Error (Missing file) +FATAL: invalid argument +``` + +If a job artifact fails to upload with the above error when using consolidated object storage, make sure you are [using separate buckets](object_storage.md#use-separate-buckets) for each data type. diff --git a/doc/api/features.md b/doc/api/features.md index 30efacb1d00..593e4adedd7 100644 --- a/doc/api/features.md +++ b/doc/api/features.md @@ -95,7 +95,7 @@ Example response: "milestone": "11.8", "type": "ops", "group": "group::ecosystem", - "default_enabled": false + "default_enabled": true }, { "name": "marginalia", diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 16d4a8a85be..8f89deb5b62 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -7113,6 +7113,29 @@ The edge type for [`MergeRequest`](#mergerequest). | `cursor` | [`String!`](#string) | A cursor for use in pagination. | | `node` | [`MergeRequest`](#mergerequest) | The item at the end of the edge. | +#### `MergeRequestParticipantConnection` + +The connection type for [`MergeRequestParticipant`](#mergerequestparticipant). + +##### Fields + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `edges` | [`[MergeRequestParticipantEdge]`](#mergerequestparticipantedge) | A list of edges. | +| `nodes` | [`[MergeRequestParticipant]`](#mergerequestparticipant) | A list of nodes. | +| `pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. | + +#### `MergeRequestParticipantEdge` + +The edge type for [`MergeRequestParticipant`](#mergerequestparticipant). + +##### Fields + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `cursor` | [`String!`](#string) | A cursor for use in pagination. | +| `node` | [`MergeRequestParticipant`](#mergerequestparticipant) | The item at the end of the edge. | + #### `MergeRequestReviewerConnection` The connection type for [`MergeRequestReviewer`](#mergerequestreviewer). @@ -12362,7 +12385,7 @@ Maven metadata. | `approved` | [`Boolean!`](#boolean) | Indicates if the merge request has all the required approvals. Returns true if no required approvals are configured. | | `approvedBy` | [`UserCoreConnection`](#usercoreconnection) | Users who approved the merge request. (see [Connections](#connections)) | | `assignees` | [`MergeRequestAssigneeConnection`](#mergerequestassigneeconnection) | Assignees of the merge request. (see [Connections](#connections)) | -| `author` | [`UserCore`](#usercore) | User who created this merge request. | +| `author` | [`MergeRequestAuthor`](#mergerequestauthor) | User who created this merge request. | | `autoMergeEnabled` | [`Boolean!`](#boolean) | Indicates if auto merge is enabled for the merge request. | | `autoMergeStrategy` | [`String`](#string) | Selected auto merge strategy. | | `availableAutoMergeStrategies` | [`[String!]`](#string) | Array of available auto merge strategies. | @@ -12408,7 +12431,7 @@ Maven metadata. | `mergedAt` | [`Time`](#time) | Timestamp of when the merge request was merged, null if not merged. | | `milestone` | [`Milestone`](#milestone) | Milestone of the merge request. | | `notes` | [`NoteConnection!`](#noteconnection) | All notes on this noteable. (see [Connections](#connections)) | -| `participants` | [`UserCoreConnection`](#usercoreconnection) | Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes. (see [Connections](#connections)) | +| `participants` | [`MergeRequestParticipantConnection`](#mergerequestparticipantconnection) | Participants in the merge request. This includes the author, assignees, reviewers, and users mentioned in notes. (see [Connections](#connections)) | | `project` | [`Project!`](#project) | Alias for target_project. | | `projectId` | [`Int!`](#int) | ID of the merge request project. | | `rebaseCommitSha` | [`String`](#string) | Rebase commit SHA of the merge request. | @@ -12750,6 +12773,236 @@ four standard [pagination arguments](#connection-pagination-arguments): | `state` | [`[TodoStateEnum!]`](#todostateenum) | State of the todo. | | `type` | [`[TodoTargetEnum!]`](#todotargetenum) | Type of the todo. | +### `MergeRequestAuthor` + +The author of the merge request. + +#### Fields + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `avatarUrl` | [`String`](#string) | URL of the user's avatar. | +| `bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. | +| `callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) | +| `email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). | +| `gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. | +| `groupCount` | [`Int`](#int) | Group count for the user. | +| `groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) | +| `id` | [`ID!`](#id) | ID of the user. | +| `location` | [`String`](#string) | Location of the user. | +| `mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. | +| `name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. | +| `namespace` | [`Namespace`](#namespace) | Personal namespace of the user. | +| `preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. | +| `profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. | +| `projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) | +| `publicEmail` | [`String`](#string) | User's public email. | +| `savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) | +| `state` | [`UserState!`](#userstate) | State of the user. | +| `status` | [`UserStatus`](#userstatus) | User status. | +| `userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. | +| `username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. | +| `webPath` | [`String!`](#string) | Web path of the user. | +| `webUrl` | [`String!`](#string) | Web URL of the user. | + +#### Fields with arguments + +##### `MergeRequestAuthor.assignedMergeRequests` + +Merge requests assigned to the user. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `authorUsername` | [`String`](#string) | Username of the author. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `reviewerUsername` | [`String`](#string) | Username of the reviewer. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestAuthor.authoredMergeRequests` + +Merge requests authored by the user. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `assigneeUsername` | [`String`](#string) | Username of the assignee. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `reviewerUsername` | [`String`](#string) | Username of the reviewer. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestAuthor.groups` + +Groups where the user has access. + +Returns [`GroupConnection`](#groupconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `permissionScope` | [`GroupPermission`](#grouppermission) | Filter by permissions the user has on groups. | +| `search` | [`String`](#string) | Search by group name or path. | + +##### `MergeRequestAuthor.reviewRequestedMergeRequests` + +Merge requests assigned to the user for review. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `assigneeUsername` | [`String`](#string) | Username of the assignee. | +| `authorUsername` | [`String`](#string) | Username of the author. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestAuthor.snippets` + +Snippets authored by the user. + +Returns [`SnippetConnection`](#snippetconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `ids` | [`[SnippetID!]`](#snippetid) | Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`. | +| `type` | [`TypeEnum`](#typeenum) | Type of snippet. | +| `visibility` | [`VisibilityScopesEnum`](#visibilityscopesenum) | Visibility of the snippet. | + +##### `MergeRequestAuthor.starredProjects` + +Projects starred by the user. + +Returns [`ProjectConnection`](#projectconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `search` | [`String`](#string) | Search query. | + +##### `MergeRequestAuthor.timelogs` + +Time logged by the user. + +Returns [`TimelogConnection`](#timelogconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `endDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or before endDate. | +| `endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. | +| `groupId` | [`GroupID`](#groupid) | List timelogs for a group. | +| `projectId` | [`ProjectID`](#projectid) | List timelogs for a project. | +| `startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. | +| `startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. | +| `username` | [`String`](#string) | List timelogs for a user. | + +##### `MergeRequestAuthor.todos` + +To-do items of the user. + +Returns [`TodoConnection`](#todoconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `action` | [`[TodoActionEnum!]`](#todoactionenum) | Action to be filtered. | +| `authorId` | [`[ID!]`](#id) | ID of an author. | +| `groupId` | [`[ID!]`](#id) | ID of a group. | +| `projectId` | [`[ID!]`](#id) | ID of a project. | +| `state` | [`[TodoStateEnum!]`](#todostateenum) | State of the todo. | +| `type` | [`[TodoTargetEnum!]`](#todotargetenum) | Type of the todo. | + ### `MergeRequestDiffRegistry` Represents the Geo sync and verification state of a Merge Request diff. @@ -12767,6 +13020,236 @@ Represents the Geo sync and verification state of a Merge Request diff. | `retryCount` | [`Int`](#int) | Number of consecutive failed sync attempts of the MergeRequestDiffRegistry. | | `state` | [`RegistryState`](#registrystate) | Sync state of the MergeRequestDiffRegistry. | +### `MergeRequestParticipant` + +A user participating in a merge request. + +#### Fields + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `avatarUrl` | [`String`](#string) | URL of the user's avatar. | +| `bot` | [`Boolean!`](#boolean) | Indicates if the user is a bot. | +| `callouts` | [`UserCalloutConnection`](#usercalloutconnection) | User callouts that belong to the user. (see [Connections](#connections)) | +| `email` **{warning-solid}** | [`String`](#string) | **Deprecated** in 13.7. This was renamed. Use: [`User.publicEmail`](#userpublicemail). | +| `gitpodEnabled` | [`Boolean`](#boolean) | Whether Gitpod is enabled at the user level. | +| `groupCount` | [`Int`](#int) | Group count for the user. | +| `groupMemberships` | [`GroupMemberConnection`](#groupmemberconnection) | Group memberships of the user. (see [Connections](#connections)) | +| `id` | [`ID!`](#id) | ID of the user. | +| `location` | [`String`](#string) | Location of the user. | +| `mergeRequestInteraction` | [`UserMergeRequestInteraction`](#usermergerequestinteraction) | Details of this user's interactions with the merge request. | +| `name` | [`String!`](#string) | Human-readable name of the user. Returns `****` if the user is a project bot and the requester does not have permission to view the project. | +| `namespace` | [`Namespace`](#namespace) | Personal namespace of the user. | +| `preferencesGitpodPath` | [`String`](#string) | Web path to the Gitpod section within user preferences. | +| `profileEnableGitpodPath` | [`String`](#string) | Web path to enable Gitpod for the user. | +| `projectMemberships` | [`ProjectMemberConnection`](#projectmemberconnection) | Project memberships of the user. (see [Connections](#connections)) | +| `publicEmail` | [`String`](#string) | User's public email. | +| `savedReplies` | [`SavedReplyConnection`](#savedreplyconnection) | Saved replies authored by the user. (see [Connections](#connections)) | +| `state` | [`UserState!`](#userstate) | State of the user. | +| `status` | [`UserStatus`](#userstatus) | User status. | +| `userPermissions` | [`UserPermissions!`](#userpermissions) | Permissions for the current user on the resource. | +| `username` | [`String!`](#string) | Username of the user. Unique within this instance of GitLab. | +| `webPath` | [`String!`](#string) | Web path of the user. | +| `webUrl` | [`String!`](#string) | Web URL of the user. | + +#### Fields with arguments + +##### `MergeRequestParticipant.assignedMergeRequests` + +Merge requests assigned to the user. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `authorUsername` | [`String`](#string) | Username of the author. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `reviewerUsername` | [`String`](#string) | Username of the reviewer. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestParticipant.authoredMergeRequests` + +Merge requests authored by the user. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `assigneeUsername` | [`String`](#string) | Username of the assignee. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `reviewerUsername` | [`String`](#string) | Username of the reviewer. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestParticipant.groups` + +Groups where the user has access. + +Returns [`GroupConnection`](#groupconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `permissionScope` | [`GroupPermission`](#grouppermission) | Filter by permissions the user has on groups. | +| `search` | [`String`](#string) | Search by group name or path. | + +##### `MergeRequestParticipant.reviewRequestedMergeRequests` + +Merge requests assigned to the user for review. + +Returns [`MergeRequestConnection`](#mergerequestconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `assigneeUsername` | [`String`](#string) | Username of the assignee. | +| `authorUsername` | [`String`](#string) | Username of the author. | +| `createdAfter` | [`Time`](#time) | Merge requests created after this timestamp. | +| `createdBefore` | [`Time`](#time) | Merge requests created before this timestamp. | +| `draft` | [`Boolean`](#boolean) | Limit result to draft merge requests. | +| `iids` | [`[String!]`](#string) | Array of IIDs of merge requests, for example `[1, 2]`. | +| `labels` | [`[String!]`](#string) | Array of label names. All resolved merge requests will have all of these labels. | +| `mergedAfter` | [`Time`](#time) | Merge requests merged after this date. | +| `mergedBefore` | [`Time`](#time) | Merge requests merged before this date. | +| `milestoneTitle` | [`String`](#string) | Title of the milestone. | +| `not` | [`MergeRequestsResolverNegatedParams`](#mergerequestsresolvernegatedparams) | List of negated arguments. Warning: this argument is experimental and a subject to change in future. | +| `projectId` | [`ProjectID`](#projectid) | The global ID of the project the authored merge requests should be in. Incompatible with projectPath. | +| `projectPath` | [`String`](#string) | The full-path of the project the authored merge requests should be in. Incompatible with projectId. | +| `sort` | [`MergeRequestSort`](#mergerequestsort) | Sort merge requests by this criteria. | +| `sourceBranches` | [`[String!]`](#string) | Array of source branch names. All resolved merge requests will have one of these branches as their source. | +| `state` | [`MergeRequestState`](#mergerequeststate) | Merge request state. If provided, all resolved merge requests will have this state. | +| `targetBranches` | [`[String!]`](#string) | Array of target branch names. All resolved merge requests will have one of these branches as their target. | +| `updatedAfter` | [`Time`](#time) | Merge requests updated after this timestamp. | +| `updatedBefore` | [`Time`](#time) | Merge requests updated before this timestamp. | + +##### `MergeRequestParticipant.snippets` + +Snippets authored by the user. + +Returns [`SnippetConnection`](#snippetconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `ids` | [`[SnippetID!]`](#snippetid) | Array of global snippet IDs. For example, `gid://gitlab/ProjectSnippet/1`. | +| `type` | [`TypeEnum`](#typeenum) | Type of snippet. | +| `visibility` | [`VisibilityScopesEnum`](#visibilityscopesenum) | Visibility of the snippet. | + +##### `MergeRequestParticipant.starredProjects` + +Projects starred by the user. + +Returns [`ProjectConnection`](#projectconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `search` | [`String`](#string) | Search query. | + +##### `MergeRequestParticipant.timelogs` + +Time logged by the user. + +Returns [`TimelogConnection`](#timelogconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `endDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or before endDate. | +| `endTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or before endTime. | +| `groupId` | [`GroupID`](#groupid) | List timelogs for a group. | +| `projectId` | [`ProjectID`](#projectid) | List timelogs for a project. | +| `startDate` | [`Time`](#time) | List timelogs within a date range where the logged date is equal to or after startDate. | +| `startTime` | [`Time`](#time) | List timelogs within a time range where the logged time is equal to or after startTime. | +| `username` | [`String`](#string) | List timelogs for a user. | + +##### `MergeRequestParticipant.todos` + +To-do items of the user. + +Returns [`TodoConnection`](#todoconnection). + +This field returns a [connection](#connections). It accepts the +four standard [pagination arguments](#connection-pagination-arguments): +`before: String`, `after: String`, `first: Int`, `last: Int`. + +###### Arguments + +| Name | Type | Description | +| ---- | ---- | ----------- | +| `action` | [`[TodoActionEnum!]`](#todoactionenum) | Action to be filtered. | +| `authorId` | [`[ID!]`](#id) | ID of an author. | +| `groupId` | [`[ID!]`](#id) | ID of a group. | +| `projectId` | [`[ID!]`](#id) | ID of a project. | +| `state` | [`[TodoStateEnum!]`](#todostateenum) | State of the todo. | +| `type` | [`[TodoTargetEnum!]`](#todotargetenum) | Type of the todo. | + ### `MergeRequestPermissions` Check permissions for the current user on a merge request. @@ -19668,6 +20151,8 @@ Representation of a GitLab user. Implementations: - [`MergeRequestAssignee`](#mergerequestassignee) +- [`MergeRequestAuthor`](#mergerequestauthor) +- [`MergeRequestParticipant`](#mergerequestparticipant) - [`MergeRequestReviewer`](#mergerequestreviewer) - [`UserCore`](#usercore) diff --git a/doc/development/integrations/secure.md b/doc/development/integrations/secure.md index 2205d11fd18..11fb06bd128 100644 --- a/doc/development/integrations/secure.md +++ b/doc/development/integrations/secure.md @@ -329,18 +329,40 @@ You can find the schemas for these scanners here: ### Enable report validation -In GitLab 14.10 and later, report validation against the schemas is enabled. To enable report validation for versions earlier than 14.10, -set [`VALIDATE_SCHEMA`](../../user/application_security/#enable-security-report-validation) to -`"true"`. +> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/354928) in GitLab 14.9, and planned for removal in GitLab 15.0. +DISCLAIMER: +This page contains information related to upcoming products, features, and functionality. +It is important to note that the information presented is for informational purposes only. +Please do not rely on this information for purchasing or planning purposes. +As with all projects, the items mentioned on this page are subject to change or delay. +The development, release, and timing of any products, features, or functionality remain at the +sole discretion of GitLab Inc. +In GitLab 15.0 and later, report validation is enabled and enforced. Reports that fail validation +are not ingested, and an error message displays on the corresponding pipeline. -Reports that don't pass validation are not ingested by GitLab, and an error message -displays on the corresponding pipeline. +In GitLab 14.10 and later, report validation against the schemas is enabled but not enforced. +Reports that fail validation are ingested but display a warning in the pipeline security tab. -You should ensure that reports generated by the scanner pass validation against the schema version -declared in your reports. GitLab uses the +To enforce report validation for GitLab version 14.10 and earlier, set +[`VALIDATE_SCHEMA`](../../user/application_security/#enable-security-report-validation) to `"true"`. + +### Report validation + +You must ensure that reports generated by the scanner pass validation against the schema version +declared in your reports. Reports that don't pass validation are not ingested by GitLab, and an +error message displays on the corresponding pipeline. + +Reports that use a deprecated version of the secure report schema are ingested but cause a warning +message to display on the corresponding pipeline. If you see this warning, update your +analyzer to use the latest available schemas. + +After the deprecation period for a schema version, the file is removed from GitLab. Reports that +declare removed versions are rejected, and an error message displays on the corresponding pipeline. + +GitLab uses the [`json_schemer`](https://www.rubydoc.info/gems/json_schemer) gem to perform validation. -Ongoing improvements to report validation is tracked [in this epic](https://gitlab.com/groups/gitlab-org/-/epics/6968). +Ongoing improvements to report validation are tracked [in this epic](https://gitlab.com/groups/gitlab-org/-/epics/6968). In the meantime, you can see which versions are supported in the [source code](https://gitlab.com/gitlab-org/gitlab/-/blob/08dd756429731a0cca1e27ca9d59eea226398a7d/lib/gitlab/ci/parsers/security/validators/schema_validator.rb#L9-27). diff --git a/doc/user/admin_area/credentials_inventory.md b/doc/user/admin_area/credentials_inventory.md index 5190dd810ab..21ac0f720ec 100644 --- a/doc/user/admin_area/credentials_inventory.md +++ b/doc/user/admin_area/credentials_inventory.md @@ -51,6 +51,8 @@ If you see a **Revoke** button, you can revoke that user's PAT. Whether you see When a PAT is revoked from the credentials inventory, the instance notifies the user by email. +![Credentials inventory page - Personal access tokens](img/credentials_inventory_personal_access_tokens_v14_9.png) + ## Revoke a user's project access token > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/243833) in GitLab 14.8. @@ -60,6 +62,8 @@ The **Revoke** button next to a project access token can be selected to revoke t - Revoke the token project access token. - Enqueue a background worker to delete the project bot user. +![Credentials inventory page - Project access tokens](img/credentials_inventory_project_access_tokens_v14_9.png) + ## Delete a user's SSH key > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/225248) in GitLab 13.5. @@ -67,7 +71,7 @@ The **Revoke** button next to a project access token can be selected to revoke t You can **Delete** a user's SSH key by navigating to the credentials inventory's SSH Keys tab. The instance then notifies the user. -![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v13_5.png) +![Credentials inventory page - SSH keys](img/credentials_inventory_ssh_keys_v14_9.png) ## Review existing GPG keys @@ -81,4 +85,4 @@ credentials inventory GPG Keys tab, as well as the following properties: - The ID of the GPG key. - Whether the GPG key is [verified or unverified](../project/repository/gpg_signed_commits/index.md) -![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v13_10.png) +![Credentials inventory page - GPG keys](img/credentials_inventory_gpg_keys_v14_9.png) diff --git a/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png b/doc/user/admin_area/img/credentials_inventory_gpg_keys_v13_10.png deleted file mode 100644 index a88d80a72b65f16212781d99bb4b2b5e6b8c5fed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20600 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%0D~aS7C^nFjdnd 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 KRE@;vp#KBmmXW{! literal 0 HcmV?d00001 diff --git a/doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png b/doc/user/admin_area/img/credentials_inventory_personal_access_tokens_v14_9.png new file mode 100644 index 0000000000000000000000000000000000000000..254d520d538cf9d178ce4c3e08a267c237b014c6 GIT binary patch literal 34445 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 Hl+XkKk61?c literal 0 HcmV?d00001 diff --git a/doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png b/doc/user/admin_area/img/credentials_inventory_project_access_tokens_v14_9.png new file mode 100644 index 0000000000000000000000000000000000000000..ae204ac09effbddcd3b7463325d266c19e88ee20 GIT binary patch literal 19849 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%0D79{C2j)>oEbyjSR#3^wI2Oq^ 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 literal 0 HcmV?d00001 diff --git a/doc/user/admin_area/img/credentials_inventory_ssh_keys_v13_5.png b/doc/user/admin_area/img/credentials_inventory_ssh_keys_v13_5.png deleted file mode 100644 index f5edf513bbff2c8c78c9a5eac87da185babd0da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26813 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 yUqy1o?3x`mN`vgH<16#pV|wGpP&lvkt>cW^eN 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 literal 0 HcmV?d00001 diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md index b98312d5b3c..881c1fb8c78 100644 --- a/doc/user/application_security/dependency_scanning/index.md +++ b/doc/user/application_security/dependency_scanning/index.md @@ -995,7 +995,13 @@ BUNDLER_AUDIT_ADVISORY_DB_REF_NAME: "master" BUNDLER_AUDIT_ADVISORY_DB_URL: "gitlab.example.com/ruby-advisory-db.git" ``` -#### Python (setup tools) +#### Python (pip) + +If you need to install Python packages before the analyzer runs, you should use `pip install --user` in the `before_script` of the scanning job. The `--user` flag causes project dependencies to be installed in the user directory. If you do not pass the `--user` option, packages are installed globally, and they are not scanned and don't show up when listing project dependencies. + +#### Python (setuptools) + +If you need to install Python packages before the analyzer runs, you should use `python setup.py install --user` in the `before_script` of the scanning job. The `--user` flag causes project dependencies to be installed in the user directory. If you do not pass the `--user` option, packages are installed globally, and they are not scanned and don't show up when listing project dependencies. When using self-signed certificates for your private PyPi repository, no extra job configuration (aside from the template `.gitlab-ci.yml` above) is needed. However, you must update your `setup.py` to diff --git a/doc/user/application_security/index.md b/doc/user/application_security/index.md index e76497ab5de..ff548f1d29f 100644 --- a/doc/user/application_security/index.md +++ b/doc/user/application_security/index.md @@ -395,6 +395,8 @@ any report artifacts that failed validation. ### Enable security report validation +> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/354928) in GitLab 14.9, and planned for removal in GitLab 15.0. + To enable report artifacts validation, set the `VALIDATE_SCHEMA` environment variable to `"true"` for the desired jobs in the `.gitlab-ci.yml` file. diff --git a/doc/user/group/index.md b/doc/user/group/index.md index 00fa51eddc9..86c33933144 100644 --- a/doc/user/group/index.md +++ b/doc/user/group/index.md @@ -575,7 +575,7 @@ To prevent members from being added to projects in a group: 1. Go to the group's **Settings > General** page. 1. Expand the **Permissions and group features** section. -1. Under **Member lock**, select **Prevent adding new members to project membership within this group**. +1. Under **Membership**, select **Prevent adding new members to projects within this group**. 1. Select **Save changes**. All users who previously had permissions can no longer add members to a group. diff --git a/lib/gitlab/pagination/offset_pagination.rb b/lib/gitlab/pagination/offset_pagination.rb index 8cb959769ee..fca75d1fe01 100644 --- a/lib/gitlab/pagination/offset_pagination.rb +++ b/lib/gitlab/pagination/offset_pagination.rb @@ -27,7 +27,7 @@ module Gitlab end return pagination_data unless pagination_data.is_a?(ActiveRecord::Relation) - return pagination_data unless Feature.enabled?(:api_kaminari_count_with_limit, type: :ops) + return pagination_data unless Feature.enabled?(:api_kaminari_count_with_limit, type: :ops, default_enabled: :yaml) limited_total_count = pagination_data.total_count_with_limit if limited_total_count > Kaminari::ActiveRecordRelationMethods::MAX_COUNT_LIMIT diff --git a/lib/gitlab/wiki_pages/front_matter_parser.rb b/lib/gitlab/wiki_pages/front_matter_parser.rb index 071b0dde619..ee30fa907f4 100644 --- a/lib/gitlab/wiki_pages/front_matter_parser.rb +++ b/lib/gitlab/wiki_pages/front_matter_parser.rb @@ -3,8 +3,6 @@ module Gitlab module WikiPages class FrontMatterParser - FEATURE_FLAG = :wiki_front_matter - # We limit the maximum length of text we are prepared to parse as YAML, to # avoid exploitations and attempts to consume memory and CPU. We allow for: # - a title line @@ -30,18 +28,12 @@ module Gitlab end # @param [String] wiki_content - # @param [FeatureGate] feature_gate The scope for feature availability - def initialize(wiki_content, feature_gate) + def initialize(wiki_content) @wiki_content = wiki_content - @feature_gate = feature_gate - end - - def self.enabled?(gate = nil) - Feature.enabled?(FEATURE_FLAG, gate) end def parse - return empty_result unless enabled? && wiki_content.present? + return empty_result unless wiki_content.present? return empty_result(block.error) unless block.valid? Result.new(front_matter: block.data, content: strip_front_matter_block) @@ -94,16 +86,12 @@ module Gitlab private - attr_reader :wiki_content, :feature_gate + attr_reader :wiki_content def empty_result(reason = nil, error = nil) Result.new(content: wiki_content, reason: reason, error: error) end - def enabled? - self.class.enabled?(feature_gate) - end - def block @block ||= parse_front_matter_block end diff --git a/qa/Gemfile b/qa/Gemfile index 8dee3fb9326..05acab5653f 100644 --- a/qa/Gemfile +++ b/qa/Gemfile @@ -29,7 +29,6 @@ gem 'influxdb-client', '~> 1.17' gem 'terminal-table', '~> 3.0.0', require: false gem 'slack-notifier', '~> 2.4', require: false gem 'fog-google', '~> 1.17', require: false -gem 'google-cloud-storage', '~> 1.36', require: false gem 'confiner', '~> 0.2' diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock index ac683ad549d..369ab0860ed 100644 --- a/qa/Gemfile.lock +++ b/qa/Gemfile.lock @@ -65,8 +65,6 @@ GEM deprecation_toolkit (1.5.1) activesupport (>= 4.2) diff-lcs (1.3) - digest-crc (0.6.4) - rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) equalizer (0.0.11) @@ -152,20 +150,8 @@ GEM google-apis-core (>= 0.4, < 2.a) google-apis-storage_v1 (0.9.0) google-apis-core (>= 0.4, < 2.a) - google-cloud-core (1.6.0) - google-cloud-env (~> 1.0) - google-cloud-errors (~> 1.0) google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.2.0) - google-cloud-storage (1.36.1) - addressable (~> 2.8) - digest-crc (~> 0.4) - google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) - google-cloud-core (~> 1.6) - googleauth (>= 0.16.2, < 2.a) - mini_mime (~> 1.0) googleauth (1.1.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) @@ -382,7 +368,6 @@ DEPENDENCIES faker (~> 2.19, >= 2.19.0) fog-google (~> 1.17) gitlab-qa - google-cloud-storage (~> 1.36) influxdb-client (~> 1.17) knapsack (~> 4.0) octokit (~> 4.21) diff --git a/qa/qa/tools/test_resources_handler.rb b/qa/qa/tools/test_resources_handler.rb index c298be25160..97b983913b4 100644 --- a/qa/qa/tools/test_resources_handler.rb +++ b/qa/qa/tools/test_resources_handler.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "google/cloud/storage" +require "fog/google" # This script handles resources created during E2E test runs # @@ -67,7 +67,7 @@ module QA files.each do |file| file_name = "#{environment_name}/#{file.split('/').last}" Runtime::Logger.info("Uploading #{file_name}...") - gcs_bucket.create_file(file, file_name) + gcs_storage.put_object(BUCKET, file_name, File.read(file)) end puts "\nDone" @@ -76,17 +76,20 @@ module QA # Download files from GCS bucket by environment name # Delete the files afterward def download(environment_name) - files_list = gcs_bucket.files(prefix: "#{environment_name}") + files_list = gcs_storage.list_objects(BUCKET, prefix: environment_name).items.each_with_object([]) do |obj, arr| + arr << obj.name + end return puts "\nNothing to download!" if files_list.empty? - files_list.each do |file| - local_path = "tmp/#{file.name.split('/').last}" - Runtime::Logger.info("Downloading #{file.name} to #{local_path}") - file.download(local_path) + files_list.each do |file_name| + local_path = "tmp/#{file_name.split('/').last}" + Runtime::Logger.info("Downloading #{file_name} to #{local_path}") + file = gcs_storage.get_object(BUCKET, file_name) + File.write(local_path, file[:body]) - Runtime::Logger.info("Deleting #{file.name} from bucket") - file.delete + Runtime::Logger.info("Deleting #{file_name} from bucket") + gcs_storage.delete_object(BUCKET, file_name) end puts "\nDone" @@ -158,18 +161,14 @@ module QA end def gcs_storage - @gcs_storage ||= Google::Cloud::Storage.new( - project_id: PROJECT, - credentials: json_key + @gcs_storage ||= Fog::Storage::Google.new( + google_project: PROJECT, + **(File.exist?(json_key) ? { google_json_key_location: json_key } : { google_json_key_string: json_key }) ) rescue StandardError => e abort("\nThere might be something wrong with the JSON key file - [ERROR] #{e}") end - def gcs_bucket - @gcs_bucket ||= gcs_storage.bucket(BUCKET, skip_lookup: true) - end - # Path to GCS service account json key file # Or the content of the key file as a hash def json_key diff --git a/spec/graphql/types/merge_requests/assignee_type_spec.rb b/spec/graphql/types/merge_requests/assignee_type_spec.rb new file mode 100644 index 00000000000..d67d20860b2 --- /dev/null +++ b/spec/graphql/types/merge_requests/assignee_type_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['MergeRequestAssignee'] do + it_behaves_like "a user type with merge request interaction type" +end diff --git a/spec/graphql/types/merge_requests/author_type_spec.rb b/spec/graphql/types/merge_requests/author_type_spec.rb new file mode 100644 index 00000000000..2a5a31f210c --- /dev/null +++ b/spec/graphql/types/merge_requests/author_type_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['MergeRequestAuthor'] do + it_behaves_like "a user type with merge request interaction type" +end diff --git a/spec/graphql/types/merge_requests/participant_type_spec.rb b/spec/graphql/types/merge_requests/participant_type_spec.rb new file mode 100644 index 00000000000..083762c7064 --- /dev/null +++ b/spec/graphql/types/merge_requests/participant_type_spec.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['MergeRequestParticipant'] do + it_behaves_like "a user type with merge request interaction type" +end diff --git a/spec/graphql/types/merge_requests/reviewer_type_spec.rb b/spec/graphql/types/merge_requests/reviewer_type_spec.rb index 377f82bb00a..92cb51df27a 100644 --- a/spec/graphql/types/merge_requests/reviewer_type_spec.rb +++ b/spec/graphql/types/merge_requests/reviewer_type_spec.rb @@ -3,55 +3,5 @@ require 'spec_helper' RSpec.describe GitlabSchema.types['MergeRequestReviewer'] do - specify { expect(described_class).to require_graphql_authorizations(:read_user) } - - it 'has the expected fields' do - expected_fields = %w[ - id - bot - user_permissions - snippets - name - username - email - publicEmail - avatarUrl - webUrl - webPath - todos - state - status - location - authoredMergeRequests - assignedMergeRequests - reviewRequestedMergeRequests - groupMemberships - groupCount - projectMemberships - starredProjects - callouts - merge_request_interaction - namespace - timelogs - groups - gitpodEnabled - preferencesGitpodPath - profileEnableGitpodPath - savedReplies - ] - - expect(described_class).to have_graphql_fields(*expected_fields) - end - - describe '#merge_request_interaction' do - subject { described_class.fields['mergeRequestInteraction'] } - - it 'returns the correct type' do - is_expected.to have_graphql_type(Types::UserMergeRequestInteractionType) - end - - it 'has the correct arguments' do - is_expected.to have_attributes(arguments: be_empty) - end - end + it_behaves_like "a user type with merge request interaction type" end diff --git a/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb b/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb index 3152dc2ad2f..c0629c8d795 100644 --- a/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb +++ b/spec/lib/gitlab/wiki_pages/front_matter_parser_spec.rb @@ -3,11 +3,10 @@ require 'spec_helper' RSpec.describe Gitlab::WikiPages::FrontMatterParser do - subject(:parser) { described_class.new(raw_content, gate) } + subject(:parser) { described_class.new(raw_content) } let(:content) { 'This is the content' } let(:end_divider) { '---' } - let(:gate) { stub_feature_flag_gate('Gate') } let(:with_front_matter) do <<~MD @@ -62,32 +61,6 @@ RSpec.describe Gitlab::WikiPages::FrontMatterParser do it { is_expected.to have_attributes(reason: :no_match) } end - context 'the feature flag is disabled' do - let(:raw_content) { with_front_matter } - - before do - stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => false) - end - - it { is_expected.to have_attributes(front_matter: be_empty, content: raw_content) } - end - - context 'the feature flag is enabled for the gated object' do - let(:raw_content) { with_front_matter } - - before do - stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => gate) - end - - it do - is_expected.to have_attributes( - front_matter: have_correct_front_matter, - content: content + "\n", - reason: be_nil - ) - end - end - context 'the end divider is ...' do let(:end_divider) { '...' } let(:raw_content) { with_front_matter } diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 699dd35196f..0016d2f517b 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -24,14 +24,6 @@ RSpec.describe WikiPage do container.wiki end - def disable_front_matter - stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => false) - end - - def enable_front_matter_for(thing) - stub_feature_flags(Gitlab::WikiPages::FrontMatterParser::FEATURE_FLAG => thing) - end - # Use for groups of tests that do not modify their `subject`. # # include_context 'subject is persisted page', title: 'my title' @@ -48,12 +40,6 @@ RSpec.describe WikiPage do it { expect(wiki_page).to have_attributes(front_matter: {}, content: content) } end - shared_examples 'a page with front-matter' do - let(:front_matter) { { title: 'Foo', slugs: %w[slug_a slug_b] } } - - it { expect(wiki_page.front_matter).to eq(front_matter) } - end - context 'the wiki page has front matter' do let(:content) do <<~MD @@ -68,27 +54,13 @@ RSpec.describe WikiPage do MD end - it_behaves_like 'a page with front-matter' + it 'has front-matter' do + expect(wiki_page.front_matter).to eq({ title: 'Foo', slugs: %w[slug_a slug_b] }) + end it 'strips the front matter from the content' do expect(wiki_page.content.strip).to eq('My actual content') end - - context 'the feature flag is off' do - before do - disable_front_matter - end - - it_behaves_like 'a page without front-matter' - - context 'but enabled for the container' do - before do - enable_front_matter_for(container) - end - - it_behaves_like 'a page with front-matter' - end - end end context 'the wiki page does not have front matter' do @@ -471,29 +443,6 @@ RSpec.describe WikiPage do end end - context 'the front-matter feature flag is not enabled' do - before do - disable_front_matter - end - - it 'does not update the front-matter' do - content = subject.content - subject.update(front_matter: { slugs: ['x'] }) - - page = wiki.find_page(subject.title) - - expect([subject, page]).to all(have_attributes(front_matter: be_empty, content: content)) - end - - context 'but it is enabled for the container' do - before do - enable_front_matter_for(container) - end - - it_behaves_like 'able to update front-matter' - end - end - it 'updates the wiki-page front-matter and content together' do content = 'totally new content' subject.update(content: content, front_matter: { slugs: ['x'] }) diff --git a/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb new file mode 100644 index 00000000000..0d0dbb112de --- /dev/null +++ b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.shared_examples "a user type with merge request interaction type" do + specify { expect(described_class).to require_graphql_authorizations(:read_user) } + + it 'has the expected fields' do + expected_fields = %w[ + id + bot + user_permissions + snippets + name + username + email + publicEmail + avatarUrl + webUrl + webPath + todos + state + status + location + authoredMergeRequests + assignedMergeRequests + reviewRequestedMergeRequests + groupMemberships + groupCount + projectMemberships + starredProjects + callouts + merge_request_interaction + namespace + timelogs + groups + gitpodEnabled + preferencesGitpodPath + profileEnableGitpodPath + savedReplies + ] + + expect(described_class).to have_graphql_fields(*expected_fields) + end + + describe '#merge_request_interaction' do + subject { described_class.fields['mergeRequestInteraction'] } + + it 'returns the correct type' do + is_expected.to have_graphql_type(Types::UserMergeRequestInteractionType) + end + + it 'has the correct arguments' do + is_expected.to have_attributes(arguments: be_empty) + end + end +end