miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました。 https://zenn.dev/miau に移行しようと考え中

Redmine スタイル指定の有効化をモンキーパッチで

Redmine デフォルト記法である Textile では

!{width:30%}top_page.png!

のような形でスタイル指定が可能ですが、XSS 対策のために Redmine 側で無効にされています。

プロジェクト内部で使う Redmine では XSS を気にしてもしょうがないので、

のような方法でスタイル指定を有効にするわけですが、Redmine のソースに手を入れるのが嫌な方のために、モンキーパッチを使う方法を書いておきます。

変更したい箇所

lib/redmine/wiki_formatting/textile/formatter.rb に

require 'redcloth3'

module Redmine
  module WikiFormatting
    module Textile
      class Formatter < RedCloth3
        def initialize(*args)
          super
          self.hard_breaks=true
          self.no_span_caps=true
          self.filter_styles=true
        end

のような処理があり(※説明に不要な箇所は削っています)、この self.filter_styles をうまいこと外部から false に変更してやればいいことになります。

モンキーパッチ

Rails アプリの起動時に config/initializers/*.rb が実行されることになっていますので、ここにフラグを変更する処理を書けばよいです。

今回は config/initializers/enable_wiki_styles.rb を以下のような感じで作成しました。

module Redmine
  module WikiFormatting
    module Textile
      class Formatter < RedCloth3
        def initialize_with_enabling_styles(*args)
          initialize_without_enabling_styles(*args)
          self.filter_styles = false
        end
        alias_method_chain :initialize, :enabling_styles
      end
    end
  end
end

ファイルは https://gist.github.com/974513 にも置いています。

動作確認は Bitnami Redmine Stack 1.1.3-0 を入れた環境(redmine 1.1.3-0、rails 2.3.9、RedCloth 4.2.7 or 4.2.3)で行いましたが、うまくいっているみたいです。