From 62fcacb7279abf5a17165fde5e188ac075999e95 Mon Sep 17 00:00:00 2001
From: ftimme <ft@falkotimme.com>
Date: Tue, 19 Feb 2013 12:30:42 -0500
Subject: [PATCH] - Fixed FS#2673 - Deletion of APS instance deletes error and stats folders.

---
 interface/lib/classes/aps_crawler.inc.php |    2 +-
 server/lib/classes/file.inc.php           |   17 +++++++++++++++++
 server/lib/classes/aps_installer.inc.php  |   24 ++++++++++++++++++++++--
 3 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/interface/lib/classes/aps_crawler.inc.php b/interface/lib/classes/aps_crawler.inc.php
index 98cf769..00b1d76 100644
--- a/interface/lib/classes/aps_crawler.inc.php
+++ b/interface/lib/classes/aps_crawler.inc.php
@@ -98,7 +98,7 @@
             foreach($files as $file)
             {
                 if($file != '.' && $file != '..')
-                    if(filetype($dir.'/'.$file) == 'dir') rrmdir($dir.'/'.$file); 
+                    if(filetype($dir.'/'.$file) == 'dir') $this->removeDirectory($dir.'/'.$file); 
                     else @unlink($dir.'/'.$file);
             }
             reset($files);
diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php
index 4ac74b5..5951698 100644
--- a/server/lib/classes/aps_installer.inc.php
+++ b/server/lib/classes/aps_installer.inc.php
@@ -397,8 +397,28 @@
 
             // Now delete an existing folder (affects install and removal in the same way)
             @chdir($this->local_installpath);
-            if(file_exists($this->local_installpath)) exec("rm -Rf ".escapeshellarg($this->local_installpath).'*');
-            else mkdir($this->local_installpath, 0777, true);
+            if(file_exists($this->local_installpath)){
+				// make sure we don't delete error and stats folders
+				if($this->local_installpath == $this->document_root.'/'){
+					if(is_dir($this->document_root)){
+						$files = array_diff(scandir($this->document_root), array('.','..','error','stats'));
+						foreach($files as $file){
+							if(is_dir($this->document_root.'/'.$file)){
+								$app->file->removeDirectory($this->document_root.'/'.$file);
+							} else {
+								@unlink($this->document_root.'/'.$file);
+							}
+						}
+					} else {
+						@unlink($this->document_root);
+						mkdir($this->document_root, 0777, true);
+					}
+				} else {
+					exec("rm -Rf ".escapeshellarg($this->local_installpath).'*');
+				}
+			} else {
+				mkdir($this->local_installpath, 0777, true);
+			}
 
             if($this->handle_type == 'install')
             {            
diff --git a/server/lib/classes/file.inc.php b/server/lib/classes/file.inc.php
index 47b5375..c1f031b 100644
--- a/server/lib/classes/file.inc.php
+++ b/server/lib/classes/file.inc.php
@@ -268,6 +268,23 @@
        }
        return $passed;
     }
+	
+	function removeDirectory($dir){
+		//TODO: implement something to delete files/directories recursively that are owned by a certain user or group
+		if(is_dir($dir)){
+			$files = array_diff(scandir($dir), array('.','..'));
+			if(is_array($files) && !empty($files)){
+				foreach($files as $file){
+					if(is_dir($dir.'/'.$file)){
+						$this->removeDirectory($dir.'/'.$file);
+					} else {
+						@unlink($dir.'/'.$file);
+					}
+				}
+			}
+			@rmdir($dir);
+		}
+	}
 
 }
 ?>

--
Gitblit v1.9.1