From 87229c84afbda98679146558235bc7212ea404ee Mon Sep 17 00:00:00 2001
From: Adrian Lang <dokuwiki@adrianlang.de>
Date: Sun, 6 Feb 2011 12:51:09 +0100
Subject: [PATCH] XML-RPC deleteAttachment now uses media_delete

Functionality changes:
  * deleteAttachment now triggers MEDIA_DELETE_FILE (closes FS#1568)
  * deletion success msg in mediamanager is correct, even when the ns dir
    was deleted
  * media_delete changed quite a bit
---
 inc/media.php            | 25 +++++++++++++++----------
 lib/exe/mediamanager.php | 22 ++++++++++++++--------
 lib/exe/xmlrpc.php       | 28 ++++++++--------------------
 3 files changed, 37 insertions(+), 38 deletions(-)

diff --git a/inc/media.php b/inc/media.php
index 69441352b..c63bea5a9 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -141,7 +141,7 @@ function media_metaform($id,$auth){
 }
 
 /**
- * Conveinience function to check if a media file is still in use
+ * Convenience function to check if a media file is still in use
  *
  * @author Michael Klier <chi@chimeric.de>
  */
@@ -160,19 +160,26 @@ function media_inuse($id) {
     }
 }
 
+define('DOKU_MEDIA_DELETED', 1);
+define('DOKU_MEDIA_NOT_AUTH', 2);
+define('DOKU_MEDIA_INUSE', 4);
+define('DOKU_MEDIA_EMPTY_NS', 8);
+
 /**
  * Handles media file deletions
  *
  * If configured, checks for media references before deletion
  *
  * @author Andreas Gohr <andi@splitbrain.org>
- * @return mixed false on error, true on delete or array with refs
+ * @return int One of: 0,
+                       DOKU_MEDIA_DELETED,
+                       DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
+                       DOKU_MEDIA_NOT_AUTH,
+                       DOKU_MEDIA_INUSE
  */
 function media_delete($id,$auth){
-    if($auth < AUTH_DELETE) return false;
-    if(!checkSecurityToken()) return false;
-    global $conf;
-    global $lang;
+    if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH;
+    if(media_inuse($id)) return DOKU_MEDIA_INUSE;
 
     $file = mediaFN($id);
 
@@ -196,12 +203,10 @@ function media_delete($id,$auth){
     unset($evt);
 
     if($data['unl'] && $data['del']){
-        // current namespace was removed. redirecting to root ns passing msg along
-        send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='.
-                rawurlencode(sprintf(noNS($id),$lang['deletesucc'])));
+        return DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS;
     }
 
-    return $data['unl'];
+    return $data['unl'] ? DOKU_MEDIA_DELETED : 0;
 }
 
 /**
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index c79a25c08..6f2add2be 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -82,18 +82,24 @@
 
     // handle deletion
     if($DEL) {
-        $INUSE = media_inuse($DEL);
-        if(!$INUSE) {
-            if(media_delete($DEL,$AUTH)) {
-                msg(sprintf($lang['deletesucc'],noNS($DEL)),1);
-            } else {
-                msg(sprintf($lang['deletefail'],noNS($DEL)),-1);
+        $res = 0;
+        if(checkSecurityToken()) {
+            $res = media_delete($DEL,$AUTH);
+        }
+        if ($res & DOKU_MEDIA_DELETED) {
+            $msg = sprintf($lang['deletesucc'], noNS($DEL));
+            if ($res & DOKU_MEDIA_EMPTY_NS) {
+                // current namespace was removed. redirecting to root ns passing msg along
+                send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='.
+                        rawurlencode($msg));
             }
-        } else {
+            msg($msg,1);
+        } elseif ($res & DOKU_MEDIA_INUSE) {
             if(!$conf['refshow']) {
-                unset($INUSE);
                 msg(sprintf($lang['mediainuse'],noNS($DEL)),0);
             }
+        } else {
+            msg(sprintf($lang['deletefail'],noNS($DEL)),-1);
         }
     }
 
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index d40e338b2..945dc3f67 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -674,27 +674,15 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
     function deleteAttachment($id){
         $id = cleanID($id);
         $auth = auth_quickaclcheck(getNS($id).':*');
-        if($auth < AUTH_DELETE) return new IXR_ERROR(1, "You don't have permissions to delete files.");
-        global $conf;
-        global $lang;
-
-        // check for references if needed
-        $mediareferences = array();
-        if($conf['refcheck']){
-            $mediareferences = ft_mediause($id,$conf['refshow']);
-        }
-
-        if(!count($mediareferences)){
-            $file = mediaFN($id);
-            if(@unlink($file)){
-                addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE);
-                io_sweepNS($id,'mediadir');
-                return 0;
-            }
-            //something went wrong
-               return new IXR_ERROR(1, 'Could not delete file');
-        } else {
+        $res = media_delete($id, $auth);
+        if ($res & DOKU_MEDIA_DELETED) {
+            return 0;
+        } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
+            return new IXR_ERROR(1, "You don't have permissions to delete files.");
+        } elseif ($res & DOKU_MEDIA_INUSE) {
             return new IXR_ERROR(1, 'File is still referenced');
+        } else {
+            return new IXR_ERROR(1, 'Could not delete file');
         }
     }
 
-- 
GitLab