allow only the site locales to be passed as a query string parameter (?locale=<locale>)

did committed Mar 08, 2017
commit ac021b95c593064badd58a37c5904c69ba0502e3
Showing 6 changed files with 67 additions and 7 deletions
Gemfile +3 -3
@@ @@ -31,10 +31,10 @@ group :test do
gem 'rack-test', '~> 0.6.3'
- gem 'codeclimate-test-reporter', '~> 0.4.7', require: false
- gem 'coveralls', '~> 0.8.1', require: false
+ gem 'codeclimate-test-reporter', '~> 0.4.7', require: false
+ gem 'coveralls', '~> 0.8.1', require: false
end
platform :ruby do
- ruby '2.3.0'
+ ruby '2.3.3'
end
Gemfile.lock +2 -2
@@ @@ -217,7 +217,7 @@ DEPENDENCIES
timecop (~> 0.8.0)
RUBY VERSION
- ruby 2.3.0p0
+ ruby 2.3.3p222
BUNDLED WITH
- 1.12.5
+ 1.14.6
locomotive/steam/middlewares/locale.rb b/lib/locomotive/steam/middlewares/locale.rb +5 -1
@@ @@ -28,7 +28,7 @@ module Locomotive::Steam
protected
def extract_locale
- _locale = params[:locale] || default_locale
+ _locale = locale_from_params || default_locale
_path = request.path_info
if _path =~ /^\/(#{site.locales.join('|')})+(\/|$)/
@@ @@ -44,6 +44,10 @@ module Locomotive::Steam
env['steam.locale'] = services.locale = _locale
end
+ def locale_from_params
+ locales.include?(params[:locale]) ? params[:locale] : nil
+ end
+
end
end
end
locomotive/steam/middlewares/renderer.rb b/lib/locomotive/steam/middlewares/renderer.rb +1 -1
@@ @@ -20,7 +20,7 @@ module Locomotive::Steam
redirect_to(page.redirect_url, page.redirect_type)
else
content = parse_and_render_liquid
- render_response(content, page.not_found? ? 404: 200, page.response_type)
+ render_response(content, page.not_found? ? 404 : 200, page.response_type)
end
end
locomotive/steam/middlewares/thread_safe.rb b/lib/locomotive/steam/middlewares/thread_safe.rb +4 -0
@@ @@ -57,6 +57,10 @@ module Locomotive::Steam::Middlewares
@liquid_assigns ||= env.fetch('steam.liquid_assigns')
end
+ def locales
+ site.locales
+ end
+
def default_locale
site.default_locale
end
spec/unit/middlewares/locale_spec.rb +52 -0
@@ @@ -0,0 +1,52 @@
+ require 'spec_helper'
+
+ require_relative '../../../lib/locomotive/steam/middlewares/thread_safe'
+ require_relative '../../../lib/locomotive/steam/middlewares/helpers'
+ require_relative '../../../lib/locomotive/steam/middlewares/locale'
+
+ describe Locomotive::Steam::Middlewares::Locale do
+
+ let(:site) { instance_double('Site', default_locale: :de, locales: %w(de fr)) }
+ let(:url) { 'http://models.example.com' }
+ let(:app) { ->(env) { [200, env, 'app'] } }
+ let(:services) { instance_double('Services', :locale= => 'en') }
+ let(:middleware) { Locomotive::Steam::Middlewares::Locale.new(app) }
+
+ subject do
+ env = env_for(url, 'steam.site' => site)
+ env['steam.request'] = Rack::Request.new(env)
+ env['steam.services'] = services
+ code, env = middleware.call(env)
+ env['steam.locale']
+ end
+
+ describe 'locale asked in the request params' do
+
+ context 'the locale is blank' do
+
+ let(:url) { 'http://models.example.com?locale=' }
+
+ it { is_expected.to eq :de }
+
+ end
+
+ context 'the locale exists' do
+
+ let(:url) { 'http://models.example.com?locale=fr' }
+
+ it { is_expected.to eq 'fr' }
+
+ end
+
+ context 'the locale is unknown' do
+
+ let(:url) { 'http://models.example.com?locale=onload' }
+
+ it { is_expected.to eq :de }
+
+ end
+
+
+ end
+
+ end