最終更新: 2009-08-28T23:41+0900
表示方法はこう。
# coding: utf-8 require 'date' add_section_leave_proc{|date, index| diary = @diaries[date.strftime('%Y%m%d')] next unless diary # in case @mode == 'preview' section, sidx = nil, 0 diary.each_section{|sec| sidx+=1 if sidx == index section = sec break end } lm = section.last_modified rescue next next unless lm lm = DateTime.new(*(lm.utc.to_a.values_at(5,4,3,2,1,0))).new_offset(Rational(135,360)) # 日本時間 lm.strftime %<<p class="lastmodified">最終更新: %Y-%m-%dT%H:%M%Z</p>> # 色分けテストとして、あえてタグと同じアングルブラケットで囲ってみた。 }
DateTimeのオフセ
るりまにはスタンドアロンサ
組み込みの Timeが UTCと localtimeしか扱わないのがも
lm = section.last_modified rescue next next unless lm offset = 9 * 60 * 60 # 秒 lm_local = (lm + offset).utc # UTCと見せかけて lmの地方時。 %<<p class="lastmodified">最終更新: %d-%02d-%02dT%02d:%02d%s%+03d%02d</p>> % [lm_local.year, lm_local.month, lm_local.day, lm_local.hour, lm_local.min, offset/60/60, offset/60%60] }
……てなことを、makerss.rbの中の TDiary::RDFSection#time_stringが
g = @time.dup.gmtime l = Time::local( g.year, g.month, g.day, g.hour, g.min, g.sec )
gmtimeに基づく年月日時分秒からロ
脱線終了。表示するまでの仕込みがこんな感じ。
主に plugin/makerss.rbからの要請で更新日時を記録したいので、ち
最初にポストされた時刻も有用だろうか? 日記だから最初にポストされた日はほとんど確定してるし、時刻まで知りたいとも思わないけど。
WikiSectionに last_modifiedプロパテ
「編集」でセクシ
速くなると聞いては捨ておけぬ。
category_anchorでの nil.yearエラ
plugin/makerss.rbが直前に変更のあ
という手順を考えた。
セクシ
新規作成や修正されたセクシ
先人 > Amazon Product Advertising APIの認証の件 - zorioの日記
Ruby-1.8.7と Ruby-1.8.6では String#force_encoding("ASCII-8BIT")ができず、String#ordもない(ないのはエンコ
require 'digest/sha2' def hmac_sha256(key, message) hash = Digest::SHA256 hash_block_size = 64 # bytes (= hash.new.block_length) key = hash.digest( key ) if hash_block_size < (key.bytesize rescue key.size) ikey = Array.new( hash_block_size, 0x36 ) okey = Array.new( hash_block_size, 0x5c ) key.unpack("C*").each_with_index{|key_byte, i| ikey[i] ^= key_byte okey[i] ^= key_byte } inner_hash = hash.new.update( ikey.pack("C*") ) outer_hash = hash.new.update( okey.pack("C*") ) digest = outer_hash.update( inner_hash.update( message ).digest ).digest return digest end
短い秘密鍵は 0を補う
class Digest::Base
- update(str)
- self << str
- 文字列を追加する。self を返す。複数回updateを呼ぶことは文字列を連結してupdateを呼ぶことと等しい。すなわち m.update(a); m.update(b) は m.update(a + b) と、 m << a << b は m << a + b とそれぞれ等価である。
Ruby-1.9で文字列の連結は怖いので m.update(a + b) と m << a + b と Digest::SHA256.digest(ipad + message) は避けたい。
302 Foundはわかる。リバ
require 'uri' require 'base64' def amazon_authenticated_query_string( host, params ) re_rfc3986_unreserved = /[^A-Za-z0-9\-_.~]/ query_string = params.to_a.sort_by{|x| x.first }.map{|key, value| URI.encode(key, re_rfc3986_unreserved) +'='+ URI.encode(value, re_rfc3986_unreserved) }.join("&") string_to_sign = <<-"STRING_TO_SIGN".gsub(/^\t\t/, '').chomp GET #{host.downcase} /onca/xml #{query_string} STRING_TO_SIGN amazon_secret_access_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" signature = Base64.encode64( hmac_sha256( amazon_secret_access_key, string_to_sign ) ).chomp return "#{query_string}&Signature=#{URI.encode(signature, re_rfc3986_unreserved)}" end
ある日のエントリの一つを更新すると、同じ日の他のエントリまでが更新されたとして上が
add_update_proc do makerss_update unless @cgi.params['makerss_update'][0] == 'false' end
ち
目的は、以前に加えたち
編集対象のセクシ
じ
update_procに引数の追加が必要なんだけど、改めて具体的に考えてみると単純にセクシ
LDRといい update_procの引数といい、万全を期すと二進も三進もいかんなあ。(LDRは使
ああ、afterの範囲を確定するのが難しいんだ。変更前に、編集対象のセクシ
makerss.cacheは二つの目的を持
そもそも、*.rdfのソ
できない。一日単位の編集機能をなくせるわけじ
makerss.cacheは二つの役割を持
変更のあ
makerss.cacheの日記内容をち
これでち
*.rdfのソ
右から左に流すだけでは過剰検知の起こりようがない。フ
問題は、フ
makerss.cacheから読み込んだものと *.rdfから読み込んだものとは Rubyオブジ
セクシ
makerss.cacheはこれまで通りち
日記の書き手はフ
こ
タイトル(脳log)にふさわしい垂れ流し
はるか上の方でこう書いた。
場合によ
http://vvvvvv.sakura.ne.jp/ds14050/diary/20090705p01ったら直前のセクシ ョンと結合してしまうことがあるからなあ(セクシ ョン2を編集していたはずが、セクシ ョン2を削除してセクシ ョン1に追記したことにな ってる可能性がある)。
何を見て書いていたかというと……
http://tdiary.svn.sourceforge.net/viewvc/tdiary/trunk/core/tdiary/wiki_style.rb?revision=3381&view=markup
223 224 225 226 227 228 229 unless body1.empty? current_section = @sections.pop if current_section then body1 = "#{current_section.body.sub( /\n+\Z/, '' )}\n\n#{body1}" end @sections << WikiSection::new( body1, author ) end
解説解説
223 224 225 226 227 228 | appendされた Wikiソースがサブタイトルを持っていないもの( body1 )だったら、 最後のセクションを取り除き 最後のセクションの本文( current_section.body, サブタイトルを含まない )と body1を連結し、 新しいセクション( サブタイトルなし )として追加する。 |
WikiSection#bodyの代わりに WikiSection#to_srcを使わないとサブタイトルが消えてしまう。
226 | body1 = "#{current_section.to_src.sub( /\n+\Z/, '' )}\n\n#{body1}" |
サブタイトルのあるセクシ
セクシ
update_procに updated_sectionというパラメ
試してみた。SecurityErrorが出た。リンク先の ruby-1.9.1とは違い、こちらは ruby-1.8.7-p72でのエラ
>irb irb(main):001:0> require 'open-uri' => true irb(main):002:0> $SAFE=1 => 1 irb(main):003:0> open 'http://vvvvvv.sn25p.dip.jp/301.rb' SecurityError: Insecure operation - [] from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:577:in `[]' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:577:in `find_proxy' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:147:in `open_loop' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:164:in `call' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:162:in `catch' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:162:in `open_loop' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:132:in `open_uri' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:518:in `open' from C:/Program Files (x86)/ruby/lib/ruby/1.8/open-uri.rb:30:in `open' from (irb):3 irb(main):004:0>
301.rbはこう。
#!ruby require 'cgi' cgi = CGI.new; print cgi.header({ 'Status' => '301 Moved Permanently', 'Location' => 'http://vvvvvv.sn25p.dip.jp/index.html' });
ホストネ
#!ruby require 'cgi' cgi = CGI.new; print cgi.header({ 'Status' => '301 Moved Permanently', 'Location' => '/index.html' });
どこまで by designなんだろう。
過去にこんなことを書いた。
過去の日記を「編集」するとその日の全てのセクシ
脳log[2007-12-31-p01] RSSを出力するように。ョンが rdfに上 ってくるのね。tDiary-2.3系の目玉はセクシ ョン単位での編集機能だなあ。
セクシ
そういえばこんなこともあ
日記を更新すると、TDiary::Config#data_path/category/ 以下の、カテゴリごとに作られるキ
脳log[2007-12-25-p01] PStore, category.rb: 日記に変更があるたびにカテゴリキャ ッシ ュフ ァイルがずいぶんたくさん更新される。全部ではないが半分近い 21のフ ァイルが更新されていた。日記の内容はというと一つのカテゴリしか使 っていない。 ャ ッシ ュフ ァイルが一斉に更新されるのをなんとかする。
根が同じかどうかはわからないが、なにかがおかしい。
そういえば、makerss.rbの作成するキ
必ずしも上が
あまりに古い日記を編集していて、makerss.cacheから記事が掃き出されているために変更の有無を確認できない、というのとも違うんだけど。……と思うんだけど。(もういいや)
とりあえず内容を比較する前に stripしてみた。これで様子見。(複数のエントリが同じ時刻に更新されたかのように記録されることがなくなければ O.K.)
if cache[id].section.body_to_html.strip != section.body_to_html.strip or cache[id].section.subtitle_to_html.strip != section.subtitle_to_html.strip then cache[id] = RDFSection::new( id, Time::now, section ) end
最終更新: 2009-12-10T00:55+0900
ル
編集画面 | プレビ | プレビ | 登録画面(競合あり) |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
変更内容はこのような感じ。
例えば、2009年2月26日の第1セクシ
update.rb?edit=1;year=2009;month=2;day=26;section=1
現在編集中のセクシ
従来の一日単位での編集では失われていた*著者情報が、セクシ
ついでに、ある日の編集フ
というわけで、skel/update.rhtml.zhと skel/preview.rhtml.zhは手つかずなので、従来の編集画面と機能になる。
skel/update.rhtml.enと skel/preview.rhtml.enは書きかえたけど動作未確認。
とはいえ、スタイル関連で利用するメソ
ただ、Diary#to_srcが Section#to_srcを単純に連結したものである、という仮定をおいてしま
type="submit" name="edit"
上記が共通部分。(ボタンのラベルも送信されるけど、使われないので違
新旧Wikiスタイルの場合、*.td2にはないよね。
tdiary_styleの場合、書き出される(TdiarySection#to_srcに含まれる)けど、読み込んだらカテゴリの一つにな
etdiary_styleも書き出すけど、読み込みは考えてなさそう。EtdiarySection#initializeに明示的に authorを渡しても使われない。
不毛だ。
プラグインの表示したフ
TODO: 元の画面に戻ることを保証することと、プレビ
プレビ
一日表示のとき、セクシ
add_subtitle_proc {|date, section, subtitle| subtitle += %Q(<span class="adminmenu edit_section"><a href="#{h @conf.update}?edit=1;year=#{@date.year};month=#{@date.month};day=#{@date.day};section=#{section}" rel="nofollow">[edit]</a></span>); } if @mode == 'day';
サブタイトル(<h3>の中)に関係のないテキストを加えるより、サブタイトルの直前に挿入されるこ
add_section_enter_proc {|date, section| %Q(<span class="adminmenu edit_section"><a href="#{h @conf.update}?edit=1;year=#{@date.year};month=#{@date.month};day=#{@date.day};section=#{section}" title="edit (author only)" rel="nofollow">✍</a></span>); } if @mode == 'day';
問題のコ
categorized.keys.each do |c| PStore.new(cache_file(c)).transaction do |db| categorized.fetch(c) #=> key not found (KeyError) db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
fetchをブロ
categorized.keys.each do |c| categorized.fetch(c) #=> O.K. PStore.new(cache_file(c)).transaction do |db| db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
cache_file(c)の呼び出しが原因。その中でも includeしてある ERB::Utilの u()メソ
categorized.keys.each do |c| ::ERB::Util.u(c) categorized.fetch(c) #=> key not found (KeyError) PStore.new(cache_file(c)).transaction do |db| db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
引数にした文字列のエンコ
categorized.keys.each do |c| enc1 = c.encoding; ::ERB::Util.u(c) enc2 = c.encoding categorized.fetch(c) { raise "#{enc1} #{enc2} #{::ERB.version}" } #=> UTF-8 ASCII-8BIT erb.rb [2.1.0 2009-01-11] (RuntimeError) PStore.new(cache_file(c)).transaction do |db| db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
ERB::Util.url_encodeの定義を見ると、引数の文字列を dupした後にエンコ
def url_encode(s) s.to_s.dup.force_encoding("ASCII-8BIT").gsub(/[^a-zA-Z0-9_\-.]/n) { sprintf("%%%02X", $&.unpack("C")[0]) } end alias u url_encode
そんなわけだから呼び出し側(category.rb)で
u( c.dup )
なんてや
u( ""+c )
あるいは
u( "#{c}" )
とや
これは、文字列の複製を遅らせた結果、期せずしておこ
バグのはずなんだけど、irbで再現しようと思
http://redmine.ruby-lang.org/issues/show/1929
(ここに、見るべき場所を見つけることもできなか
* 正しくは ruby-1.9.2dev(2009-02-03)
この断片で理解してもらえるだろうか。
categorized.keys.each do |c| PStore.new(cache_file(c)).transaction do |db| categorized.fetch(c) #=> key not found (KeyError) db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
あるハ
このとき、c は、
"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT
ハ
"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT "本" UTF-8 "マンガ" UTF-8 "雑誌" UTF-8
存在しているだろうに……。
さくらインタ
* 正しくは ruby-1.9.2dev(2009-02-03)
手動で migrate.rbを実行して UTF-8化してあ
grepと同じ程度に簡単に、デ
def migrate_to_utf8( str ) return str to_native( str, 'EUC-JP' ) end
素通しとはいえ migrationは実行されるので、数十から百ちかい数のフ
のが嬉しい。気にな
@accesskey_enabledの設定が存在しない(=>nil => falseと判断される)ために、アクセスキ
NaviUserCGIが木偶だからだ
class Info include ERB::Util def initialize(cgi, years, conf, args = {}) @cgi = cgi @years = years @conf = conf @category = args[:category] || @cgi.params['category'] @year = args[:year] || @cgi.params['year'][0] #=> NoMethodError: undefined method `[]' for nil:NilClass
class NaviUserCGI attr_reader :params, :referer, :user_agent def initialize(datestr) @params = {'date' => [datestr]} # <<<注目! @referer = nil @user_agent = nil end def request_method 'GET' end end
オリジナルの CGI#paramsは単一のデフ
navi_user.rbも recent_list.rbと同じように書き換えてやろうか。
* 一か所、大文字も小文字も存在しない配列のソ
自分好みの見た目に拘るようになるにつれ、既存のテ
公開されるテ
以下、備忘録としてスタイルを決めた際のポイントを。(すごく雑多)
ヘ
古い日記はレイアウトが崩れてるかも。過去の日記の凍結(ヘ
実は squeeze.rbを少し変更してヘ
RewriteEngine on RewriteBase /ds14050/diary # Rewrite rule1 # shows static html, if exists. RewriteCond /home/vvvvvv/www/cgi_file/ds14050/diary/snap/$1.html -f RewriteCond %{REQUEST_METHOD} =GET [OR] RewriteCond %{REQUEST_METHOD} =HEAD RewriteCond %{HTTP:Cache-Control} !=no-cache [nocase] RewriteRule ^([0-9]{8})\.html$ /cgi_file/ds14050/diary/snap/$1.html [L]
でも静的 HTMLをブラウザが直接参照するので tDiaryが起動せず、リフ
requireの処理の中で、セ
画像は、tDiaryの amazon.rbが、リポジトリから持
既に正式版がリリ
irb192> RUBY_DESCRIPTION => "ruby 1.9.2dev (2009-02-03) [i386-mswin32_90]" irb192> $SAFE=1 => 1 irb192> require "a" SecurityError: cannot load from insecure path - Y:/.../Desktop/a.rb from (irb):3:in `require' from (irb):3 from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>' irb192> require "a.rb" SecurityError: cannot load from insecure path - Y:/.../Desktop/a.rb from (irb):4:in `require' from (irb):4 from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>' irb192>
2009-02-03版の ruby-1.9.2devでは、$SAFE=1のとき、カレントデ
ruby-1.9.1の結果は Release Candidateのときと変わらず、
irb191> RUBY_DESCRIPTION => "ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]" irb191> $SAFE=1 => 1 irb191> require "a" SecurityError: Insecure operation - require from (irb):3:in `require' from (irb):3 from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>' irb191> require "a.rb" a.rb required. => true irb191>
ruby-1.9.1では、拡張子を付けてやるとカレントデ
irb191> $SAFE=1 => 1 irb191> require "stringio" SecurityError: Insecure operation - require from (irb):2:in `require' from (irb):2 from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>' irb191> require "stringio.so" => true irb191>
これが原因で、tDiaryを ruby-1.9.1で動かすのは絶望的だと思
この部分は SecurityErrorが出ない方向に修正されると思
ruby-1.9.2devでは、汚染されたパスが $:($LOAD_PATH)のどの位置にあるかが重要。
irb192> $SAFE=1 => 1 irb192> $:.unshift "!tainted!".taint => ["!tainted!", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2/i386-mswin32_90", "."] irb192> require "cgi" SecurityError: cannot load from insecure path - Y:/.../Desktop/!tainted!/cgi.rb from (irb):3:in `require' from (irb):3 from C:/Program Files (x86)/ruby/bin/irb192.bat:20:in `<main>' irb192> $:.push $:.shift => ["C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby/1.9.2/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby192/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2", "C:/Program Files (x86)/ruby/lib/ruby192/1.9.2/i386-mswin32_90", ".", "!tainted!"] irb192> require "cgi" => true irb192>
ruby-1.9.2devでは、$SAFE=1で、汚染された LOAD_PATHからスクリプトを requireすることはできないが、汚染されていない LOAD_PATHからスクリプトを先に見つけた場合は、requireに成功する。ruby-1.9.1(とruby-1.8.7-p72)ではどうだ
irb191> $SAFE=1 => 1 irb191> $:.unshift "!tainted!".taint => ["!tainted!", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/i386-mswin32", "."] irb191> require "cgi" SecurityError: Insecure operation - require from (irb):3:in `require' from (irb):3 from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>' irb191> $:.push $:.shift => ["C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby/1.9.1/i386-msvcrt", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9.1/lib/ruby/1.9.1/i386-mswin32", ".", "!tainted!"] irb191> require "cgi" SecurityError: Insecure operation - require from (irb):5:in `require' from (irb):5 from C:/Program Files (x86)/ActiveScriptRuby-1.9.1/bin/irb.bat:20:in `<main>' irb191>
ruby-1.9.1では、汚染されたパスが一つでも $:($LOAD_PATH)に含まれると、(相対パスでの) requireはできない。絶対パスならできるが、そんな書き方はしないので $:($LOAD_PATH)に追加するパスは常に untaintしなければならない。
requireしたときのカレントデ
多分、従来の Ruby、ruby-1.9.1や ruby-1.8.7は $:($LOAD_PATH)の要素の汚染状況なんて気にしていなか
Level 1以上では起動時に以下の違いがある
- 環境変数 RUBYLIB を $: に加えない
- カレントデ
ィレクトリを $: に加えない - (以下略)
その方針に異議を唱えるものではないけれど、この方式には、セ
ruby-1.9.2devは、$:($LOAD_PATH) の要素の汚染状況に注目することで、$SAFEを使
それなのに現在の ruby-1.9.2devの、$SAFE=1の下での requireに対するカレントデ
ruby-1.8.7では $:($LOAD_PATH)に "." を追加したり取り除いたりすることでカレントデ
拡張子の有無で結果が変わる、動作に筋の通らない ruby-1.9.1の requireは論外として、
ruby-1.9.2devでは、カレントデ
セ
requireが利用する File.expand_pathの仕様によりカレントデ
* その後の変更で、ruby-1.9.1らしき挙動の requireを検出したときはセ
#<Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT> (plugin/00default.rb):571:in `comment_form_text' (plugin/00default.rb):616:in `comment_form' (TDiary::Plugin#eval_src):79:in `block in eval_src' Y:/server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:787:in `eval' Y:/server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:787:in `block in eval_src' Y:/server_root/www/ds14050/tdiary_on_ruby191/tdiary.rb:112:in `block in safe'
なにが ASCII-8BITだ
plugin/00default.rb:575: #{comment_name_label}:<input class="field" name="name" value="#{h( @conf.to_native(@cgi.cookies['tdiary'][0] || '' ))}">
ならばと UTF-8への変換を試みたならば
@cgi.cookies['tdiary'][1].encode("utf-8") #=> #<Encoding::UndefinedConversionError: "\xE3" from ASCII-8BIT to UTF-8>
ク
CGIパラメ
「Testing tDiary on Ruby1.9.1」と題した日記にも関わらず、少しの間、う
サ
cgi.rbも変わ
どちらも日付が今日(2009-01-24)だ! Googleクロ
tDiaryの文脈で Rackの名前を見かけてたんだけど、名前から Rakeのようなものを想像していた。Web方面だ
>irb irb(main):001:0> RUBY_DESCRIPTION => "ruby 1.8.7 (2008-05-31 patchlevel 0) [i386-mswin32_90]" irb(main):002:0> $SAFE=1 => 1 irb(main):003:0> $:.unshift "hoge".taint => ["hoge", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8",..., "."] irb(main):004:0> require 'cgi' SecurityError: Insecure operation - require from (irb):4:in `require' from (irb):4 from :0 irb(main):005:0>
1.8.7でもこうなのだから知らない俺が抜けているのだが、$SAFE=1のときに汚染された文字列を $LOAD_PATHに追加する(pushでも unshiftでも)と、一切の requireができなくなる。
期待したいのは、hoge/cgi.rbや hoge/cgi.soなどが存在するときには、このパスは汚染されているので SecurityError。存在しないときはフ
実際はそうではないのだから tDiaryの
tdiary.rb:12: $:.insert( 1, File::dirname( __FILE__ ) + '/misc/lib' )
というのは __FILE__ が汚染されているときに、わりと危険な操作ということになる。問題が起きないのは SAKURAのレンタルサ
問題が起きないのは SAKURAのレンタルサ
ーバの Rubyが 1.8.6だからなのか、__FILE__、File.dirname(__FILE__) が汚染されていることが稀だからなのか。
両方でした。__FILE__が汚染されているのは Ruby-1.9.1RC1だから(多分)。
$SAFE=1のときに汚染された文字列を $LOAD_PATHに追加する(pushでも unshiftでも)と、一切の requireができなくなる。
書きながら誇張だとは気付いていたのだけど(一切の、の部分が)、そうでない例を自分で見つけたので追記(2009-02-02)。
Windowsで、フルパスで、あるいは拡張子(.rb)なしのフルパスでなら requireできる。
Y:\...\Desktop\a>irb irb(main):001:0> RUBY_DESCRIPTION => "ruby 1.8.7 (2008-05-31 patchlevel 0) [i386-mswin32_90]" irb(main):002:0> $SAFE=1 => 1 irb(main):003:0> $:.push "".taint => ["C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby/1.8/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby/site_ruby", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcr90", "C:/Program Files (x86)/ruby/lib/ruby/vendor_ruby", "C:/Program Files (x86)/ruby/lib/ruby/1.8", "C:/Program Files (x86)/ruby/lib/ruby/1.8/i386-mswin32_90", ".", ""] irb(main):004:0> require "a" SecurityError: Insecure operation - require from (irb):4:in `require' from (irb):4 from :0 irb(main):005:0> require "a.rb" SecurityError: Insecure operation - require from (irb):5:in `require' from (irb):5 from :0 irb(main):006:0> require "./a.rb" SecurityError: Insecure operation - require from (irb):6:in `require' from (irb):6 from :0 irb(main):007:0> require "Y:/.../Desktop/a/a" => true irb(main):008:0> require "Y:/.../Desktop/a/a.rb" => false irb(main):009:0> require "a" SecurityError: Insecure operation - require from (irb):9:in `require' from (irb):9 from :0 irb(main):010:0>