From 4c55c50c9e75e80b24a3a45d98edbb40b144ea45 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Wed, 17 May 2023 15:05:17 -0400
Subject: [PATCH] fileutils: fix eraseFile_win32 for read-only files

GitLab: #855
Change-Id: Iaf9819d082b3b3e43291eb58f0ca59f168971542
---
 src/fileutils.cpp                      | 3 +++
 src/jamidht/conversationrepository.cpp | 3 ++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/fileutils.cpp b/src/fileutils.cpp
index 8440f45e03..57ace9fc02 100644
--- a/src/fileutils.cpp
+++ b/src/fileutils.cpp
@@ -865,6 +865,9 @@ recursive_mkdir(const std::string& path, mode_t mode)
 bool
 eraseFile_win32(const std::string& path, bool dosync)
 {
+    // Note: from https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-deletefilea#remarks
+    // To delete a read-only file, first you must remove the read-only attribute.
+    SetFileAttributesA(path.c_str(), GetFileAttributesA(path.c_str()) & ~FILE_ATTRIBUTE_READONLY);
     HANDLE h
         = CreateFileA(path.c_str(), GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
     if (h == INVALID_HANDLE_VALUE) {
diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 1a49b788f9..b26aa7a6f4 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -2589,7 +2589,8 @@ ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& ac
     if (fileutils::isDirectory(path)) {
         // If a crash occurs during a previous clone, just in case
         JAMI_WARNING("Removing existing directory {} (the dir exists and non empty)", path);
-        fileutils::removeAll(path, true);
+        if (!fileutils::removeAll(path, true))
+            return nullptr;
     }
 
     JAMI_DEBUG("Start clone of {:s} to {:s}", url, path);
-- 
GitLab