Posted filed under Ruby on Rails.

こっちが、ほんとの目的。地味に開発を続けているSticka.jpの携帯対応の為に必要なので。
AIR版とWeb版を同時にリリースするつもりだったのに、AIRの日本語は相変わらずダメダメなので、とりあえずWeb版ばかり開発が進んでます。

すでに十分使える様になったので、前に登録していただいた人を中心に近々ベータテストを開始します。

このコードはうまく動きません。対応はあきらめました。 (追記 2008/02/03)

さて、このStickaはRails 2.0で作っています。セッションはCookieStore。どうせuser_idしか保存しないしね。
でも、そうするとクッキーを持たない携帯では使えない。それじゃ困る。
という事で書いてみました。jpmobileのtrans sidを使ってCookieStoreをパラメータに保存。
セキュリティ的にかなり微妙なので、使う人は気をつけてください。
とくにリファラーは一発です。

i-modeのブックマークのURLは256文字までらしいので、別に対策が必要です。

jpmobile/lib/jpmobile/trans_sid.rb

# 〜〜 省略 〜〜
class CGI::Session::CookieStore #:nodoc: # ↓追加
  def marshaled_data #:nodoc:
    if defined?(@data) && !@data.blank?
      updated = marshal(@data)
      raise CookieOverflow if updated.size > MAX
      return updated
    end
    nil
  end
end # ↑追加


module Jpmobile::TransSid #:nodoc:
  # 〜〜 省略 〜〜
  protected
  # URLにsession_idを追加する。
  def default_url_options(options)
    return unless request # for test process
    return unless apply_transit_sid?
    { session_key => session_id }  # 変更
  end

  private
  # 〜〜 省略 〜〜  # ↓追加
  # session_idを返すが、CookieStoreだった場合は、データを返す
  def session_id
    session.dbman.is_a?(CGI::Session::CookieStore) ? session.dbman.marshaled_data : session.session_id
  end # ↑追加
  
  # session_idを埋め込むためのhidden fieldを出力する。
  def sid_hidden_field_tag
    "<input type=¥"hidden¥" name=¥"#{CGI::escapeHTML session_key}¥" value=¥"#{CGI::escapeHTML session_id}¥" />" # 変更
  end
  # 〜〜 省略 〜〜