# _arg[1]_ :: モードの指定。例 : w:utf-8(書き込みモード・UTF-8エンコードでファイルを開く)
def myopen(*arg)
mode = arg[1]
- arg[1] = mode[/[^:]+/] if mode && RUBY_VERSION < "1.8.7" && mode.include?(':')
+ rdonly_p = true
+ case mode
+ when String
+ arg[1] = mode[/[^:]+/] if RUBY_VERSION < "1.8.7" && mode.include?(':')
+ rdonly_p = /\A[^:]*[wa+]/ !~ mode
+ when Numeric
+ rdonly_p = !(mode & (IO::WRONY | IO::RDWR))
+ end
open(*arg) do |f|
- f.flock(/\A\w+r/ =~ mode ? File::LOCK_SH : File::LOCK_EX)
+ f.flock(rdonly_p ? File::LOCK_SH : File::LOCK_EX)
return yield(f)
end
end
end
-# = Dirクラス
-#
-# Dirクラスのオーバーライドを行います
-class Dir
- def Dir.exist?(path)
- File.exist?(path) && File.ftype(path) == "directory"
- end
-end
-
class NilClass
def blank?
nil?
@basepath << "/" unless @basepath[-1..-1] == "/"
@relpath_list = []
- raise "Target dir not found." unless Dir.exist?(pwd)
+ raise "Target dir not found." unless File.directory?(pwd)
end
+ # ファイルに使用できない文字列を調べるための正規表現を定義します
+ FILEREGEXP = /\A[-_+~^0-9a-zA-Z]+(\.[-_+~^0-9a-zA-Z]+)*\z/
+
attr_reader :basepath
attr_accessor :relpath_list
def cd(pathname)
if pathname == ".."
@relpath_list.delete_at(-1) unless @relpath_list.length == 0
- elsif pathname.match(/([^\w\.\-\+\~\^]|\.{2})/) == nil
- if Dir.exist?(pwd + "/" + File.basename(pathname))
+ elsif pathname.match(FILEREGEXP)
+ if File.directory?(pwd + "/" + File.basename(pathname))
@relpath_list << File.basename(pathname)
else
raise FileExistedException
# ディレクトリを絶対指定で移動するメソッド
def cd_abs(relpath_arr)
relpath_arr.each { |name|
- if name.match(/([^\w\.\-\+\~\^]|\.{2})/) != nil
+ unless name.match(FILEREGEXP)
raise WebSecurityException
end
}
fname.gsub!(/( | )/, "_")
if File.exist?(pwd + File.basename(fname))
raise FileExistedException
- elsif
- File.basename(fname).match(/([^\w\.\-\+\~\^]|\.{2})/) != nil
- raise WebSecurityException
- else
+ elsif File.basename(fname).match(FILEREGEXP)
open(pwd + File.basename(fname), "w") do |f|
f.binmode
f.write file.read
end
+ else
+ raise WebSecurityException
end
end
# ファイルを消去するメソッド
def delete(fname)
- if File.exist?(pwd + File.basename(fname)) && fname.match(/([^\w\.\-\+\~\^]|\.{2})/) == nil
+ if File.exist?(pwd + File.basename(fname)) && fname.match(FILEREGEXP)
File.delete(pwd + File.basename(fname))
else
raise WebSecurityException
dirname.gsub!(/( | )/, "_")
if File.exist?(pwd + File.basename(dirname))
raise FileExistedException
- elsif dirname.match(/([^\w\.\-\+\~\^]|\.{2})/) != nil
- raise WebSecurityException
- else
+ elsif dirname.match(FILEREGEXP)
Dir.mkdir(pwd + File.basename(dirname))
+ else
+ raise WebSecurityException
end
end
# 内部が空のディレクトリを消去するメソッド
def rmdir(dirname)
- if File.exist?(pwd + File.basename(dirname)) && dirname.match(/([^\w\.\-\+\~\^]|\.{2})/) == nil
+ if File.exist?(pwd + File.basename(dirname)) && dirname.match(FILEREGEXP)
Dir.rmdir(pwd + File.basename(dirname))
else
raise WebSecurityException
#
# コントローラ部分に相当する処理を受け持つクラスです
class Controller
+ def self.update_session(session, filer)
+ session["filelist"] = filer.ls.reverse
+ session["fileinfo"] = filer.lsinfo
+ session["pwd"] = filer.pwd
+ session["relpath_list"] = filer.relpath_list.join("/")
+ end
+
def Controller.MultiForm(cgi, session, params, db)
db.transaction do
case params["action"]
# アップロード時
when "upload"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
if (cgi["updata"].size <= UPLOADLIMIT)
begin
filer.upload(cgi["updata"], cgi["updata"].original_filename)
rescue FileExistedException
- db["error"] = "既に同名のファイルが存在します!"
+ session["error"] = "既に同名のファイルが存在します!"
rescue WebSecurityException
- db["error"] = "ファイル名に使用できない文字列が含まれています!"
+ session["error"] = "ファイル名に使用できない文字列が含まれています!"
end
else
- db["error"] = "ファイルの容量が大きすぎます!"
+ session["error"] = "ファイルの容量が大きすぎます!"
end
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
+ Controller.update_session(session, filer);
- db["info"] = "正常にアップロードが完了しました。" if db["error"] == ""
+ session["info"] = "正常にアップロードが完了しました。" if session["error"] == ""
# 削除時
when "delete"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
- db["dellist"] = []
- db["filelist"].each do |file|
+ session["dellist"] = []
+ count = 0
+ session["filelist"].each do |file|
if params["filename_" + file] == "delete" && filer.ftype(file) == "file"
filer.delete(file)
+ count = count + 1
elsif params["filename_" + file] == "delete" && filer.ftype(file) == "directory"
begin
filer.rmdir(file)
+ count = count + 1
rescue
mes = "対象のディレクトリは空ではありません!<br>"
mes << "ディレクトリを削除する場合は、事前にディレクトリ内部の全てのファイルを削除してください。"
- db["error"] = mes
+ session["error"] = mes
end
end
end
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
+ Controller.update_session(session, filer);
- db["info"] = "正常にファイルの削除が完了しました。" if db["error"] == ""
+ session["info"] = "正常にファイルの削除が完了しました。" if session["error"] == "" && count != 0
# ディレクトリ製作時
when "mkdir"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
begin
filer.mkdir(params["dirname"])
rescue FileExistedException
- db["error"] = "既に同名のディレクトリが存在します!"
+ session["error"] = "既に同名のディレクトリが存在します!"
rescue WebSecurityException
- db["error"] = "ディレクトリ名に使用できない文字列が含まれています!"
+ session["error"] = "ディレクトリ名に使用できない文字列が含まれています!"
end
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
+ Controller.update_session(session, filer);
- db["info"] = "正常にディレクトリの作成が完了しました。" if db["error"] == ""
+ session["info"] = "正常にディレクトリの作成が完了しました。" if session["error"] == ""
# ディレクトリ移動時
when "cd"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
begin
filer.cd(params["arg"])
rescue
- db["error"] = "移動先のディレクトリが見つかりません!"
+ session["error"] = "移動先のディレクトリが見つかりません!"
end
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
- db["pwd"] = filer.pwd
- db["relpath_list"] = filer.relpath_list
+ Controller.update_session(session, filer);
# 絶対位置でのディレクトリ移動時
when "cd_abs"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
if params["arg"].to_i >= 0
begin
movepath = []
params["arg"].to_i.times { |i|
- movepath << db["relpath_list"][i]
+ movepath << params["relpath_list"].split("/")[i]
}
filer.cd_abs(movepath)
rescue
- db["error"] = "移動先のディレクトリが見つかりません!"
+ session["error"] = "移動先のディレクトリが見つかりません!"
end
else
- db["error"] = "移動先のディレクトリが見つかりません!"
+ session["error"] = "移動先のディレクトリが見つかりません!"
end
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
- db["pwd"] = filer.pwd
- db["relpath_list"] = filer.relpath_list
+ Controller.update_session(session, filer);
# 表示更新時
when "refresh"
filer = WebFiler.new(IMGPATH)
- filer.relpath_list = db["relpath_list"]
-
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
- db["pwd"] = filer.pwd
- db["relpath_list"] = filer.relpath_list
+ filer.relpath_list = params["relpath_list"].split("/")
+ Controller.update_session(session, filer);
# 初期表示
else
filer = WebFiler.new(IMGPATH)
-
- db["filelist"] = filer.ls.reverse
- db["fileinfo"] = filer.lsinfo
- db["pwd"] = filer.pwd
- db["relpath_list"] = filer.relpath_list
+ Controller.update_session(session, filer);
end
end
end
# セッションが有効な場合のも実行します
if session["login"] == "true"
db = PStore.new("./work/#{session.session_id}_file.dat")
- db.transaction do
- db["info"] = ""
- db["error"] = ""
- end
+ session["info"] = ""
+ session["error"] = ""
# コントローラ部分
Controller.MultiForm(cgi, session, params, db)