summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/controller_extension/json_file.rb22
-rw-r--r--app/controllers/static_config_controller.rb33
-rw-r--r--app/controllers/v1/configs_controller.rb28
3 files changed, 62 insertions, 21 deletions
diff --git a/app/controllers/controller_extension/json_file.rb b/app/controllers/controller_extension/json_file.rb
new file mode 100644
index 0000000..0cb4b6d
--- /dev/null
+++ b/app/controllers/controller_extension/json_file.rb
@@ -0,0 +1,22 @@
+module ControllerExtension::JsonFile
+ extend ActiveSupport::Concern
+
+ protected
+
+ def send_file
+ if stale?(:last_modified => @file.mtime)
+ response.content_type = 'application/json'
+ render :text => @file.read
+ end
+ end
+
+ def fetch_file
+ if File.exists?(@filename)
+ @file = File.new(@filename)
+ else
+ not_found
+ end
+ end
+
+end
+
diff --git a/app/controllers/static_config_controller.rb b/app/controllers/static_config_controller.rb
index 450cbb2..c78e006 100644
--- a/app/controllers/static_config_controller.rb
+++ b/app/controllers/static_config_controller.rb
@@ -2,23 +2,28 @@
# This controller is responsible for returning some static config files, such as /provider.json
#
class StaticConfigController < ActionController::Base
+ include ControllerExtension::JsonFile
- PROVIDER_JSON = File.join(Rails.root, 'config', 'provider', 'provider.json')
+ before_filter :set_minimum_client_version
+ before_filter :set_filename
+ before_filter :fetch_file
+
+ PROVIDER_JSON = Rails.root.join('config', 'provider', 'provider.json')
- #
- # return the provider.json, ensuring that the header X-Minimum-Client-Version is sent
- # regardless if a 200 or 304 (not modified) response is sent.
- #
def provider
- response.headers["X-Minimum-Client-Version"] = APP_CONFIG[:minimum_client_version].to_s
- if File.exists?(PROVIDER_JSON)
- if stale?(:last_modified => File.mtime(PROVIDER_JSON))
- response.content_type = 'application/json'
- render :text => File.read(PROVIDER_JSON)
- end
- else
- render json: {error: 'not found'}, status: 404
- end
+ send_file
end
+ protected
+
+ # ensure that the header X-Minimum-Client-Version is sent
+ # regardless if a 200 or 304 (not modified) or 404 response is sent.
+ def set_minimum_client_version
+ response.headers["X-Minimum-Client-Version"] =
+ APP_CONFIG[:minimum_client_version].to_s
+ end
+
+ def set_filename
+ @filename = PROVIDER_JSON
+ end
end
diff --git a/app/controllers/v1/configs_controller.rb b/app/controllers/v1/configs_controller.rb
index 537123f..0b2a64a 100644
--- a/app/controllers/v1/configs_controller.rb
+++ b/app/controllers/v1/configs_controller.rb
@@ -1,20 +1,34 @@
class V1::ConfigsController < ApiController
+ include ControllerExtension::JsonFile
before_filter :require_login
+ before_filter :sanitize_filename, only: :show
+ before_filter :fetch_file, only: :show
def index
- render json: CONFIGS
+ render json: {services: service_paths}
end
def show
+ send_file
end
- CONFIGS = {
- services: {
- soledad: "/1/configs/soledad-service.json",
- eip: "/1/configs/eip-service.json",
- smtp: "/1/configs/smtp-service.json"
- }
+ SERVICES = {
+ soledad: "soledad-service.json",
+ eip: "eip-service.json",
+ smtp: "smtp-service.json"
}
+ protected
+
+ def service_paths
+ Hash[SERVICES.map{|k,v| [k,"/1/configs/#{str}"] } ]
+ end
+
+ def sanitize_filename
+ @filename = params[:id].downcase
+ @filename += '.json' unless @filename.ends_with?('.json')
+ access_denied unless SERVICES.values.include? name
+ @filename = Rails.root.join('public', '1', 'config', @filename)
+ end
end