Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
b6ba9b9242
commit
884e3abdb0
2
Gemfile
2
Gemfile
|
|
@ -153,7 +153,7 @@ gem 'faraday_middleware-aws-sigv4', '~>0.3.0'
|
||||||
# Markdown and HTML processing
|
# Markdown and HTML processing
|
||||||
gem 'html-pipeline', '~> 2.13.2'
|
gem 'html-pipeline', '~> 2.13.2'
|
||||||
gem 'deckar01-task_list', '2.3.1'
|
gem 'deckar01-task_list', '2.3.1'
|
||||||
gem 'gitlab-markup', '~> 1.7.1'
|
gem 'gitlab-markup', '~> 1.8.0'
|
||||||
gem 'github-markup', '~> 1.7.0', require: 'github/markup'
|
gem 'github-markup', '~> 1.7.0', require: 'github/markup'
|
||||||
gem 'commonmarker', '~> 0.23.2'
|
gem 'commonmarker', '~> 0.23.2'
|
||||||
gem 'kramdown', '~> 2.3.1'
|
gem 'kramdown', '~> 2.3.1'
|
||||||
|
|
|
||||||
|
|
@ -489,7 +489,7 @@ GEM
|
||||||
with_env (= 1.1.0)
|
with_env (= 1.1.0)
|
||||||
xml-simple (~> 1.1.5)
|
xml-simple (~> 1.1.5)
|
||||||
gitlab-mail_room (0.0.9)
|
gitlab-mail_room (0.0.9)
|
||||||
gitlab-markup (1.7.1)
|
gitlab-markup (1.8.0)
|
||||||
gitlab-net-dns (0.9.1)
|
gitlab-net-dns (0.9.1)
|
||||||
gitlab-omniauth-openid-connect (0.8.0)
|
gitlab-omniauth-openid-connect (0.8.0)
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
|
|
@ -1482,7 +1482,7 @@ DEPENDENCIES
|
||||||
gitlab-license (~> 2.0)
|
gitlab-license (~> 2.0)
|
||||||
gitlab-license_finder (~> 6.0)
|
gitlab-license_finder (~> 6.0)
|
||||||
gitlab-mail_room (~> 0.0.9)
|
gitlab-mail_room (~> 0.0.9)
|
||||||
gitlab-markup (~> 1.7.1)
|
gitlab-markup (~> 1.8.0)
|
||||||
gitlab-net-dns (~> 0.9.1)
|
gitlab-net-dns (~> 0.9.1)
|
||||||
gitlab-omniauth-openid-connect (~> 0.8.0)
|
gitlab-omniauth-openid-connect (~> 0.8.0)
|
||||||
gitlab-sidekiq-fetcher (= 0.8.0)
|
gitlab-sidekiq-fetcher (= 0.8.0)
|
||||||
|
|
|
||||||
|
|
@ -1832,6 +1832,7 @@ body.gl-dark .header-search svg {
|
||||||
body.gl-dark .header-search input {
|
body.gl-dark .header-search input {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: rgba(250, 250, 250, 0.8);
|
color: rgba(250, 250, 250, 0.8);
|
||||||
|
box-shadow: inset 0 0 0 1px rgba(250, 250, 250, 0.4);
|
||||||
}
|
}
|
||||||
body.gl-dark .header-search input::placeholder {
|
body.gl-dark .header-search input::placeholder {
|
||||||
color: rgba(250, 250, 250, 0.8);
|
color: rgba(250, 250, 250, 0.8);
|
||||||
|
|
|
||||||
|
|
@ -154,6 +154,7 @@
|
||||||
input {
|
input {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
color: rgba($search-and-nav-links, 0.8);
|
color: rgba($search-and-nav-links, 0.8);
|
||||||
|
box-shadow: inset 0 0 0 1px rgba($search-and-nav-links, 0.4);
|
||||||
|
|
||||||
&::placeholder {
|
&::placeholder {
|
||||||
color: rgba($search-and-nav-links, 0.8);
|
color: rgba($search-and-nav-links, 0.8);
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,8 @@ class VerifyPagesDomainService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def check(domain_name, resolver)
|
def check(domain_name, resolver)
|
||||||
records = parse(txt_records(domain_name, resolver))
|
# Append '.' to domain_name, indicating absolute FQDN
|
||||||
|
records = parse(txt_records(domain_name + '.', resolver))
|
||||||
|
|
||||||
records.any? do |record|
|
records.any? do |record|
|
||||||
record == domain.keyed_verification_code || record == domain.verification_code
|
record == domain.keyed_verification_code || record == domain.verification_code
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
- add_to_breadcrumbs @hook.pluralized_name, admin_hooks_path
|
- add_to_breadcrumbs @hook.pluralized_name, admin_hooks_path
|
||||||
- page_title _('Edit System Hook')
|
- page_title _('Edit System Hook')
|
||||||
|
|
||||||
|
= render 'shared/web_hooks/hook_errors', hook: @hook
|
||||||
|
|
||||||
.row.gl-mt-3
|
.row.gl-mt-3
|
||||||
.col-lg-3
|
.col-lg-3
|
||||||
= render 'shared/web_hooks/title_and_docs', hook: @hook
|
= render 'shared/web_hooks/title_and_docs', hook: @hook
|
||||||
|
|
|
||||||
|
|
@ -13,5 +13,5 @@
|
||||||
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, container_class: 'gl-mr-3', show_label: "true" } }
|
.js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, group_id: group.id, container_class: 'gl-mr-3', show_label: "true" } }
|
||||||
|
|
||||||
.table-section.section-30
|
.table-section.section-30
|
||||||
= form_for setting, url: profile_notifications_group_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f|
|
= form_for setting, url: profile_group_notifications_path(group), method: :put, html: { class: 'update-notifications gl-display-flex' } do |f|
|
||||||
= f.select :notification_email, @user.public_verified_emails, { include_blank: 'Global notification email' }, class: 'select2 js-group-notification-email'
|
= f.select :notification_email, @user.public_verified_emails, { include_blank: 'Global notification email' }, class: 'select2 js-group-notification-email'
|
||||||
|
|
|
||||||
|
|
@ -2,19 +2,7 @@
|
||||||
- add_to_breadcrumbs _('Webhook Settings'), project_hooks_path(@project)
|
- add_to_breadcrumbs _('Webhook Settings'), project_hooks_path(@project)
|
||||||
- page_title _('Webhook')
|
- page_title _('Webhook')
|
||||||
|
|
||||||
- if @hook.rate_limited?
|
= render 'shared/web_hooks/hook_errors', hook: @hook
|
||||||
- placeholders = { strong_start: '<strong>'.html_safe,
|
|
||||||
strong_end: '</strong>'.html_safe,
|
|
||||||
limit: @hook.rate_limit,
|
|
||||||
support_link_start: '<a href="https://support.gitlab.com/hc/en-us/requests/new">'.html_safe,
|
|
||||||
support_link_end: '</a>'.html_safe }
|
|
||||||
= render 'shared/global_alert',
|
|
||||||
title: s_('Webhooks|Webhook was automatically disabled'),
|
|
||||||
variant: :danger,
|
|
||||||
is_contained: true,
|
|
||||||
close_button_class: 'js-close' do
|
|
||||||
.gl-alert-body
|
|
||||||
= s_('Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook.').html_safe % placeholders
|
|
||||||
|
|
||||||
.row.gl-mt-3
|
.row.gl-mt-3
|
||||||
.col-lg-3
|
.col-lg-3
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
- are_close_and_open_buttons_hidden = merge_request_button_hidden?(@merge_request, true) && merge_request_button_hidden?(@merge_request, false)
|
- are_close_and_open_buttons_hidden = merge_request_button_hidden?(@merge_request, true) && merge_request_button_hidden?(@merge_request, false)
|
||||||
- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden]
|
- cache_key = [@project, @merge_request, can_update_merge_request, can_reopen_merge_request, are_close_and_open_buttons_hidden]
|
||||||
|
|
||||||
= cache_if(Feature.enabled?(:cached_mr_title, @project, default_enabled: :yaml), cache_key, expires_in: 1.day) do
|
= cache(cache_key, expires_in: 1.day) do
|
||||||
- if @merge_request.closed_or_merged_without_fork?
|
- if @merge_request.closed_or_merged_without_fork?
|
||||||
.gl-alert.gl-alert-danger.gl-mb-5
|
.gl-alert.gl-alert-danger.gl-mb-5
|
||||||
.gl-alert-container
|
.gl-alert-container
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,10 @@
|
||||||
= hook.url
|
= hook.url
|
||||||
- if hook.rate_limited?
|
- if hook.rate_limited?
|
||||||
%span.gl-badge.badge-danger.badge-pill.sm= _('Disabled')
|
%span.gl-badge.badge-danger.badge-pill.sm= _('Disabled')
|
||||||
|
- elsif hook.permanently_disabled?
|
||||||
|
%span.gl-badge.badge-danger.badge-pill.sm= s_('Webhooks|Failed to connect')
|
||||||
|
- elsif hook.temporarily_disabled?
|
||||||
|
%span.gl-badge.badge-warning.badge-pill.sm= s_('Webhooks|Fails to connect')
|
||||||
|
|
||||||
%div
|
%div
|
||||||
- hook.class.triggers.each_value do |trigger|
|
- hook.class.triggers.each_value do |trigger|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
- strong_start = '<strong>'.html_safe
|
||||||
|
- strong_end = '</strong>'.html_safe
|
||||||
|
- link_start = '<a href="%{url}">'.html_safe
|
||||||
|
- link_end = '</a>'.html_safe
|
||||||
|
|
||||||
|
- if hook.rate_limited?
|
||||||
|
- support_path = 'https://support.gitlab.com/hc/en-us/requests/new'
|
||||||
|
- placeholders = { strong_start: strong_start,
|
||||||
|
strong_end: strong_end,
|
||||||
|
limit: hook.rate_limit,
|
||||||
|
support_link_start: link_start % { url: support_path },
|
||||||
|
support_link_end: link_end }
|
||||||
|
= render 'shared/global_alert',
|
||||||
|
title: s_('Webhooks|Webhook was automatically disabled'),
|
||||||
|
variant: :danger,
|
||||||
|
is_contained: true,
|
||||||
|
close_button_class: 'js-close' do
|
||||||
|
.gl-alert-body
|
||||||
|
= s_('Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook.').html_safe % placeholders
|
||||||
|
- elsif hook.permanently_disabled?
|
||||||
|
= render 'shared/global_alert',
|
||||||
|
title: s_('Webhooks|Webhook failed to connect'),
|
||||||
|
variant: :danger,
|
||||||
|
is_contained: true,
|
||||||
|
close_button_class: 'js-close' do
|
||||||
|
.gl-alert-body
|
||||||
|
= s_('Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below.').html_safe % { strong_start: strong_start, strong_end: strong_end }
|
||||||
|
- elsif hook.temporarily_disabled?
|
||||||
|
- help_path = help_page_path('user/project/integrations/webhooks', anchor: 'webhook-fails-or-multiple-webhook-requests-are-triggered')
|
||||||
|
- placeholders = { strong_start: strong_start,
|
||||||
|
strong_end: strong_end,
|
||||||
|
retry_time: time_interval_in_words(hook.disabled_until - Time.now),
|
||||||
|
help_link_start: link_start % { url: help_path },
|
||||||
|
help_link_end: link_end }
|
||||||
|
= render 'shared/global_alert',
|
||||||
|
title: s_('Webhooks|Webhook fails to connect'),
|
||||||
|
variant: :warning,
|
||||||
|
is_contained: true,
|
||||||
|
close_button_class: 'js-close' do
|
||||||
|
.gl-alert-body
|
||||||
|
= s_('Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below.').html_safe % placeholders
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
---
|
---
|
||||||
name: cached_mr_title
|
name: sbom_survey
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/61605
|
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/76446
|
||||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330907
|
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/348181
|
||||||
milestone: '13.12'
|
milestone: '14.6'
|
||||||
type: development
|
type: development
|
||||||
group: group::source code
|
group: group::secure
|
||||||
default_enabled: false
|
default_enabled: false
|
||||||
|
|
@ -22,7 +22,14 @@ resource :profile, only: [:show, :update] do
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :notifications, only: [:show, :update] do
|
resource :notifications, only: [:show, :update] do
|
||||||
resources :groups, only: :update, constraints: { id: Gitlab::PathRegex.full_namespace_route_regex }
|
scope(path: 'groups/*id',
|
||||||
|
id: Gitlab::PathRegex.full_namespace_route_regex,
|
||||||
|
as: :group,
|
||||||
|
controller: :groups,
|
||||||
|
constraints: { format: /(html|json)/ }) do
|
||||||
|
patch '/', action: :update
|
||||||
|
put '/', action: :update
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :password, only: [:new, :create, :edit, :update] do
|
resource :password, only: [:new, :create, :edit, :update] do
|
||||||
|
|
|
||||||
|
|
@ -511,6 +511,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="queryvulnerabilitiesclusteragentid"></a>`clusterAgentId` | [`[ClustersAgentID!]`](#clustersagentid) | Filter vulnerabilities by `cluster_agent_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="queryvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
| <a id="queryvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="queryvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
| <a id="queryvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
||||||
| <a id="queryvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
| <a id="queryvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
||||||
|
|
@ -10995,6 +10996,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="groupvulnerabilitiesclusteragentid"></a>`clusterAgentId` | [`[ClustersAgentID!]`](#clustersagentid) | Filter vulnerabilities by `cluster_agent_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="groupvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
| <a id="groupvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="groupvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
| <a id="groupvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
||||||
| <a id="groupvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
| <a id="groupvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
||||||
|
|
@ -13808,6 +13810,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="projectvulnerabilitiesclusteragentid"></a>`clusterAgentId` | [`[ClustersAgentID!]`](#clustersagentid) | Filter vulnerabilities by `cluster_agent_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="projectvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
| <a id="projectvulnerabilitiesclusterid"></a>`clusterId` | [`[ClustersClusterID!]`](#clustersclusterid) | Filter vulnerabilities by `cluster_id`. Vulnerabilities with a `reportType` of `cluster_image_scanning` are only included with this filter. |
|
||||||
| <a id="projectvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
| <a id="projectvulnerabilitieshasissues"></a>`hasIssues` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have linked issues. |
|
||||||
| <a id="projectvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
| <a id="projectvulnerabilitieshasresolution"></a>`hasResolution` | [`Boolean`](#boolean) | Returns only the vulnerabilities which have been resolved on default branch. |
|
||||||
|
|
|
||||||
|
|
@ -107,15 +107,16 @@ You can combine the filter options. For example, to list only public projects wi
|
||||||
1. Click the **Public** tab.
|
1. Click the **Public** tab.
|
||||||
1. Enter `score` in the **Filter by name...** input box.
|
1. Enter `score` in the **Filter by name...** input box.
|
||||||
|
|
||||||
#### Deleted projects **(PREMIUM SELF)**
|
#### Projects pending deletion **(PREMIUM SELF)**
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37014) in GitLab 13.3.
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/37014) in GitLab 13.3.
|
||||||
|
> - [Tab renamed](https://gitlab.com/gitlab-org/gitlab/-/issues/347468) from **Deleted projects** in GitLab 14.7.
|
||||||
|
|
||||||
When delayed project deletion is [enabled for a group](../group/index.md#enable-delayed-project-deletion),
|
When delayed project deletion is [enabled for a group](../group/index.md#enable-delayed-project-deletion),
|
||||||
projects within that group are not deleted immediately, but only after a delay. To access a list of all projects that are pending deletion:
|
projects within that group are not deleted immediately, but only after a delay. To access a list of all projects that are pending deletion:
|
||||||
|
|
||||||
1. On the top bar, select **Menu > Projects > Explore projects**.
|
1. On the top bar, select **Menu > Projects > Explore projects**.
|
||||||
1. Select the **Deleted projects** tab.
|
1. Select the **Pending deletion** tab (in GitLab 14.7 and later) or the **Deleted projects** tab (GitLab 14.6 and earlier).
|
||||||
|
|
||||||
Listed for each project is:
|
Listed for each project is:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -177,6 +177,7 @@ You can [configure](#customize-the-cluster-image-scanning-settings) analyzers by
|
||||||
| `CIS_RESOURCE_NAMESPACE` | `""` | Namespace of the Kubernetes resource you want to filter vulnerabilities for. For example, `production`. |
|
| `CIS_RESOURCE_NAMESPACE` | `""` | Namespace of the Kubernetes resource you want to filter vulnerabilities for. For example, `production`. |
|
||||||
| `CIS_RESOURCE_KIND` | `""` | Kind of the Kubernetes resource you want to filter vulnerabilities for. For example, `deployment`. |
|
| `CIS_RESOURCE_KIND` | `""` | Kind of the Kubernetes resource you want to filter vulnerabilities for. For example, `deployment`. |
|
||||||
| `CIS_CLUSTER_IDENTIFIER` | `""` | ID of the Kubernetes cluster integrated with GitLab. This is used to map vulnerabilities to the cluster so they can be filtered in the Vulnerability Report page. |
|
| `CIS_CLUSTER_IDENTIFIER` | `""` | ID of the Kubernetes cluster integrated with GitLab. This is used to map vulnerabilities to the cluster so they can be filtered in the Vulnerability Report page. |
|
||||||
|
| `CIS_CLUSTER_AGENT_IDENTIFIER` | `""` | ID of the Kubernetes cluster agent integrated with GitLab. This maps vulnerabilities to the agent so they can be filtered in the Vulnerability Report page. |
|
||||||
|
|
||||||
#### Override the cluster image scanning template
|
#### Override the cluster image scanning template
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -998,6 +998,8 @@ Here's a sample audio clip:
|
||||||
|
|
||||||
### Inline HTML
|
### Inline HTML
|
||||||
|
|
||||||
|
> Allowing `rel="license"` [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/20857) in GitLab 14.6.
|
||||||
|
|
||||||
To see the second example of Markdown rendered in HTML,
|
To see the second example of Markdown rendered in HTML,
|
||||||
[view it in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#inline-html).
|
[view it in GitLab](https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/user/markdown.md#inline-html).
|
||||||
|
|
||||||
|
|
@ -1006,6 +1008,7 @@ You can also use raw HTML in your Markdown, and it usually works pretty well.
|
||||||
See the documentation for HTML::Pipeline's [SanitizationFilter](https://github.com/jch/html-pipeline/blob/v2.12.3/lib/html/pipeline/sanitization_filter.rb#L42)
|
See the documentation for HTML::Pipeline's [SanitizationFilter](https://github.com/jch/html-pipeline/blob/v2.12.3/lib/html/pipeline/sanitization_filter.rb#L42)
|
||||||
class for the list of allowed HTML tags and attributes. In addition to the default
|
class for the list of allowed HTML tags and attributes. In addition to the default
|
||||||
`SanitizationFilter` allowlist, GitLab allows `span`, `abbr`, `details` and `summary` elements.
|
`SanitizationFilter` allowlist, GitLab allows `span`, `abbr`, `details` and `summary` elements.
|
||||||
|
`rel="license"` is allowed on links to support the [Rel-License microformat](https://microformats.org/wiki/rel-license) and license attribution.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<dl>
|
<dl>
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,11 @@ module Banzai
|
||||||
def remove_rel
|
def remove_rel
|
||||||
lambda do |env|
|
lambda do |env|
|
||||||
if env[:node_name] == 'a'
|
if env[:node_name] == 'a'
|
||||||
env[:node].remove_attribute('rel')
|
# we allow rel="license" to support the Rel-license microformat
|
||||||
|
# http://microformats.org/wiki/rel-license
|
||||||
|
unless env[:node].attribute('rel')&.value == 'license'
|
||||||
|
env[:node].remove_attribute('rel')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,9 @@ module Banzai
|
||||||
|
|
||||||
def add_nofollow!(uri, node)
|
def add_nofollow!(uri, node)
|
||||||
if SCHEMES.include?(uri&.scheme)
|
if SCHEMES.include?(uri&.scheme)
|
||||||
|
license = true if node.attribute('rel')&.value == 'license'
|
||||||
node.set_attribute('rel', 'nofollow noreferrer noopener')
|
node.set_attribute('rel', 'nofollow noreferrer noopener')
|
||||||
|
node.kwattr_append('rel', 'license') if license
|
||||||
node.set_attribute('target', '_blank')
|
node.set_attribute('target', '_blank')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def client_creds(url)
|
def client_creds(url)
|
||||||
if URI(url).scheme == 'tls' || Rails.env.production?
|
if URI(url).scheme == 'tls'
|
||||||
GRPC::Core::ChannelCredentials.new(::Gitlab::X509::Certificate.ca_certs_bundle)
|
GRPC::Core::ChannelCredentials.new(::Gitlab::X509::Certificate.ca_certs_bundle)
|
||||||
else
|
else
|
||||||
:this_channel_is_insecure
|
:this_channel_is_insecure
|
||||||
|
|
|
||||||
|
|
@ -11491,15 +11491,9 @@ msgstr ""
|
||||||
msgid "Deleted"
|
msgid "Deleted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Deleted Projects"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Deleted chat nickname: %{chat_name}!"
|
msgid "Deleted chat nickname: %{chat_name}!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Deleted projects"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Deleted projects cannot be restored!"
|
msgid "Deleted projects cannot be restored!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -25489,9 +25483,15 @@ msgstr ""
|
||||||
msgid "Pending"
|
msgid "Pending"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pending Deletion"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pending comments"
|
msgid "Pending comments"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Pending deletion"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Pending owner approval"
|
msgid "Pending owner approval"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -29399,10 +29399,10 @@ msgstr ""
|
||||||
msgid "Removed upload with id %{id}"
|
msgid "Removed upload with id %{id}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "RemovedProjects|Projects which are removed and are yet to be permanently removed are visible here."
|
msgid "RemovedProjects|No projects pending deletion found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "RemovedProjects|You haven’t removed any projects."
|
msgid "RemovedProjects|Projects that are pending deletion that you have access to are listed here."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Removes %{assignee_text} %{assignee_references}."
|
msgid "Removes %{assignee_text} %{assignee_references}."
|
||||||
|
|
@ -31591,6 +31591,9 @@ msgstr ""
|
||||||
msgid "SecurityReports|Take survey"
|
msgid "SecurityReports|Take survey"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "SecurityReports|The Composition Analysis group is planning significant updates to how we make available the list of software and container dependency information in your projects. Therefore, we ask that you assist us by taking a short -no longer than 5 minute- survey to help align our direction with your needs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
|
msgid "SecurityReports|The Vulnerability Report shows the results of the latest successful pipeline on your project's default branch, as well as vulnerabilities from your latest container scan. %{linkStart}Learn more.%{linkEnd}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -31666,6 +31669,9 @@ msgstr ""
|
||||||
msgid "SecurityReports|You must sign in as an authorized user to see this report"
|
msgid "SecurityReports|You must sign in as an authorized user to see this report"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "SecurityReports|Your feedback is important to us! We will ask again in 7 days."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
|
msgid "SecurityReports|Your feedback is important to us! We will ask again in a week."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -39433,6 +39439,12 @@ msgstr ""
|
||||||
msgid "Webhooks|Enable SSL verification"
|
msgid "Webhooks|Enable SSL verification"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|Failed to connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|Fails to connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Webhooks|Feature flag events"
|
msgid "Webhooks|Feature flag events"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -39469,6 +39481,12 @@ msgstr ""
|
||||||
msgid "Webhooks|Tag push events"
|
msgid "Webhooks|Tag push events"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|The webhook %{help_link_start}failed to connect%{help_link_end}, and will retry in %{retry_time}. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook."
|
msgid "Webhooks|The webhook was triggered more than %{limit} times per minute and is now disabled. To re-enable this webhook, fix the problems shown in %{strong_start}Recent events%{strong_end}, then re-test your settings. %{support_link_start}Contact Support%{support_link_end} if you need help re-enabling your webhook."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -39529,6 +39547,12 @@ msgstr ""
|
||||||
msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
|
msgid "Webhooks|Use this token to validate received payloads. It is sent with the request in the X-Gitlab-Token HTTP header."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|Webhook failed to connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Webhooks|Webhook fails to connect"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Webhooks|Webhook was automatically disabled"
|
msgid "Webhooks|Webhook was automatically disabled"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { GlLoadingIcon } from '@gitlab/ui';
|
import { GlLoadingIcon } from '@gitlab/ui';
|
||||||
import { createLocalVue, shallowMount } from '@vue/test-utils';
|
import { shallowMount } from '@vue/test-utils';
|
||||||
import AxiosMockAdapter from 'axios-mock-adapter';
|
import AxiosMockAdapter from 'axios-mock-adapter';
|
||||||
|
import Vue from 'vue';
|
||||||
import Vuex from 'vuex';
|
import Vuex from 'vuex';
|
||||||
import StatisticsPanelApp from '~/admin/statistics_panel/components/app.vue';
|
import StatisticsPanelApp from '~/admin/statistics_panel/components/app.vue';
|
||||||
import statisticsLabels from '~/admin/statistics_panel/constants';
|
import statisticsLabels from '~/admin/statistics_panel/constants';
|
||||||
|
|
@ -9,8 +10,7 @@ import axios from '~/lib/utils/axios_utils';
|
||||||
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
|
import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
|
||||||
import mockStatistics from '../mock_data';
|
import mockStatistics from '../mock_data';
|
||||||
|
|
||||||
const localVue = createLocalVue();
|
Vue.use(Vuex);
|
||||||
localVue.use(Vuex);
|
|
||||||
|
|
||||||
describe('Admin statistics app', () => {
|
describe('Admin statistics app', () => {
|
||||||
let wrapper;
|
let wrapper;
|
||||||
|
|
@ -19,7 +19,6 @@ describe('Admin statistics app', () => {
|
||||||
|
|
||||||
const createComponent = () => {
|
const createComponent = () => {
|
||||||
wrapper = shallowMount(StatisticsPanelApp, {
|
wrapper = shallowMount(StatisticsPanelApp, {
|
||||||
localVue,
|
|
||||||
store,
|
store,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { GlTable, GlSkeletonLoader } from '@gitlab/ui';
|
import { GlTable, GlSkeletonLoader } from '@gitlab/ui';
|
||||||
import { createLocalVue } from '@vue/test-utils';
|
import Vue from 'vue';
|
||||||
import VueApollo from 'vue-apollo';
|
import VueApollo from 'vue-apollo';
|
||||||
|
|
||||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||||
|
|
@ -16,8 +16,7 @@ import { users, paths, createGroupCountResponse } from '../mock_data';
|
||||||
|
|
||||||
jest.mock('~/flash');
|
jest.mock('~/flash');
|
||||||
|
|
||||||
const localVue = createLocalVue();
|
Vue.use(VueApollo);
|
||||||
localVue.use(VueApollo);
|
|
||||||
|
|
||||||
describe('AdminUsersTable component', () => {
|
describe('AdminUsersTable component', () => {
|
||||||
let wrapper;
|
let wrapper;
|
||||||
|
|
@ -48,7 +47,6 @@ describe('AdminUsersTable component', () => {
|
||||||
|
|
||||||
const initComponent = (props = {}, resolverMock = fetchGroupCountsResponse) => {
|
const initComponent = (props = {}, resolverMock = fetchGroupCountsResponse) => {
|
||||||
wrapper = mountExtended(AdminUsersTable, {
|
wrapper = mountExtended(AdminUsersTable, {
|
||||||
localVue,
|
|
||||||
apolloProvider: createMockApolloProvider(resolverMock),
|
apolloProvider: createMockApolloProvider(resolverMock),
|
||||||
propsData: {
|
propsData: {
|
||||||
users,
|
users,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { GlAlert } from '@gitlab/ui';
|
import { GlAlert } from '@gitlab/ui';
|
||||||
import { GlLineChart } from '@gitlab/ui/dist/charts';
|
import { GlLineChart } from '@gitlab/ui/dist/charts';
|
||||||
import { createLocalVue, shallowMount } from '@vue/test-utils';
|
import { shallowMount } from '@vue/test-utils';
|
||||||
|
import Vue from 'vue';
|
||||||
import VueApollo from 'vue-apollo';
|
import VueApollo from 'vue-apollo';
|
||||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||||
import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
|
import UsageTrendsCountChart from '~/analytics/usage_trends/components/usage_trends_count_chart.vue';
|
||||||
|
|
@ -9,8 +10,7 @@ import ChartSkeletonLoader from '~/vue_shared/components/resizable_chart/skeleto
|
||||||
import { mockQueryResponse, mockApolloResponse } from '../apollo_mock_data';
|
import { mockQueryResponse, mockApolloResponse } from '../apollo_mock_data';
|
||||||
import { mockCountsData1 } from '../mock_data';
|
import { mockCountsData1 } from '../mock_data';
|
||||||
|
|
||||||
const localVue = createLocalVue();
|
Vue.use(VueApollo);
|
||||||
localVue.use(VueApollo);
|
|
||||||
|
|
||||||
const loadChartErrorMessage = 'My load error message';
|
const loadChartErrorMessage = 'My load error message';
|
||||||
const noDataMessage = 'My no data message';
|
const noDataMessage = 'My no data message';
|
||||||
|
|
@ -39,7 +39,6 @@ describe('UsageTrendsCountChart', () => {
|
||||||
|
|
||||||
const createComponent = ({ responseHandler }) => {
|
const createComponent = ({ responseHandler }) => {
|
||||||
return shallowMount(UsageTrendsCountChart, {
|
return shallowMount(UsageTrendsCountChart, {
|
||||||
localVue,
|
|
||||||
apolloProvider: createMockApollo([[statsQuery, responseHandler]]),
|
apolloProvider: createMockApollo([[statsQuery, responseHandler]]),
|
||||||
propsData: { ...mockChartConfig },
|
propsData: { ...mockChartConfig },
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { GlAlert } from '@gitlab/ui';
|
import { GlAlert } from '@gitlab/ui';
|
||||||
import { GlAreaChart } from '@gitlab/ui/dist/charts';
|
import { GlAreaChart } from '@gitlab/ui/dist/charts';
|
||||||
import { createLocalVue, shallowMount } from '@vue/test-utils';
|
import { shallowMount } from '@vue/test-utils';
|
||||||
|
import Vue from 'vue';
|
||||||
import VueApollo from 'vue-apollo';
|
import VueApollo from 'vue-apollo';
|
||||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||||
import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
|
import UsersChart from '~/analytics/usage_trends/components/users_chart.vue';
|
||||||
|
|
@ -13,8 +14,7 @@ import {
|
||||||
roundedSortedCountsMonthlyChartData2,
|
roundedSortedCountsMonthlyChartData2,
|
||||||
} from '../mock_data';
|
} from '../mock_data';
|
||||||
|
|
||||||
const localVue = createLocalVue();
|
Vue.use(VueApollo);
|
||||||
localVue.use(VueApollo);
|
|
||||||
|
|
||||||
describe('UsersChart', () => {
|
describe('UsersChart', () => {
|
||||||
let wrapper;
|
let wrapper;
|
||||||
|
|
@ -34,7 +34,6 @@ describe('UsersChart', () => {
|
||||||
endDate: new Date(2020, 10, 1),
|
endDate: new Date(2020, 10, 1),
|
||||||
totalDataPoints: mockCountsData2.length,
|
totalDataPoints: mockCountsData2.length,
|
||||||
},
|
},
|
||||||
localVue,
|
|
||||||
apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
|
apolloProvider: createMockApollo([[usersQuery, queryHandler]]),
|
||||||
data() {
|
data() {
|
||||||
return { loadingError };
|
return { loadingError };
|
||||||
|
|
|
||||||
|
|
@ -191,4 +191,15 @@ RSpec.describe Banzai::Filter::ExternalLinkFilter do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'for links that have `rel=license`' do
|
||||||
|
let(:doc) { filter %q(<a rel="license" href="http://example.com">rel-license</a>) }
|
||||||
|
|
||||||
|
it_behaves_like 'an external link with rel attribute'
|
||||||
|
|
||||||
|
it 'maintains rel license' do
|
||||||
|
expect(doc.at_css('a')).to have_attribute('rel')
|
||||||
|
expect(doc.at_css('a')['rel']).to include 'license'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,11 @@ RSpec.describe Banzai::Filter::SanitizationFilter do
|
||||||
expect(filter(act).to_html).to eq exp
|
expect(filter(act).to_html).to eq exp
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'allows `rel=license` in links' do
|
||||||
|
exp = act = '<a rel="license" href="http://example.com">rel-license</a>'
|
||||||
|
expect(filter(act).to_html).to eq exp
|
||||||
|
end
|
||||||
|
|
||||||
it 'allows `data-math-style` attribute on `code` and `pre` elements' do
|
it 'allows `data-math-style` attribute on `code` and `pre` elements' do
|
||||||
html = <<-HTML
|
html = <<-HTML
|
||||||
<pre class="code" data-math-style="inline">something</pre>
|
<pre class="code" data-math-style="inline">something</pre>
|
||||||
|
|
|
||||||
|
|
@ -56,36 +56,6 @@ RSpec.describe Gitlab::Spamcheck::Client do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "Rails environment" do
|
|
||||||
let(:stub) { double(:spamcheck_stub, check_for_spam_issue: response) }
|
|
||||||
|
|
||||||
context "production" do
|
|
||||||
before do
|
|
||||||
allow(Rails.env).to receive(:production?).and_return(true)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'uses secure connection' do
|
|
||||||
expect(Spamcheck::SpamcheckService::Stub).to receive(:new).with(endpoint.sub(%r{^grpc://}, ''),
|
|
||||||
instance_of(GRPC::Core::ChannelCredentials),
|
|
||||||
anything).and_return(stub)
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "not production" do
|
|
||||||
before do
|
|
||||||
allow(Rails.env).to receive(:production?).and_return(false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'uses insecure connection' do
|
|
||||||
expect(Spamcheck::SpamcheckService::Stub).to receive(:new).with(endpoint.sub(%r{^grpc://}, ''),
|
|
||||||
:this_channel_is_insecure,
|
|
||||||
anything).and_return(stub)
|
|
||||||
subject
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#issue_spam?' do
|
describe '#issue_spam?' do
|
||||||
before do
|
before do
|
||||||
allow_next_instance_of(::Spamcheck::SpamcheckService::Stub) do |instance|
|
allow_next_instance_of(::Spamcheck::SpamcheckService::Stub) do |instance|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ RSpec.describe "notifications routing" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'routes to group #update' do
|
it 'routes to group #update' do
|
||||||
expect(put("/-/profile/notifications/groups/gitlab-org")).to route_to("profiles/groups#update", id: 'gitlab-org')
|
expect(put("/-/profile/groups/gitlab-org/notifications")).to route_to("profiles/groups#update", id: 'gitlab-org')
|
||||||
expect(put("/-/profile/notifications/groups/gitlab.org")).to route_to("profiles/groups#update", id: 'gitlab.org')
|
expect(put("/-/profile/groups/gitlab.org/notifications/")).to route_to("profiles/groups#update", id: 'gitlab.org')
|
||||||
|
expect(put("/-/profile/groups/gitlab.org/gitlab/notifications")).to route_to("profiles/groups#update", id: 'gitlab.org/gitlab')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -372,7 +372,8 @@ RSpec.describe VerifyPagesDomainService do
|
||||||
allow(resolver).to receive(:getresources) { [] }
|
allow(resolver).to receive(:getresources) { [] }
|
||||||
stubbed_lookups.each do |domain, records|
|
stubbed_lookups.each do |domain, records|
|
||||||
records = Array(records).map { |txt| Resolv::DNS::Resource::IN::TXT.new(txt) }
|
records = Array(records).map { |txt| Resolv::DNS::Resource::IN::TXT.new(txt) }
|
||||||
allow(resolver).to receive(:getresources).with(domain, Resolv::DNS::Resource::IN::TXT) { records }
|
# Append '.' to domain_name, indicating absolute FQDN
|
||||||
|
allow(resolver).to receive(:getresources).with(domain + '.', Resolv::DNS::Resource::IN::TXT) { records }
|
||||||
end
|
end
|
||||||
|
|
||||||
resolver
|
resolver
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,29 @@ RSpec.describe 'projects/hooks/edit' do
|
||||||
expect(rendered).to have_text(s_('Webhooks|Webhook was automatically disabled'))
|
expect(rendered).to have_text(s_('Webhooks|Webhook was automatically disabled'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'webhook is permanently disabled' do
|
||||||
|
before do
|
||||||
|
allow(hook).to receive(:permanently_disabled?).and_return(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders alert' do
|
||||||
|
render
|
||||||
|
|
||||||
|
expect(rendered).to have_text(s_('Webhooks|Webhook failed to connect'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'webhook is temporarily disabled' do
|
||||||
|
before do
|
||||||
|
allow(hook).to receive(:temporarily_disabled?).and_return(true)
|
||||||
|
allow(hook).to receive(:disabled_until).and_return(Time.now + 10.minutes)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders alert' do
|
||||||
|
render
|
||||||
|
|
||||||
|
expect(rendered).to have_text(s_('Webhooks|Webhook fails to connect'))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ RSpec.describe 'projects/hooks/index' do
|
||||||
expect(rendered).to have_css('h4', text: _('Webhooks'))
|
expect(rendered).to have_css('h4', text: _('Webhooks'))
|
||||||
expect(rendered).to have_text('Project Hooks')
|
expect(rendered).to have_text('Project Hooks')
|
||||||
expect(rendered).not_to have_css('.gl-badge', text: _('Disabled'))
|
expect(rendered).not_to have_css('.gl-badge', text: _('Disabled'))
|
||||||
|
expect(rendered).not_to have_css('.gl-badge', text: s_('Webhooks|Failed to connect'))
|
||||||
|
expect(rendered).not_to have_css('.gl-badge', text: s_('Webhooks|Fails to connect'))
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'webhook is rate limited' do
|
context 'webhook is rate limited' do
|
||||||
|
|
@ -33,4 +35,28 @@ RSpec.describe 'projects/hooks/index' do
|
||||||
expect(rendered).to have_css('.gl-badge', text: _('Disabled'))
|
expect(rendered).to have_css('.gl-badge', text: _('Disabled'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'webhook is permanently disabled' do
|
||||||
|
before do
|
||||||
|
allow(existing_hook).to receive(:permanently_disabled?).and_return(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders "Failed to connect" badge' do
|
||||||
|
render
|
||||||
|
|
||||||
|
expect(rendered).to have_css('.gl-badge', text: s_('Webhooks|Failed to connect'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'webhook is temporarily disabled' do
|
||||||
|
before do
|
||||||
|
allow(existing_hook).to receive(:temporarily_disabled?).and_return(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders "Fails to connect" badge' do
|
||||||
|
render
|
||||||
|
|
||||||
|
expect(rendered).to have_css('.gl-badge', text: s_('Webhooks|Fails to connect'))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue