From 6bdab773bb9e968dd569143d1de9b63f0de73b4a Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 16 Nov 2023 11:10:34 +0100 Subject: [PATCH] Securily delete files --- .../java/eu/faircode/email/ActivityView.java | 2 +- .../java/eu/faircode/email/ContactInfo.java | 5 ++-- app/src/main/java/eu/faircode/email/DB.java | 6 ++--- .../eu/faircode/email/EntityAttachment.java | 2 +- .../eu/faircode/email/FragmentCompose.java | 21 ++++++++-------- .../faircode/email/FragmentDialogPrint.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 2 +- .../faircode/email/FragmentOptionsBackup.java | 6 +++-- .../faircode/email/FragmentOptionsMisc.java | 6 ++--- .../java/eu/faircode/email/Fts4DbHelper.java | 2 +- .../java/eu/faircode/email/Fts5DbHelper.java | 2 +- .../main/java/eu/faircode/email/Helper.java | 12 +++++++++ .../eu/faircode/email/MessageClassifier.java | 6 ++--- .../java/eu/faircode/email/WorkerCleanup.java | 25 ++++++++----------- 14 files changed, 53 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 0cf8995ddd..c08038be26 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -1514,7 +1514,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB return Log.getDebugInfo(context, "crash", R.string.title_crash_info_remark, null, sb.toString(), null).id; } finally { - file.delete(); + Helper.secureDelete(file); } } diff --git a/app/src/main/java/eu/faircode/email/ContactInfo.java b/app/src/main/java/eu/faircode/email/ContactInfo.java index 7af2e449ad..cf9adc9c3c 100644 --- a/app/src/main/java/eu/faircode/email/ContactInfo.java +++ b/app/src/main/java/eu/faircode/email/ContactInfo.java @@ -183,8 +183,7 @@ public class ContactInfo { for (File file : favicons) if (file.lastModified() + CACHE_FAVICON_DURATION < now) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } } } @@ -210,7 +209,7 @@ public class ContactInfo { File[] favicons = dir.listFiles(); if (favicons != null) for (File favicon : favicons) - favicon.delete(); + Helper.secureDelete(favicon); } catch (Throwable ex) { Log.w(ex); } diff --git a/app/src/main/java/eu/faircode/email/DB.java b/app/src/main/java/eu/faircode/email/DB.java index 371e1c590d..0bc6cbf477 100644 --- a/app/src/main/java/eu/faircode/email/DB.java +++ b/app/src/main/java/eu/faircode/email/DB.java @@ -167,7 +167,7 @@ public abstract class DB extends RoomDatabase { } } catch (SQLiteDatabaseCorruptException ex) { Log.e(ex); - dbfile.delete(); + Helper.secureDelete(dbfile); } catch (Throwable ex) { Log.e(ex); /* @@ -325,7 +325,7 @@ public abstract class DB extends RoomDatabase { Log.e(ex); } } else - emergency.delete(); + Helper.secureDelete(emergency); } private static void checkEmergencyBackup(Context context) { @@ -1625,7 +1625,7 @@ public abstract class DB extends RoomDatabase { File[] raws = new File(context.getFilesDir(), "raw").listFiles(); if (raws != null) for (File file : raws) - file.delete(); + Helper.secureDelete(file); } }) .addMigrations(new Migration(122, 123) { diff --git a/app/src/main/java/eu/faircode/email/EntityAttachment.java b/app/src/main/java/eu/faircode/email/EntityAttachment.java index 3ab1c529cf..957b276f12 100644 --- a/app/src/main/java/eu/faircode/email/EntityAttachment.java +++ b/app/src/main/java/eu/faircode/email/EntityAttachment.java @@ -403,7 +403,7 @@ public class EntityAttachment { DB db = DB.getInstance(context); db.attachment().setName(id, name + ".zip", "application/zip", zip.length()); - file.delete(); + Helper.secureDelete(file); } public static boolean equals(List a1, List a2) { diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index e99b91782a..70709263a2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -4143,7 +4143,7 @@ public class FragmentCompose extends FragmentBase { return null; } else if (OpenPgpApi.ACTION_ENCRYPT.equals(data.getAction()) || OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(data.getAction())) { - input.delete(); + Helper.secureDelete(input); // send message args.putInt("action", largs.getInt("action")); @@ -4157,7 +4157,7 @@ public class FragmentCompose extends FragmentBase { return result.getParcelableExtra(OpenPgpApi.RESULT_INTENT); case OpenPgpApi.RESULT_CODE_ERROR: - input.delete(); + Helper.secureDelete(input); db.identity().setIdentitySignKey(identity.id, null); OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); if (error != null && @@ -4172,7 +4172,7 @@ public class FragmentCompose extends FragmentBase { throw new IllegalStateException("OpenPgp unknown result code=" + resultCode); } } finally { - output.delete(); + Helper.secureDelete(output); } } @@ -4403,7 +4403,7 @@ public class FragmentCompose extends FragmentBase { CMSSignedData cmsSignedData = cmsGenerator.generate(cmsData); byte[] signedMessage = cmsSignedData.getEncoded(); - sinput.delete(); + Helper.secureDelete(sinput); // Build signature if (EntityMessage.SMIME_SIGNONLY.equals(type)) { @@ -4555,7 +4555,7 @@ public class FragmentCompose extends FragmentBase { cmsEnvelopedData.toASN1Structure().encodeTo(os); } - einput.delete(); + Helper.secureDelete(einput); db.attachment().setDownloaded(attachment.id, encrypted.length()); @@ -5132,8 +5132,7 @@ public class FragmentCompose extends FragmentBase { // content://eu.faircode.email/photo/nnn.jpg File tmp = new File(context.getFilesDir(), uri.getPath()); Log.i("Deleting " + tmp); - if (!tmp.delete()) - Log.w("Error deleting " + tmp); + Helper.secureDelete(tmp); } else Log.i("Authority=" + uri.getAuthority()); @@ -5262,13 +5261,13 @@ public class FragmentCompose extends FragmentBase { throw new IOException("compress"); } catch (Throwable ex) { Log.w(ex); - tmp.delete(); + Helper.secureDelete(tmp); } finally { resized.recycle(); } if (tmp.exists() && tmp.length() > 0) { - file.delete(); + Helper.secureDelete(file); tmp.renameTo(file); } @@ -6027,7 +6026,7 @@ public class FragmentCompose extends FragmentBase { File file = attachment.getFile(context); Helper.copy(ics, file); - ics.delete(); + Helper.secureDelete(ics); ICalendar icalendar = CalendarHelper.parse(context, file); VEvent event = icalendar.getEvents().get(0); @@ -6169,7 +6168,7 @@ public class FragmentCompose extends FragmentBase { File refFile = data.draft.getRefFile(context); if (refFile.exists()) { ref.html(Helper.readText(refFile)); - refFile.delete(); + Helper.secureDelete(refFile); } // Possibly external draft diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java b/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java index aa68759c3d..b51e45d4ce 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogPrint.java @@ -212,7 +212,7 @@ public class FragmentDialogPrint extends FragmentDialogBase { if (out.exists() && out.length() > 0) continue; } else { - out.delete(); + Helper.secureDelete(out); continue; } diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 97e901f312..12d30db5d7 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -9061,7 +9061,7 @@ public class FragmentMessages extends FragmentBase throw new IllegalStateException("OpenPgp unknown result code=" + resultCode); } } finally { - plain.delete(); + Helper.secureDelete(plain); } return null; diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsBackup.java b/app/src/main/java/eu/faircode/email/FragmentOptionsBackup.java index 9d1c35dfec..df92af47b6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsBackup.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsBackup.java @@ -1662,8 +1662,10 @@ public class FragmentOptionsBackup extends FragmentBase implements SharedPrefere File dir = Helper.ensureExists(new File(context.getFilesDir(), "syncdata")); File[] files = dir.listFiles(); if (files != null) - for (File file : files) - Log.i("Cloud delete " + file + "=" + file.delete()); + for (File file : files) { + Log.i("Cloud delete " + file); + Helper.secureDelete(file); + } } } diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index cd82d75236..1969445682 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -1121,7 +1121,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc File dest = new File(target, attachment.getName()); Log.i("Move " + attachment + " to " + dest); Helper.copy(attachment, dest); - attachment.delete(); + Helper.secureDelete(attachment); } if (BuildConfig.DEBUG) { @@ -1141,9 +1141,9 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc File dest = new File(t, message.getName()); Log.i("Move " + message + " to " + dest); Helper.copy(message, dest); - message.delete(); + Helper.secureDelete(message); } - dir.delete(); + Helper.secureDelete(dir); } } diff --git a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java index a19e97f16b..f7694b2b97 100644 --- a/app/src/main/java/eu/faircode/email/Fts4DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts4DbHelper.java @@ -260,7 +260,7 @@ public class Fts4DbHelper extends SQLiteOpenHelper { for (File file : db.getParentFile().listFiles()) if (file.getName().startsWith(DATABASE_NAME)) { Log.i("FTS delete=" + file); - file.delete(); + Helper.secureDelete(file); } } } diff --git a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java index c5d098a91d..62e5fce43f 100644 --- a/app/src/main/java/eu/faircode/email/Fts5DbHelper.java +++ b/app/src/main/java/eu/faircode/email/Fts5DbHelper.java @@ -257,7 +257,7 @@ public class Fts5DbHelper extends SQLiteOpenHelper { for (File file : db.getParentFile().listFiles()) if (file.getName().startsWith(DATABASE_NAME)) { Log.i("FTS delete=" + file); - file.delete(); + Helper.secureDelete(file); } } } diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index f1e174c801..016e36d4b5 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -151,6 +151,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.DateFormat; @@ -2834,6 +2836,16 @@ public class Helper { return files; } + static void secureDelete(File file) { + if (file.exists()) { + try { + Files.delete(Paths.get(file.getAbsolutePath())); + } catch (IOException ex) { + Log.e(ex); + } + } + } + static long getAvailableStorageSpace() { StatFs stats = new StatFs(Environment.getDataDirectory().getAbsolutePath()); return stats.getAvailableBlocksLong() * stats.getBlockSizeLong(); diff --git a/app/src/main/java/eu/faircode/email/MessageClassifier.java b/app/src/main/java/eu/faircode/email/MessageClassifier.java index 63c283a552..e0e35510df 100644 --- a/app/src/main/java/eu/faircode/email/MessageClassifier.java +++ b/app/src/main/java/eu/faircode/email/MessageClassifier.java @@ -454,7 +454,7 @@ public class MessageClassifier { File file = getFile(context, false); File backup = getFile(context, true); - backup.delete(); + Helper.secureDelete(backup); if (file.exists()) file.renameTo(backup); @@ -532,7 +532,7 @@ public class MessageClassifier { writer.endObject(); } - backup.delete(); + Helper.secureDelete(backup); dirty = false; @@ -553,7 +553,7 @@ public class MessageClassifier { _load(file); } catch (Throwable ex) { Log.e(ex); - file.delete(); + Helper.secureDelete(file); clear(context); } } diff --git a/app/src/main/java/eu/faircode/email/WorkerCleanup.java b/app/src/main/java/eu/faircode/email/WorkerCleanup.java index cbc1fc5281..bc2db8fb63 100644 --- a/app/src/main/java/eu/faircode/email/WorkerCleanup.java +++ b/app/src/main/java/eu/faircode/email/WorkerCleanup.java @@ -199,7 +199,7 @@ public class WorkerCleanup extends Worker { for (File file : files) if (file.getName().endsWith(".pma")) { Log.i("Deleting " + file); - file.delete(); + Helper.secureDelete(file); } } } @@ -240,12 +240,11 @@ public class WorkerCleanup extends Worker { EntityMessage message = db.message().getMessage(id); if (message == null || !message.content) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } } catch (NumberFormatException ex) { Log.e(file.getAbsolutePath(), ex); - file.delete(); + Helper.secureDelete(file); } // Cleanup raw message files @@ -267,12 +266,11 @@ public class WorkerCleanup extends Worker { } if (message == null || message.raw == null || !message.raw) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } } catch (NumberFormatException ex) { Log.e(file.getAbsolutePath(), ex); - file.delete(); + Helper.secureDelete(file); } } @@ -287,12 +285,11 @@ public class WorkerCleanup extends Worker { EntityAttachment attachment = db.attachment().getAttachment(id); if (attachment == null || !attachment.available) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } } catch (NumberFormatException ex) { Log.e(file.getAbsolutePath(), ex); - file.delete(); + Helper.secureDelete(file); } // Cleanup cached images @@ -307,12 +304,11 @@ public class WorkerCleanup extends Worker { if (manual || message == null || file.lastModified() + KEEP_IMAGES_DURATION < now) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } } catch (NumberFormatException ex) { Log.e(file.getAbsolutePath(), ex); - file.delete(); + Helper.secureDelete(file); } // Cleanup shared files @@ -321,8 +317,7 @@ public class WorkerCleanup extends Worker { for (File file : shared) if (manual || file.lastModified() + KEEP_FILES_DURATION < now) { Log.i("Deleting " + file); - if (!file.delete()) - Log.w("Error deleting " + file); + Helper.secureDelete(file); } // Cleanup contact info