OSDN Git Service

modified file-check-regexp.
authorelixirel <elixirel@users.sourceforge.jp>
Tue, 19 May 2009 11:04:49 +0000 (20:04 +0900)
committerelixirel <elixirel@users.sourceforge.jp>
Tue, 19 May 2009 11:04:49 +0000 (20:04 +0900)
filemanager.rb

index 30847ad..e639a3f 100644 (file)
@@ -122,6 +122,9 @@ class WebFiler
     raise "Target dir not found." unless Dir.exist?(pwd)
   end
   
+  # ファイルに使用できない文字列を調べるための正規表現を定義します
+  FILEREGEXP = /\A[-_+~^0-9a-zA-Z]+(\.[-_+~^0-9a-zA-Z]+)*\z/
+  
   attr_reader :basepath
   attr_accessor :relpath_list
   
@@ -162,7 +165,7 @@ class WebFiler
   def cd(pathname)
     if pathname == ".."
       @relpath_list.delete_at(-1) unless @relpath_list.length == 0
-    elsif pathname.match(/([^\w\.\-\+\~\^]|\.{2})/) == nil
+    elsif pathname.match(FILEREGEXP)
       if Dir.exist?(pwd + "/" + File.basename(pathname))
         @relpath_list << File.basename(pathname)
       else
@@ -176,7 +179,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 +205,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 +229,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
@@ -280,9 +282,11 @@ class Controller
         filer.relpath_list = db["relpath_list"]
         
         db["dellist"] = []
+        count = 0
         db["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)
@@ -297,7 +301,7 @@ class Controller
         db["filelist"] = filer.ls.reverse
         db["fileinfo"] = filer.lsinfo
         
-        db["info"] = "正常にファイルの削除が完了しました。" if db["error"] == ""
+        db["info"] = "正常にファイルの削除が完了しました。" if db["error"] == "" && count != 0
         
         # ディレクトリ製作時
         when "mkdir"