Commit 6954ebbe authored by Imre Farkas's avatar Imre Farkas

Render calendar feed inline when accessed from GitLab

With text/calendar as Content-Type, the browser always downloads the
content as a file (even ignoring the Content-Disposition header). We
want to display the content inline when accessed from GitLab, similarly
to the RSS feed.
parent 1ed954e8
module IssuesAction module IssuesAction
extend ActiveSupport::Concern extend ActiveSupport::Concern
include IssuableCollections include IssuableCollections
include IssuesCalendar
# rubocop:disable Gitlab/ModuleWithInstanceVariables # rubocop:disable Gitlab/ModuleWithInstanceVariables
def issues def issues
...@@ -17,18 +18,9 @@ module IssuesAction ...@@ -17,18 +18,9 @@ module IssuesAction
end end
# rubocop:enable Gitlab/ModuleWithInstanceVariables # rubocop:enable Gitlab/ModuleWithInstanceVariables
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def issues_calendar def issues_calendar
@issues = issuables_collection render_issues_calendar(issuables_collection)
.non_archived
.with_due_date
.limit(100)
respond_to do |format|
format.ics { response.headers['Content-Disposition'] = 'inline' }
end
end end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
private private
......
module IssuesCalendar
extend ActiveSupport::Concern
# rubocop:disable Gitlab/ModuleWithInstanceVariables
def render_issues_calendar(issuables)
@issues = issuables
.non_archived
.with_due_date
.limit(100)
respond_to do |format|
format.ics do
# NOTE: with text/calendar as Content-Type, the browser always downloads
# the content as a file (even ignoring the Content-Disposition
# header). We want to display the content inline when accessed
# from GitLab, similarly to the RSS feed.
if request.referer&.start_with?(::Settings.gitlab.base_url)
response.headers['Content-Type'] = 'text/plain'
end
end
end
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
end
...@@ -4,6 +4,7 @@ class Projects::IssuesController < Projects::ApplicationController ...@@ -4,6 +4,7 @@ class Projects::IssuesController < Projects::ApplicationController
include IssuableActions include IssuableActions
include ToggleAwardEmoji include ToggleAwardEmoji
include IssuableCollections include IssuableCollections
include IssuesCalendar
include SpammableActions include SpammableActions
prepend_before_action :authenticate_user!, only: [:new] prepend_before_action :authenticate_user!, only: [:new]
...@@ -40,14 +41,7 @@ class Projects::IssuesController < Projects::ApplicationController ...@@ -40,14 +41,7 @@ class Projects::IssuesController < Projects::ApplicationController
end end
def calendar def calendar
@issues = @issuables render_issues_calendar(@issuables)
.non_archived
.with_due_date
.limit(100)
respond_to do |format|
format.ics { response.headers['Content-Disposition'] = 'inline' }
end
end end
def new def new
......
---
title: Render calendar feed inline when accessed from GitLab
merge_request:
author:
type: fixed
...@@ -11,13 +11,25 @@ describe 'Dashboard Issues Calendar Feed' do ...@@ -11,13 +11,25 @@ describe 'Dashboard Issues Calendar Feed' do
end end
context 'when authenticated' do context 'when authenticated' do
it 'renders calendar feed' do context 'with no referer' do
sign_in user it 'renders calendar feed' do
visit issues_dashboard_path(:ics) sign_in user
visit issues_dashboard_path(:ics)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline') expect(body).to have_text('BEGIN:VCALENDAR')
expect(body).to have_text('BEGIN:VCALENDAR') end
end
context 'with GitLab as the referer' do
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', issues_dashboard_url(host: Settings.gitlab.base_url))
visit issues_dashboard_path(:ics)
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
end
end end
end end
...@@ -28,7 +40,6 @@ describe 'Dashboard Issues Calendar Feed' do ...@@ -28,7 +40,6 @@ describe 'Dashboard Issues Calendar Feed' do
visit issues_dashboard_path(:ics, private_token: personal_access_token.token) visit issues_dashboard_path(:ics, private_token: personal_access_token.token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
...@@ -38,7 +49,6 @@ describe 'Dashboard Issues Calendar Feed' do ...@@ -38,7 +49,6 @@ describe 'Dashboard Issues Calendar Feed' do
visit issues_dashboard_path(:ics, feed_token: user.feed_token) visit issues_dashboard_path(:ics, feed_token: user.feed_token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
......
...@@ -13,13 +13,25 @@ describe 'Group Issues Calendar Feed' do ...@@ -13,13 +13,25 @@ describe 'Group Issues Calendar Feed' do
end end
context 'when authenticated' do context 'when authenticated' do
it 'renders calendar feed' do context 'with no referer' do
sign_in user it 'renders calendar feed' do
visit issues_group_path(group, :ics) sign_in user
visit issues_group_path(group, :ics)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline') expect(body).to have_text('BEGIN:VCALENDAR')
expect(body).to have_text('BEGIN:VCALENDAR') end
end
context 'with GitLab as the referer' do
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', issues_group_url(group, host: Settings.gitlab.base_url))
visit issues_group_path(group, :ics)
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
end
end end
end end
...@@ -30,7 +42,6 @@ describe 'Group Issues Calendar Feed' do ...@@ -30,7 +42,6 @@ describe 'Group Issues Calendar Feed' do
visit issues_group_path(group, :ics, private_token: personal_access_token.token) visit issues_group_path(group, :ics, private_token: personal_access_token.token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
...@@ -40,7 +51,6 @@ describe 'Group Issues Calendar Feed' do ...@@ -40,7 +51,6 @@ describe 'Group Issues Calendar Feed' do
visit issues_group_path(group, :ics, feed_token: user.feed_token) visit issues_group_path(group, :ics, feed_token: user.feed_token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
......
...@@ -12,13 +12,25 @@ describe 'Project Issues Calendar Feed' do ...@@ -12,13 +12,25 @@ describe 'Project Issues Calendar Feed' do
end end
context 'when authenticated' do context 'when authenticated' do
it 'renders calendar feed' do context 'with no referer' do
sign_in user it 'renders calendar feed' do
visit project_issues_path(project, :ics) sign_in user
visit project_issues_path(project, :ics)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline') expect(body).to have_text('BEGIN:VCALENDAR')
expect(body).to have_text('BEGIN:VCALENDAR') end
end
context 'with GitLab as the referer' do
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', project_issues_url(project, host: Settings.gitlab.base_url))
visit project_issues_path(project, :ics)
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
end
end end
end end
...@@ -29,7 +41,6 @@ describe 'Project Issues Calendar Feed' do ...@@ -29,7 +41,6 @@ describe 'Project Issues Calendar Feed' do
visit project_issues_path(project, :ics, private_token: personal_access_token.token) visit project_issues_path(project, :ics, private_token: personal_access_token.token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
...@@ -39,7 +50,6 @@ describe 'Project Issues Calendar Feed' do ...@@ -39,7 +50,6 @@ describe 'Project Issues Calendar Feed' do
visit project_issues_path(project, :ics, feed_token: user.feed_token) visit project_issues_path(project, :ics, feed_token: user.feed_token)
expect(response_headers['Content-Type']).to have_content('text/calendar') expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(response_headers['Content-Disposition']).to have_content('inline')
expect(body).to have_text('BEGIN:VCALENDAR') expect(body).to have_text('BEGIN:VCALENDAR')
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment