Merge branch 'fa-handle_invalid_utf8_errors' into 'master'
Render 412 when invalid UTF-8 is passed as parameter See merge request gitlab-org/gitlab-ce!21774
This commit is contained in:
		
						commit
						0920342094
					
				|  | @ -12,6 +12,7 @@ class ApplicationController < ActionController::Base | ||||||
|   include WorkhorseHelper |   include WorkhorseHelper | ||||||
|   include EnforcesTwoFactorAuthentication |   include EnforcesTwoFactorAuthentication | ||||||
|   include WithPerformanceBar |   include WithPerformanceBar | ||||||
|  |   include InvalidUTF8ErrorHandler | ||||||
| 
 | 
 | ||||||
|   before_action :authenticate_sessionless_user! |   before_action :authenticate_sessionless_user! | ||||||
|   before_action :authenticate_user! |   before_action :authenticate_user! | ||||||
|  |  | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | module InvalidUTF8ErrorHandler | ||||||
|  |   extend ActiveSupport::Concern | ||||||
|  | 
 | ||||||
|  |   included do | ||||||
|  |     rescue_from ArgumentError, with: :handle_invalid_utf8 | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   private | ||||||
|  | 
 | ||||||
|  |   def handle_invalid_utf8(error) | ||||||
|  |     if error.message == "invalid byte sequence in UTF-8" | ||||||
|  |       render_412 | ||||||
|  |     else | ||||||
|  |       raise(error) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   def render_412 | ||||||
|  |     respond_to do |format| | ||||||
|  |       format.html { render "errors/precondition_failed", layout: "errors", status: 412 } | ||||||
|  |       format.js { render json: { error: 'Invalid UTF-8' }, status: :precondition_failed, content_type: 'application/json' } | ||||||
|  |       format.any { head :precondition_failed } | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | end | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | - content_for(:title, 'Encoding Error') | ||||||
|  | %img{ :alt => "GitLab Logo", :src => image_path('logo.svg') } | ||||||
|  |   %h1 | ||||||
|  |     412 | ||||||
|  | .container | ||||||
|  |   %h3 Precondition failed | ||||||
|  |   %hr | ||||||
|  |   %p Page can't be loaded because of invalid parameters. | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | --- | ||||||
|  | title: Render 412 when invalid UTF-8 parameters are passed to controller | ||||||
|  | merge_request: | ||||||
|  | author: | ||||||
|  | type: other | ||||||
|  | @ -694,4 +694,38 @@ describe ApplicationController do | ||||||
|       expect(response).to have_gitlab_http_status(403) |       expect(response).to have_gitlab_http_status(403) | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
|  | 
 | ||||||
|  |   context 'when invalid UTF-8 parameters are received' do | ||||||
|  |     controller(described_class) do | ||||||
|  |       def index | ||||||
|  |         params[:text].split(' ') | ||||||
|  | 
 | ||||||
|  |         render json: :ok | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     before do | ||||||
|  |       sign_in user | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'html' do | ||||||
|  |       it 'renders 412' do | ||||||
|  |         get :index, text: "hi \255" | ||||||
|  | 
 | ||||||
|  |         expect(response).to have_gitlab_http_status(412) | ||||||
|  |         expect(response).to render_template :precondition_failed | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     context 'js' do | ||||||
|  |       it 'renders 412' do | ||||||
|  |         get :index, text: "hi \255", format: :js | ||||||
|  | 
 | ||||||
|  |         json_response = JSON.parse(response.body) | ||||||
|  | 
 | ||||||
|  |         expect(response).to have_gitlab_http_status(412) | ||||||
|  |         expect(json_response['error']).to eq('Invalid UTF-8') | ||||||
|  |       end | ||||||
|  |     end | ||||||
|  |   end | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue