OSDN Git Service

modified require dir logic.
[feedblog/feedgenerator.git] / filemanager.rb
index 30847ad..f7275df 100644 (file)
@@ -41,23 +41,21 @@ class Object
   # _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?
@@ -119,9 +117,12 @@ class WebFiler
     @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
   
@@ -162,8 +163,8 @@ class WebFiler
   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
@@ -176,7 +177,7 @@ class WebFiler
   # ディレクトリを絶対指定で移動するメソッド
   def cd_abs(relpath_arr)
     relpath_arr.each { |name|
-      if name.match(/([^\w\.\-\+\~\^]|\.{2})/) != nil
+      unless name.match(FILEREGEXP)
         raise WebSecurityException
       end
     }
@@ -202,20 +203,19 @@ class WebFiler
     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
@@ -227,16 +227,16 @@ class WebFiler
     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
@@ -249,132 +249,130 @@ end
 #
 # コントローラ部分に相当する処理を受け持つクラスです
 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
@@ -399,10 +397,8 @@ def main
   # セッションが有効な場合のも実行します
   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)