# -*- coding: utf-8 -*- # # class Configuration # configuration class # module TDiary class Configuration attr_reader :database_url def initialize( cgi = nil, request = nil ) @request = request configure_attrs configure_bot_pattern setup_attr_accessor_to_all_ivars load_logger end def save result = ERB.new(File.read("#{File.dirname(__FILE__)}/../../views/tdiary.rconf").untaint).result(binding) result.untaint Safe::safe do eval( result, binding, "(TDiary::Configuration#save)", 1 ) end @io_class.save_cgi_conf(self, result) end # # get/set/delete plugin options # def []( key ) @options[key] end def []=( key, val ) @options2[key] = @options[key] = val end def delete( key ) @options.delete( key ) @options2.delete( key ) end # backword compatibility, returns NOT mobile phone always def mobile_agent? false end # backword compatibility, returns NOT smartphone always def smartphone? false end alias iphone? smartphone? # backword compatibility, you can use bot? or @conf.bot =~ @cgi.user_agent def bot? @bot =~ @request.user_agent end # backword compatibility, you can use TDiary::ViewHelper#base_url def base_url if @options['base_url'] && @options['base_url'].length > 0 @options['base_url'] elsif @request @request.base_url else '' end end def to_native( str, charset = nil ) str = str.dup if str.encoding == Encoding::ASCII_8BIT str.force_encoding(charset || 'utf-8') end unless str.valid_encoding? str.encode!('utf-16be', {invalid: :replace, undef: :replace}) end unless str.encoding == Encoding::UTF_8 str.encode!('utf-8', {invalid: :replace, undef: :replace}) end str end private # loading tdiary.conf in @data_path. def load_cgi_conf def_vars1 = '' def_vars2 = '' [ :tdiary_version, :html_title, :author_name, :author_mail, :index_page, :hour_offset, :description, :icon, :banner, :x_frame_options, :header, :footer, :section_anchor, :comment_anchor, :date_format, :latest_limit, :show_nyear, :theme, :css, :show_comment, :comment_limit, :comment_limit_per_day, :mail_on_comment, :mail_header, :show_referer, :no_referer2, :only_volatile2, :referer_table2, :options2, ].each do |var| def_vars1 << "#{var} = nil\n" def_vars2 << "@#{var} = #{var} unless #{var} == nil\n" end unless defined?(::TDiary::Cache) && ::TDiary::Cache.method_defined?(:store_cache) require 'tdiary/cache/file' end unless @io_class require 'tdiary/io/default' @io_class = IO::Default attr_reader :io_class end cgi_conf = @io_class.load_cgi_conf(self) cgi_conf.untaint b = binding.taint eval( def_vars1, b ) Safe::safe do begin eval( cgi_conf, b, "(TDiary::Configuration#load_cgi_conf)", 1 ) rescue SyntaxError enc = case @lang when 'en' 'UTF-8' else 'EUC-JP' end cgi_conf.force_encoding( enc ) retry end end if cgi_conf eval( def_vars2, b ) end # loading tdiary.conf in current directory def configure_attrs @options = {} eval( File::open( 'tdiary.conf' ) {|f| f.read }.untaint, nil, "(tdiary.conf)", 1 ) # language setup @lang = 'ja' unless @lang begin instance_eval( File::open( "#{TDiary::PATH}/tdiary/lang/#{@lang}.rb" ){|f| f.read }.untaint, "(tdiary/lang/#{@lang}.rb)", 1 ) rescue Errno::ENOENT @lang = 'ja' retry end @data_path += '/' if @data_path && /\/$/ !~ @data_path @style = 'tDiary' unless @style @index = './' unless @index @update = 'update.rb' unless @update @hide_comment_form = false unless defined?( @hide_comment_form ) @author_name = '' unless @author_name @index_page = '' unless @index_page @hour_offset = 0 unless @hour_offset @html_title = '' unless @html_title @x_frame_options = nil unless @x_frame_options @header = '' unless @header @footer = '' unless @footer @section_anchor = '_' unless @section_anchor @comment_anchor = '_' unless @comment_anchor @date_format = '%Y-%m-%d' unless @date_format @latest_limit = 10 unless @latest_limit @show_nyear = false unless @show_nyear @theme = 'default' if not @theme and not @css @css = '' unless @css @show_comment = true unless defined?( @show_comment ) @comment_limit = 3 unless @comment_limit @comment_limit_per_day = 100 unless @comment_limit_per_day @show_referer = true unless defined?( @show_referer ) @referer_limit = 10 unless @referer_limit @referer_day_only = true unless defined?( @referer_day_only ) @no_referer = [] unless @no_referer @no_referer2 = [] unless @no_referer2 @no_referer = @no_referer2 + @no_referer @only_volatile = [] unless @only_volatile @only_volatile2 = [] unless @only_volatile2 @only_volatile = @only_volatile2 + @only_volatile @referer_table = [] unless @referer_table @referer_table2 = [] unless @referer_table2 @referer_table = @referer_table2 + @referer_table @options = {} unless @options.class == Hash if @options2 then @options.update( @options2 ) else @options2 = {}.taint end @options.taint # for 1.4 compatibility @section_anchor = @paragraph_anchor unless @section_anchor end def setup_attr_accessor_to_all_ivars names = instance_variables().collect {|ivar| ivar.to_s.sub(/@/, '') } (class << self; self; end).class_eval { attr_accessor *names } end def configure_bot_pattern bot = ["bot", "spider", "antenna", "crawler", "moget", "slurp"] bot += @options['bot'] || [] @bot = Regexp::new( "(#{bot.uniq.join( '|' )})", true ) end def load_logger if @logger TDiary.logger = @logger else require 'logger' log_path = (@log_path || "#{@data_path}/log") FileUtils.mkdir_p(log_path.untaint) TDiary.logger = Logger.new(File.join(log_path, "debug.log"), 'daily') TDiary.logger.level = Logger.const_get(@log_level || 'DEBUG') end end def method_missing( *m ) (class << self; self; end).class_eval { attr_accessor m[0] } if m.length == 1 nil end end # backword compatibility Config = Configuration end # Local Variables: # mode: ruby # indent-tabs-mode: t # tab-width: 3 # ruby-indent-level: 3 # End: # vim: ts=3