From e3a3422a65901c71ec3ff4a2729309c441660d63 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 7 Apr 2017 12:40:26 +0200
Subject: [PATCH] Allow setting of default language through config

Setting of locale in controller extracted to Localized concern,
the doorkeeper authorized applications controller moved under
custom namespace with inclusion of Localized, which resolves the
"it sometimes appears in a different random language" bug
---
 .env.production.sample                        |  3 +++
 app/controllers/application_controller.rb     |  9 ++-------
 app/controllers/concerns/localized.rb         | 19 +++++++++++++++++++
 .../oauth/authorizations_controller.rb        |  9 ++-------
 .../authorized_applications_controller.rb     | 16 ++++++++++++++++
 .../authorized_applications/index.html.haml   |  0
 config/routes.rb                              |  2 +-
 7 files changed, 43 insertions(+), 15 deletions(-)
 create mode 100644 app/controllers/concerns/localized.rb
 create mode 100644 app/controllers/oauth/authorized_applications_controller.rb
 rename app/views/{doorkeeper => oauth}/authorized_applications/index.html.haml (100%)

diff --git a/.env.production.sample b/.env.production.sample
index a7f9eb4bf..a0e963ca6 100644
--- a/.env.production.sample
+++ b/.env.production.sample
@@ -25,6 +25,9 @@ OTP_SECRET=
 # Only allow registrations with the following e-mail domains
 # EMAIL_DOMAIN_WHITELIST=example1.com|example2.de|etc
 
+# Optionally change default language
+# DEFAULT_LOCALE=de
+
 # E-mail configuration
 SMTP_SERVER=smtp.mailgun.org
 SMTP_PORT=587
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index c06142fd4..f00f9c1e3 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class ApplicationController < ActionController::Base
+  include Localized
+
   # Prevent CSRF attacks by raising an exception.
   # For APIs, you may want to use :null_session instead.
   protect_from_forgery with: :exception
@@ -14,7 +16,6 @@ class ApplicationController < ActionController::Base
   rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity
 
   before_action :store_current_location, except: :raise_not_found, unless: :devise_controller?
-  before_action :set_locale
   before_action :set_user_activity
   before_action :check_suspension, if: :user_signed_in?
 
@@ -28,12 +29,6 @@ class ApplicationController < ActionController::Base
     store_location_for(:user, request.url)
   end
 
-  def set_locale
-    I18n.locale = current_user.try(:locale) || I18n.default_locale
-  rescue I18n::InvalidLocale
-    I18n.locale = I18n.default_locale
-  end
-
   def require_admin!
     redirect_to root_path unless current_user&.admin?
   end
diff --git a/app/controllers/concerns/localized.rb b/app/controllers/concerns/localized.rb
new file mode 100644
index 000000000..b6f868090
--- /dev/null
+++ b/app/controllers/concerns/localized.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Localized
+  extend ActiveSupport::Concern
+
+  included do
+    before_action :set_locale
+  end
+
+  def set_locale
+    I18n.locale = current_user.try(:locale) || default_locale
+  rescue I18n::InvalidLocale
+    I18n.locale = default_locale
+  end
+
+  def default_locale
+    ENV.fetch('DEFAULT_LOCALE') { I18n.default_locale }
+  end
+end
diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb
index 7c25266d8..cdbfde0fb 100644
--- a/app/controllers/oauth/authorizations_controller.rb
+++ b/app/controllers/oauth/authorizations_controller.rb
@@ -1,9 +1,10 @@
 # frozen_string_literal: true
 
 class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
+  include Localized
+
   skip_before_action :authenticate_resource_owner!
 
-  before_action :set_locale
   before_action :store_current_location
   before_action :authenticate_resource_owner!
 
@@ -12,10 +13,4 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
   def store_current_location
     store_location_for(:user, request.url)
   end
-
-  def set_locale
-    I18n.locale = current_user.try(:locale) || I18n.default_locale
-  rescue I18n::InvalidLocale
-    I18n.locale = I18n.default_locale
-  end
 end
diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb
new file mode 100644
index 000000000..09dd5d3c4
--- /dev/null
+++ b/app/controllers/oauth/authorized_applications_controller.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsController
+  include Localized
+
+  skip_before_action :authenticate_resource_owner!
+
+  before_action :store_current_location
+  before_action :authenticate_resource_owner!
+
+  private
+
+  def store_current_location
+    store_location_for(:user, request.url)
+  end
+end
diff --git a/app/views/doorkeeper/authorized_applications/index.html.haml b/app/views/oauth/authorized_applications/index.html.haml
similarity index 100%
rename from app/views/doorkeeper/authorized_applications/index.html.haml
rename to app/views/oauth/authorized_applications/index.html.haml
diff --git a/config/routes.rb b/config/routes.rb
index ca77191f7..315ad5da5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -11,7 +11,7 @@ Rails.application.routes.draw do
   end
 
   use_doorkeeper do
-    controllers authorizations: 'oauth/authorizations'
+    controllers authorizations: 'oauth/authorizations', authorized_applications: 'oauth/authorized_applications'
   end
 
   get '.well-known/host-meta', to: 'xrd#host_meta', as: :host_meta