2013-02-05 14:16:51 -05:00
class StaticController < ApplicationController
2013-06-04 15:32:36 -07:00
skip_before_filter :check_xhr , :redirect_to_login_if_required
2013-08-27 11:30:58 -04:00
skip_before_filter :verify_authenticity_token , only : [ :enter ]
2013-02-05 14:16:51 -05:00
def show
2015-03-09 11:45:36 +11:00
return redirect_to ( path '/' ) if current_user && params [ :id ] == 'login'
2013-10-30 16:37:22 -04:00
2013-06-27 17:15:59 +10:00
map = {
2014-07-24 14:27:34 -04:00
" faq " = > { redirect : " faq_url " , topic_id : " guidelines_topic_id " } ,
" tos " = > { redirect : " tos_url " , topic_id : " tos_topic_id " } ,
" privacy " = > { redirect : " privacy_policy_url " , topic_id : " privacy_topic_id " }
2013-06-27 17:15:59 +10:00
}
2014-07-24 14:27:34 -04:00
@page = params [ :id ]
2013-02-05 14:16:51 -05:00
2014-07-24 14:27:34 -04:00
if map . has_key? ( @page )
site_setting_key = map [ @page ] [ :redirect ]
2013-06-27 17:15:59 +10:00
url = SiteSetting . send ( site_setting_key )
return redirect_to ( url ) unless url . blank?
end
2013-06-18 10:52:04 -04:00
2014-07-10 12:58:34 -04:00
# The /guidelines route ALWAYS shows our FAQ, ignoring the faq_url site setting.
2014-07-24 14:27:34 -04:00
@page = 'faq' if @page == 'guidelines'
2014-07-10 12:58:34 -04:00
2013-02-05 14:16:51 -05:00
# Don't allow paths like ".." or "/" or anything hacky like that
2014-07-24 14:27:34 -04:00
@page . gsub! ( / [^a-z0-9 \ _ \ -] / , '' )
2013-02-05 14:16:51 -05:00
2014-07-24 14:27:34 -04:00
if map . has_key? ( @page )
@topic = Topic . find_by_id ( SiteSetting . send ( map [ @page ] [ :topic_id ] ) )
raise Discourse :: NotFound unless @topic
2015-06-01 11:40:52 +10:00
@title = @topic . title
2014-07-24 14:27:34 -04:00
@body = @topic . posts . first . cooked
2014-07-10 12:58:34 -04:00
@faq_overriden = ! SiteSetting . faq_url . blank?
2014-07-24 14:27:34 -04:00
render :show , layout : ! request . xhr? , formats : [ :html ]
2013-02-05 14:16:51 -05:00
return
end
2014-10-18 14:27:33 +11:00
if I18n . exists? ( " static. #{ @page } " )
2014-10-18 17:17:20 +11:00
render text : I18n . t ( " static. #{ @page } " ) , layout : ! request . xhr? , formats : [ :html ]
2014-10-18 14:27:33 +11:00
return
end
2014-07-26 23:16:08 +02:00
file = " static/ #{ @page } . #{ I18n . locale } "
file = " static/ #{ @page } .en " if lookup_context . find_all ( " #{ file } .html " ) . empty?
file = " static/ #{ @page } " if lookup_context . find_all ( " #{ file } .html " ) . empty?
if lookup_context . find_all ( " #{ file } .html " ) . any?
render file , layout : ! request . xhr? , formats : [ :html ]
return
end
2013-05-20 10:29:49 +10:00
raise Discourse :: NotFound
2013-02-05 14:16:51 -05:00
end
2013-03-13 10:22:56 -04:00
# This method just redirects to a given url.
# It's used when an ajax login was successful but we want the browser to see
# a post of a login form so that it offers to remember your password.
def enter
params . delete ( :username )
params . delete ( :password )
2015-03-09 11:45:36 +11:00
destination = path ( " / " )
2014-08-28 17:45:13 -04:00
if params [ :redirect ] . present? && ! params [ :redirect ] . match ( login_path )
begin
forum_uri = URI ( Discourse . base_url )
uri = URI ( params [ :redirect ] )
2015-03-09 11:45:36 +11:00
2014-10-30 11:31:44 -04:00
if uri . path . present? &&
( uri . host . blank? || uri . host == forum_uri . host ) &&
uri . path !~ / \ . /
2015-03-09 11:45:36 +11:00
2014-08-28 17:45:13 -04:00
destination = uri . path
2015-06-14 20:24:47 +05:30
destination = " #{ uri . path } ? #{ uri . query } " if uri . path =~ / new-topic /
2014-08-28 17:45:13 -04:00
end
rescue URI :: InvalidURIError
# Do nothing if the URI is invalid
2013-06-04 15:34:54 -07:00
end
2014-08-28 17:45:13 -04:00
end
redirect_to destination
2013-06-04 15:34:54 -07:00
end
2014-05-19 08:46:09 +10:00
2014-08-04 16:43:57 +10:00
skip_before_filter :verify_authenticity_token , only : [ :cdn_asset ]
2014-10-22 15:39:51 +02:00
2014-05-19 08:46:09 +10:00
def cdn_asset
2014-07-10 17:29:38 +10:00
path = File . expand_path ( Rails . root + " public/assets/ " + params [ :path ] )
# SECURITY what if path has /../
2014-10-22 15:39:51 +02:00
raise Discourse :: NotFound unless path . start_with? ( Rails . root . to_s + " /public/assets " )
2014-07-10 17:29:38 +10:00
2014-05-19 08:46:09 +10:00
expires_in 1 . year , public : true
2014-10-21 15:59:16 +11:00
response . headers [ " Expires " ] = 1 . year . from_now . httpdate
2015-02-17 09:54:45 +11:00
response . headers [ " Access-Control-Allow-Origin " ] = params [ :origin ] if params [ :origin ]
2014-10-21 15:59:16 +11:00
2014-07-08 14:48:20 +10:00
begin
response . headers [ " Last-Modified " ] = File . ctime ( path ) . httpdate
2014-10-21 16:17:13 +11:00
response . headers [ " Content-Length " ] = File . size ( path ) . to_s
2014-07-08 14:48:20 +10:00
rescue Errno :: ENOENT
raise Discourse :: NotFound
end
2014-10-21 15:59:16 +11:00
2014-10-22 15:39:51 +02:00
opts = { disposition : nil }
2014-10-21 15:59:16 +11:00
opts [ :type ] = " application/javascript " if path =~ / \ .js$ /
2014-07-10 16:32:06 +10:00
# we must disable acceleration otherwise NGINX strips
# access control headers
2014-07-10 17:01:21 +10:00
request . env [ 'sendfile.type' ] = ''
2014-05-19 08:46:09 +10:00
send_file ( path , opts )
end
2014-10-22 15:39:51 +02:00
2013-02-07 16:45:24 +01:00
end