From 42959486ff8ce1dc2d2089eb44e2c7e204b2d2b8 Mon Sep 17 00:00:00 2001 From: Sergey Valiulik Date: Sat, 30 Nov 2024 10:47:23 +0100 Subject: [PATCH 1/4] Show error that can happen during open database --- debug-db-base/src/main/assets/app.js | 4 ++++ .../java/com/amitshekhar/server/RequestHandler.java | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/debug-db-base/src/main/assets/app.js b/debug-db-base/src/main/assets/app.js index beb12cb..ceb58e5 100644 --- a/debug-db-base/src/main/assets/app.js +++ b/debug-db-base/src/main/assets/app.js @@ -136,8 +136,12 @@ function openDatabaseAndGetTableList(db, isDownloadable) { result = JSON.parse(result); var tableList = result.rows; var dbVersion = result.dbVersion; + var error = result.error; if("APP_SHARED_PREFERENCES" != db) { + if (error == null) $("#selected-db-info").text("Selected Database : "+db +" Version : "+dbVersion); + else + $("#selected-db-info").text(error); } $('#table-list').empty() for(var count = 0; count < tableList.length; count++){ diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java index 3f967ea..b6c8076 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java @@ -304,8 +304,15 @@ private String getTableListResponse(String route) { closeDatabase(); mSelectedDatabase = Constants.APP_SHARED_PREFERENCES; } else { - openDatabase(database); - response = DatabaseHelper.getAllTableName(sqLiteDB); + try { + openDatabase(database); + response = DatabaseHelper.getAllTableName(sqLiteDB); + } catch (Exception e) { + response = new Response(); + response.isSuccessful = false; + response.dbVersion = 0; + response.error = e.toString(); + } mSelectedDatabase = database; } return mGson.toJson(response); From 81a46652dfb56865746601cd20b17b0f0ad3b827 Mon Sep 17 00:00:00 2001 From: Sergey Valiulik Date: Fri, 29 Nov 2024 19:50:39 +0100 Subject: [PATCH 2/4] Add ability to enter DB password on runtime --- README.md | 14 ++---- debug-db-base/src/main/assets/app.js | 8 +++- debug-db-base/src/main/assets/index.html | 2 + .../main/java/com/amitshekhar/DebugDB.java | 2 +- .../java/com/amitshekhar/model/Response.java | 1 + .../com/amitshekhar/server/ClientServer.java | 2 +- .../amitshekhar/server/RequestHandler.java | 29 ++++++------ .../com/amitshekhar/sqlite/DBFactory.java | 2 + .../utils/DatabaseFileProvider.java | 28 ++--------- .../java/com/amitshekhar/utils/Utils.java | 46 +++++++++++-------- .../encrypt/sqlite/DebugDBEncryptFactory.java | 4 ++ .../debug/sqlite/DebugDBFactory.java | 4 ++ sample-app-encrypt/build.gradle | 1 - .../java/com/sample/encrypt/utils/Utils.java | 6 +-- .../src/main/java/com/sample/utils/Utils.java | 6 +-- 15 files changed, 75 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 265bb3a..61f46c7 100644 --- a/README.md +++ b/README.md @@ -70,14 +70,6 @@ If you are using `build.gradle.kts`, add the following: debugImplementation("com.github.amitshekhariitbhu.Android-Debug-Database:debug-db-encrypt:1.0.7") ``` -And to provide the password for the DB, you should add this in the Gradle: -DB_PASSWORD_{VARIABLE}, if for example, PERSON is the database name: DB_PASSWORD_PERSON -```groovy -debug { - resValue("string", "DB_PASSWORD_PERSON", "password") -} -``` - Use `debugImplementation` so that it will only compile in your debug build and not in your release build. That’s all, just start the application, you will see in the logcat an entry like follows : @@ -147,11 +139,11 @@ public static void setCustomDatabaseFiles(Context context) { Class debugDB = Class.forName("com.amitshekhar.DebugDB"); Class[] argTypes = new Class[]{HashMap.class}; Method setCustomDatabaseFiles = debugDB.getMethod("setCustomDatabaseFiles", argTypes); - HashMap> customDatabaseFiles = new HashMap<>(); + HashMap customDatabaseFiles = new HashMap<>(); // set your custom database files customDatabaseFiles.put(ExtTestDBHelper.DATABASE_NAME, - new Pair<>(new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + - "/" + ExtTestDBHelper.DATABASE_NAME), "")); + new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + + "/" + ExtTestDBHelper.DATABASE_NAME)); setCustomDatabaseFiles.invoke(null, customDatabaseFiles); } catch (Exception ignore) { diff --git a/debug-db-base/src/main/assets/app.js b/debug-db-base/src/main/assets/app.js index ceb58e5..3e3f4aa 100644 --- a/debug-db-base/src/main/assets/app.js +++ b/debug-db-base/src/main/assets/app.js @@ -79,6 +79,10 @@ function getDBList() { $.ajax({url: "getDbList", success: function(result){ result = JSON.parse(result); + if (!result.supportEncryptedDb) { + $('#password').hide(); + $('#password-label').hide(); + } var dbList = result.rows; $('#db-list').empty(); var isSelectionDone = false; @@ -130,8 +134,8 @@ function openDatabaseAndGetTableList(db, isDownloadable) { isDatabaseSelected = true; } - - $.ajax({url: "getTableList?database="+db, success: function(result){ + var password = $('#password').val(); + $.ajax({url: "getTableList?database="+db+"&password="+password, success: function(result){ result = JSON.parse(result); var tableList = result.rows; diff --git a/debug-db-base/src/main/assets/index.html b/debug-db-base/src/main/assets/index.html index 96e75c2..4128eeb 100644 --- a/debug-db-base/src/main/assets/index.html +++ b/debug-db-base/src/main/assets/index.html @@ -107,6 +107,8 @@
+ +
diff --git a/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java b/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java index ebcbbbf..3511b61 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java +++ b/debug-db-base/src/main/java/com/amitshekhar/DebugDB.java @@ -76,7 +76,7 @@ public static void shutDown() { } } - public static void setCustomDatabaseFiles(HashMap> customDatabaseFiles) { + public static void setCustomDatabaseFiles(HashMap customDatabaseFiles) { if (clientServer != null) { clientServer.setCustomDatabaseFiles(customDatabaseFiles); } diff --git a/debug-db-base/src/main/java/com/amitshekhar/model/Response.java b/debug-db-base/src/main/java/com/amitshekhar/model/Response.java index 9964cf9..16cafdb 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/model/Response.java +++ b/debug-db-base/src/main/java/com/amitshekhar/model/Response.java @@ -33,6 +33,7 @@ public class Response { public boolean isSuccessful; public String error; public int dbVersion; + public boolean supportEncryptedDb; public Response() { diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java b/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java index 665b17b..a309611 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/ClientServer.java @@ -87,7 +87,7 @@ public void run() { } } - public void setCustomDatabaseFiles(HashMap> customDatabaseFiles) { + public void setCustomDatabaseFiles(HashMap customDatabaseFiles) { mRequestHandler.setCustomDatabaseFiles(customDatabaseFiles); } diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java index b6c8076..cc4e7d6 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java @@ -65,8 +65,8 @@ public class RequestHandler { private final DBFactory mDbFactory; private boolean isDbOpened; private SQLiteDB sqLiteDB; - private HashMap> mDatabaseFiles; - private HashMap> mCustomDatabaseFiles; + private HashMap mDatabaseFiles; + private HashMap mCustomDatabaseFiles; private String mSelectedDatabase = null; private HashMap mRoomInMemoryDatabases = new HashMap<>(); @@ -165,7 +165,7 @@ public void handle(Socket socket) throws IOException { } } - public void setCustomDatabaseFiles(HashMap> customDatabaseFiles) { + public void setCustomDatabaseFiles(HashMap customDatabaseFiles) { mCustomDatabaseFiles = customDatabaseFiles; } @@ -178,13 +178,12 @@ private void writeServerError(PrintStream output) { output.flush(); } - private void openDatabase(String database) { + private void openDatabase(String database, String password) { closeDatabase(); if (mRoomInMemoryDatabases.containsKey(database)) { sqLiteDB = new InMemoryDebugSQLiteDB(mRoomInMemoryDatabases.get(database)); } else { - File databaseFile = mDatabaseFiles.get(database).first; - String password = mDatabaseFiles.get(database).second; + File databaseFile = mDatabaseFiles.get(database); sqLiteDB = mDbFactory.create(mContext, databaseFile.getAbsolutePath(), password); } isDbOpened = true; @@ -205,8 +204,10 @@ private String getDBListResponse() { } Response response = new Response(); if (mDatabaseFiles != null) { - for (HashMap.Entry> entry : mDatabaseFiles.entrySet()) { - String[] dbEntry = {entry.getKey(), !entry.getValue().second.equals("") ? "true" : "false", "true"}; + for (HashMap.Entry entry : mDatabaseFiles.entrySet()) { + String[] dbEntry = { entry.getKey(), + Utils.isDbEncrypted(entry.getKey(), mDatabaseFiles) ? "true" : "false", + "true" }; response.rows.add(dbEntry); } } @@ -218,6 +219,7 @@ private String getDBListResponse() { } response.rows.add(new String[]{Constants.APP_SHARED_PREFERENCES, "false", "false"}); response.isSuccessful = true; + response.supportEncryptedDb = mDbFactory.supportEncryptedDb(); return mGson.toJson(response); } @@ -292,10 +294,9 @@ private String executeQueryAndGetResponse(String route) { } private String getTableListResponse(String route) { - String database = null; - if (route.contains("?database=")) { - database = route.substring(route.indexOf("=") + 1, route.length()); - } + Uri uri = Uri.parse(route); + String database = uri.getQueryParameter("database"); + String password = uri.getQueryParameter("password"); Response response; @@ -305,7 +306,7 @@ private String getTableListResponse(String route) { mSelectedDatabase = Constants.APP_SHARED_PREFERENCES; } else { try { - openDatabase(database); + openDatabase(database, password); response = DatabaseHelper.getAllTableName(sqLiteDB); } catch (Exception e) { response = new Response(); @@ -397,7 +398,7 @@ private String deleteSelectedDatabaseAndGetResponse() { try { closeDatabase(); - File dbFile = mDatabaseFiles.get(mSelectedDatabase).first; + File dbFile = mDatabaseFiles.get(mSelectedDatabase); response.isSuccessful = dbFile.delete(); if (response.isSuccessful) { diff --git a/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java b/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java index 0378184..ebff096 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java +++ b/debug-db-base/src/main/java/com/amitshekhar/sqlite/DBFactory.java @@ -6,4 +6,6 @@ public interface DBFactory { SQLiteDB create(Context context, String path, String password); + boolean supportEncryptedDb(); + } diff --git a/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseFileProvider.java b/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseFileProvider.java index 473d44a..82c4791 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseFileProvider.java +++ b/debug-db-base/src/main/java/com/amitshekhar/utils/DatabaseFileProvider.java @@ -20,10 +20,8 @@ package com.amitshekhar.utils; import android.content.Context; -import android.util.Pair; import java.io.File; -import java.text.MessageFormat; import java.util.HashMap; /** @@ -32,39 +30,19 @@ public class DatabaseFileProvider { - private final static String DB_PASSWORD_RESOURCE = "DB_PASSWORD_{0}"; - private DatabaseFileProvider() { // This class in not publicly instantiable } - public static HashMap> getDatabaseFiles(Context context) { - HashMap> databaseFiles = new HashMap<>(); + public static HashMap getDatabaseFiles(Context context) { + HashMap databaseFiles = new HashMap<>(); try { for (String databaseName : context.databaseList()) { - String password = getDbPasswordFromStringResources(context, databaseName); - databaseFiles.put(databaseName, new Pair<>(context.getDatabasePath(databaseName), password)); + databaseFiles.put(databaseName, context.getDatabasePath(databaseName)); } } catch (Exception e) { e.printStackTrace(); } return databaseFiles; } - - private static String getDbPasswordFromStringResources(Context context, String name) { - String nameWithoutExt = name; - if (nameWithoutExt.endsWith(".db")) { - nameWithoutExt = nameWithoutExt.substring(0, nameWithoutExt.lastIndexOf('.')); - } - String resourceName = MessageFormat.format(DB_PASSWORD_RESOURCE, nameWithoutExt.toUpperCase()); - String password = ""; - - int resourceId = context.getResources().getIdentifier(resourceName, "string", context.getPackageName()); - - if (resourceId != 0) { - password = context.getString(resourceId); - } - - return password; - } } diff --git a/debug-db-base/src/main/java/com/amitshekhar/utils/Utils.java b/debug-db-base/src/main/java/com/amitshekhar/utils/Utils.java index da85430..d19fe5a 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/utils/Utils.java +++ b/debug-db-base/src/main/java/com/amitshekhar/utils/Utils.java @@ -21,16 +21,15 @@ import android.content.res.AssetManager; import android.text.TextUtils; -import android.util.Log; -import android.util.Pair; import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; +import java.util.Map; /** * Created by amitshekhar on 06/02/17. @@ -83,30 +82,24 @@ public static byte[] loadContent(String fileName, AssetManager assetManager) thr } } - public static byte[] getDatabase(String selectedDatabase, HashMap> databaseFiles) { + public static byte[] getDatabase(String selectedDatabase, Map databaseFiles) { if (TextUtils.isEmpty(selectedDatabase) || !databaseFiles.containsKey(selectedDatabase)) { return null; } byte[] byteArray = new byte[0]; - try { - File file = databaseFiles.get(selectedDatabase).first; + File file = databaseFiles.get(selectedDatabase); - byteArray = null; - try { - InputStream inputStream = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[(int) file.length()]; - int bytesRead; + try (InputStream is = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + byte[] b = new byte[(int) file.length()]; + int bytesRead; - while ((bytesRead = inputStream.read(b)) != -1) { - bos.write(b, 0, bytesRead); - } - - byteArray = bos.toByteArray(); - } catch (IOException e) { - Log.e(TAG, "getDatabase: ", e); + while ((bytesRead = is.read(b)) != -1) { + bos.write(b, 0, bytesRead); } + + byteArray = bos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } @@ -114,4 +107,19 @@ public static byte[] getDatabase(String selectedDatabase, HashMap databaseFiles) { + if (TextUtils.isEmpty(database) || !databaseFiles.containsKey(database)) { + return false; + } + File file = databaseFiles.get(database); + try (DataInputStream is = new DataInputStream(new FileInputStream(file))) { + byte[] b = new byte[16]; + is.readFully(b); + String string = new String(b); + return !"SQLite format 3\000".equals(string); + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } } diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java index af0294a..d075147 100644 --- a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java @@ -15,4 +15,8 @@ public SQLiteDB create(Context context, String path, String password) { return new DebugEncryptSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, password, null)); } + @Override + public boolean supportEncryptedDb() { + return true; + } } diff --git a/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java index 3a797f5..e026a53 100644 --- a/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java +++ b/debug-db/src/main/java/com/amitshekhar/debug/sqlite/DebugDBFactory.java @@ -13,4 +13,8 @@ public SQLiteDB create(Context context, String path, String password) { return new DebugSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, null)); } + @Override + public boolean supportEncryptedDb() { + return false; + } } diff --git a/sample-app-encrypt/build.gradle b/sample-app-encrypt/build.gradle index b048340..e6964dd 100644 --- a/sample-app-encrypt/build.gradle +++ b/sample-app-encrypt/build.gradle @@ -14,7 +14,6 @@ android { buildTypes { debug { resValue("string", "PORT_NUMBER", "8080") - resValue("string", "DB_PASSWORD_PERSON", "a_password") } release { minifyEnabled false diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java index 1c448a6..73f91f7 100644 --- a/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/utils/Utils.java @@ -61,11 +61,11 @@ public static void setCustomDatabaseFiles(Context context) { Class debugDB = Class.forName("com.amitshekhar.DebugDB"); Class[] argTypes = new Class[]{HashMap.class}; Method setCustomDatabaseFiles = debugDB.getMethod("setCustomDatabaseFiles", argTypes); - HashMap> customDatabaseFiles = new HashMap<>(); + HashMap customDatabaseFiles = new HashMap<>(); // set your custom database files customDatabaseFiles.put(ExtTestDBHelper.DATABASE_NAME, - new Pair<>(new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + - "/" + ExtTestDBHelper.DATABASE_NAME), "")); + new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + + "/" + ExtTestDBHelper.DATABASE_NAME)); setCustomDatabaseFiles.invoke(null, customDatabaseFiles); } catch (Exception ignore) { diff --git a/sample-app/src/main/java/com/sample/utils/Utils.java b/sample-app/src/main/java/com/sample/utils/Utils.java index e706a9d..6a9b083 100644 --- a/sample-app/src/main/java/com/sample/utils/Utils.java +++ b/sample-app/src/main/java/com/sample/utils/Utils.java @@ -61,11 +61,11 @@ public static void setCustomDatabaseFiles(Context context) { Class debugDB = Class.forName("com.amitshekhar.DebugDB"); Class[] argTypes = new Class[]{HashMap.class}; Method setCustomDatabaseFiles = debugDB.getMethod("setCustomDatabaseFiles", argTypes); - HashMap> customDatabaseFiles = new HashMap<>(); + HashMap customDatabaseFiles = new HashMap<>(); // set your custom database files customDatabaseFiles.put(ExtTestDBHelper.DATABASE_NAME, - new Pair<>(new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + - "/" + ExtTestDBHelper.DATABASE_NAME), "")); + new File(context.getFilesDir() + "/" + ExtTestDBHelper.DIR_NAME + + "/" + ExtTestDBHelper.DATABASE_NAME)); setCustomDatabaseFiles.invoke(null, customDatabaseFiles); } catch (Exception ignore) { From a25949abaea31325768a5b7dd0d3c034ec9908ea Mon Sep 17 00:00:00 2001 From: Sergey Valiulik Date: Sat, 30 Nov 2024 10:35:49 +0100 Subject: [PATCH 3/4] Update SQLCipher to the latest version --- build.gradle | 8 ++--- debug-db-encrypt/build.gradle | 5 ++-- .../encrypt/sqlite/DebugDBEncryptFactory.java | 10 ++++--- .../encrypt/sqlite/DebugEncryptSQLiteDB.java | 3 +- sample-app-encrypt/build.gradle | 3 +- .../encrypt/database/PersonDBHelper.java | 30 +++++++++++-------- 6 files changed, 33 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 4029db9..2106402 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ task clean(type: Delete) { delete rootProject.buildDir } ext { - compileSdk = 33 - targetSdk = 33 - minSdk = 14 -} \ No newline at end of file + compileSdk = 34 + targetSdk = 34 + minSdk = 21 +} diff --git a/debug-db-encrypt/build.gradle b/debug-db-encrypt/build.gradle index 8b1687e..b1f5bc8 100644 --- a/debug-db-encrypt/build.gradle +++ b/debug-db-encrypt/build.gradle @@ -19,8 +19,9 @@ android { dependencies { api project(':debug-db-base') - implementation 'net.zetetic:android-database-sqlcipher:3.5.9' + implementation 'androidx.sqlite:sqlite:2.4.0' + implementation 'net.zetetic:sqlcipher-android:4.6.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.5.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' -} \ No newline at end of file +} diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java index d075147..138f751 100644 --- a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugDBEncryptFactory.java @@ -4,15 +4,17 @@ import com.amitshekhar.sqlite.DBFactory; import com.amitshekhar.sqlite.SQLiteDB; - -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; public class DebugDBEncryptFactory implements DBFactory { + static { + System.loadLibrary("sqlcipher"); + } + @Override public SQLiteDB create(Context context, String path, String password) { - SQLiteDatabase.loadLibs(context); - return new DebugEncryptSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, password, null)); + return new DebugEncryptSQLiteDB(SQLiteDatabase.openOrCreateDatabase(path, password, null, null)); } @Override diff --git a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java index 5c387cb..1f00e57 100644 --- a/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java +++ b/debug-db-encrypt/src/main/java/com/amitshekhar/debug/encrypt/sqlite/DebugEncryptSQLiteDB.java @@ -5,8 +5,7 @@ import android.database.SQLException; import com.amitshekhar.sqlite.SQLiteDB; - -import net.sqlcipher.database.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteDatabase; /** * Created by anandgaurav on 12/02/18. diff --git a/sample-app-encrypt/build.gradle b/sample-app-encrypt/build.gradle index e6964dd..1b1d73d 100644 --- a/sample-app-encrypt/build.gradle +++ b/sample-app-encrypt/build.gradle @@ -24,8 +24,9 @@ android { dependencies { debugImplementation project(':debug-db-encrypt') + implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'net.zetetic:android-database-sqlcipher:3.5.9' + implementation 'net.zetetic:sqlcipher-android:4.6.1' implementation "androidx.room:room-runtime:2.5.0" annotationProcessor "androidx.room:room-compiler:2.5.0" testImplementation 'junit:junit:4.13.2' diff --git a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java index bb95c46..5e9713d 100644 --- a/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java +++ b/sample-app-encrypt/src/main/java/com/sample/encrypt/database/PersonDBHelper.java @@ -19,13 +19,14 @@ package com.sample.encrypt.database; +import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; -import net.sqlcipher.DatabaseUtils; -import net.sqlcipher.database.SQLiteDatabase; -import net.sqlcipher.database.SQLiteOpenHelper; +import net.zetetic.database.DatabaseUtils; +import net.zetetic.database.sqlcipher.SQLiteDatabase; +import net.zetetic.database.sqlcipher.SQLiteOpenHelper; import java.util.ArrayList; @@ -39,10 +40,12 @@ public class PersonDBHelper extends SQLiteOpenHelper { public static final String PERSON_COLUMN_ADDRESS = "address"; private static final String DB_PASSWORD = "a_password"; - public PersonDBHelper(Context context) { + static { + System.loadLibrary("sqlcipher"); + } - super(context, DATABASE_NAME, null, 1); - SQLiteDatabase.loadLibs(context); + public PersonDBHelper(Context context) { + super(context, DATABASE_NAME, DB_PASSWORD, null, 1, 0, null, null, false); } @Override @@ -60,7 +63,7 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public boolean insertPerson(String firstName, String lastName, String address) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("first_name", firstName); contentValues.put("last_name", lastName); @@ -71,19 +74,19 @@ public boolean insertPerson(String firstName, String lastName, String address) { } public Cursor getData(int id) { - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getReadableDatabase(); Cursor res = db.rawQuery("select * from person where id=" + id + "", null); return res; } public int numberOfRows() { - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getReadableDatabase(); int numRows = (int) DatabaseUtils.queryNumEntries(db, PERSON_TABLE_NAME); return numRows; } public boolean updatePerson(Integer id, String firstName, String lastName, String address, float mileage) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("first_name", firstName); contentValues.put("last_name", lastName); @@ -94,16 +97,17 @@ public boolean updatePerson(Integer id, String firstName, String lastName, Strin } public Integer deletePerson(Integer id) { - SQLiteDatabase db = this.getWritableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getWritableDatabase(); return db.delete("person", "id = ? ", new String[]{Integer.toString(id)}); } + @SuppressLint("Range") public ArrayList getAllPerson() { ArrayList arrayList = new ArrayList<>(); - SQLiteDatabase db = this.getReadableDatabase(DB_PASSWORD); + SQLiteDatabase db = this.getReadableDatabase(); Cursor res = db.rawQuery("select * from person", null); res.moveToFirst(); @@ -119,7 +123,7 @@ public ArrayList getAllPerson() { } public int count() { - SQLiteDatabase db = getReadableDatabase(DB_PASSWORD); + SQLiteDatabase db = getReadableDatabase(); Cursor cursor = db.rawQuery("select * from person", null); try { if (cursor != null && cursor.getCount() > 0) { From 8be5a8bd63bf484e17b124e905ea6aa65b9ce76f Mon Sep 17 00:00:00 2001 From: Sergey Valiulik Date: Sat, 30 Nov 2024 19:35:50 +0100 Subject: [PATCH 4/4] Pass DB password for encrypted DB only --- .../main/java/com/amitshekhar/server/RequestHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java index cc4e7d6..f53f322 100644 --- a/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java +++ b/debug-db-base/src/main/java/com/amitshekhar/server/RequestHandler.java @@ -23,7 +23,6 @@ import android.content.res.AssetManager; import android.net.Uri; import android.text.TextUtils; -import android.util.Pair; import androidx.sqlite.db.SupportSQLiteDatabase; @@ -306,7 +305,11 @@ private String getTableListResponse(String route) { mSelectedDatabase = Constants.APP_SHARED_PREFERENCES; } else { try { - openDatabase(database, password); + if (Utils.isDbEncrypted(database, mDatabaseFiles)) { + openDatabase(database, password); + } else { + openDatabase(database, null); + } response = DatabaseHelper.getAllTableName(sqLiteDB); } catch (Exception e) { response = new Response();