From 93a11ca798d79914df56553134c051d36778f8fc Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Fri, 27 Apr 2018 14:46:45 +0200 Subject: [PATCH 1/6] Database implementation - error with AUTO_INCREMENT on Category --- .../backup/GoogleDriveActivity.java | 86 ------------------- .../securepass/io/IOManager.java | 10 +-- .../io/database/DatabaseManager.java | 1 - .../securepass/util/values/Constants.java | 3 +- .../views/activities/LauncherActivity.java | 1 + .../views/fragments/PasswordRegistration.java | 15 ++-- APP/app/src/main/res/raw/database_script.sql | 44 +++++----- 7 files changed, 36 insertions(+), 124 deletions(-) delete mode 100644 APP/app/src/main/java/javinator9889/securepass/backup/GoogleDriveActivity.java diff --git a/APP/app/src/main/java/javinator9889/securepass/backup/GoogleDriveActivity.java b/APP/app/src/main/java/javinator9889/securepass/backup/GoogleDriveActivity.java deleted file mode 100644 index dc7a7f3..0000000 --- a/APP/app/src/main/java/javinator9889/securepass/backup/GoogleDriveActivity.java +++ /dev/null @@ -1,86 +0,0 @@ -package javinator9889.securepass.backup; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.widget.Toast; - -import com.google.android.gms.auth.api.signin.GoogleSignIn; -import com.google.android.gms.auth.api.signin.GoogleSignInClient; -import com.google.android.gms.auth.api.signin.GoogleSignInOptions; -import com.google.android.gms.drive.Drive; -import com.google.android.gms.drive.DriveClient; -import com.google.android.gms.drive.DriveResourceClient; - -import javinator9889.securepass.R; - -/** - * Created by Javinator9889 on 22/04/2018. - */ -public class GoogleDriveActivity extends AppCompatActivity { - private static final String TAG = "drive-quickstart"; - private static final int REQUEST_CODE_SIGN_IN = 0; - private static final int REQUEST_CODE_CAPTURE_IMAGE = 1; - private static final int REQUEST_CODE_CREATOR = 2; - - private GoogleSignInClient mGoogleSignInClient; - private DriveClient mDriveClient; - private DriveResourceClient mDriveResourceClient; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.drive_client); - mGoogleSignInClient = buildGoogleSignInClient(); - Toast.makeText(this, "SignIn obtained", Toast.LENGTH_LONG).show(); - startActivityForResult(mGoogleSignInClient.getSignInIntent(), REQUEST_CODE_SIGN_IN); - } - - private GoogleSignInClient buildGoogleSignInClient() { - GoogleSignInOptions signInOptions = - new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestScopes(Drive.SCOPE_FILE) - .build(); - return GoogleSignIn.getClient(this, signInOptions); - } - - @Override - protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - Toast.makeText(this, "Paso 1", Toast.LENGTH_LONG).show(); - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case REQUEST_CODE_SIGN_IN: - Toast.makeText(this, "Paso 2", Toast.LENGTH_LONG).show(); - Log.i(TAG, "Sign in request code"); - // Called after user is signed in. - if (resultCode == RESULT_OK) { - Toast.makeText(this, "Paso 3", Toast.LENGTH_LONG).show(); - Log.i(TAG, "Signed in successfully."); - // Use the last signed in account here since it already have a Drive scope. - mDriveClient = Drive.getDriveClient(this, GoogleSignIn.getLastSignedInAccount(this)); - // Build a drive resource client. - mDriveResourceClient = - Drive.getDriveResourceClient(this, GoogleSignIn.getLastSignedInAccount(this)); - Toast.makeText(this, "Paso 4", Toast.LENGTH_LONG).show(); - // Start camera. - } - break; - case REQUEST_CODE_CAPTURE_IMAGE: - Log.i(TAG, "capture image request code"); - // Called after a photo has been taken. - if (resultCode == Activity.RESULT_OK) { - - } - break; - case REQUEST_CODE_CREATOR: - Log.i(TAG, "creator request code"); - // Called after a file is saved to Drive. - if (resultCode == RESULT_OK) { - - } - break; - } - } -} diff --git a/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java b/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java index 49fa854..71e558c 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java @@ -29,11 +29,11 @@ public class IOManager { private Context activityContext; private InputStream sqlScriptInputFile; - private File filesDir; + private File filesCache; private IOManager(@NonNull Context activityContext) { this.activityContext = activityContext; - this.filesDir = activityContext.getFilesDir(); + this.filesCache = activityContext.getCacheDir(); int sqlScript = R.raw.database_script; this.sqlScriptInputFile = activityContext.getResources().openRawResource(sqlScript); } @@ -65,7 +65,7 @@ public String readPassword() { } public void writeDownloadedClass(@NonNull InputStream from) { - String filename = filesDir.getAbsolutePath() + "/class.bck"; + String filename = filesCache.getAbsolutePath() + "/class.bck"; try { OutputStream to = new FileOutputStream(filename); IOUtils.copyStream(from, to); @@ -76,7 +76,7 @@ public void writeDownloadedClass(@NonNull InputStream from) { } public InputStream readDownloadedClass() { - String filename = filesDir.getAbsolutePath() + "/class.bck"; + String filename = filesCache.getAbsolutePath() + "/class.bck"; try { return new FileInputStream(filename); } catch (FileNotFoundException e) { @@ -86,7 +86,7 @@ public InputStream readDownloadedClass() { } public void deleteDownloadedClass() { - String filename = filesDir.getAbsolutePath() + "/class.bck"; + String filename = filesCache.getAbsolutePath() + "/class.bck"; File fileToDelete = new File(filename); if (!fileToDelete.delete()) diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java index 141843b..7267d47 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java @@ -51,7 +51,6 @@ public void run() { } catch (IOException e) { e.printStackTrace(); } - //tempDatabaseFile.mkdirs(); SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( tempDatabaseFile, databasePassword, diff --git a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java index dee9292..0143f45 100644 --- a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java +++ b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java @@ -12,7 +12,8 @@ public class Constants { public static final class SQL { public static String DB_FILENAME = "SecurePass.db"; public static String DB_INIT_THREAD_NAME = "DB Initializer"; - public static String DB_DEFAULT_CATEGORY = "INSERT IF NOT EXISTS INTO Category VALUE ?"; + public static String DB_DEFAULT_CATEGORY = "INSERT IF NOT EXISTS INTO " + + "Category(name) VALUE ?"; // INSERT SQL OPERATIONS public static String DB_NEW_ENTRY = "INSERT INTO Entry VALUES(?, ?, ?, ?, ?)"; diff --git a/APP/app/src/main/java/javinator9889/securepass/views/activities/LauncherActivity.java b/APP/app/src/main/java/javinator9889/securepass/views/activities/LauncherActivity.java index e943ac6..b6fdea8 100644 --- a/APP/app/src/main/java/javinator9889/securepass/views/activities/LauncherActivity.java +++ b/APP/app/src/main/java/javinator9889/securepass/views/activities/LauncherActivity.java @@ -17,6 +17,7 @@ public class LauncherActivity extends AppCompatActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ISharedPreferencesManager preferencesManager = SharedPreferencesManager.newInstance(); + preferencesManager.databaseInitialized(false); if (!preferencesManager.isApplicationInitialized()) { Intent firstSetupLauncher = new Intent(this, FirstSetup.class); //Intent firstSetupLauncher = new Intent(this, DriveContent.class); diff --git a/APP/app/src/main/java/javinator9889/securepass/views/fragments/PasswordRegistration.java b/APP/app/src/main/java/javinator9889/securepass/views/fragments/PasswordRegistration.java index 76c3b63..e20b4d5 100644 --- a/APP/app/src/main/java/javinator9889/securepass/views/fragments/PasswordRegistration.java +++ b/APP/app/src/main/java/javinator9889/securepass/views/fragments/PasswordRegistration.java @@ -70,22 +70,23 @@ public void onClick(View v) { .hashString(this.firstPasswordEntry.getText().toString(), StandardCharsets.UTF_8).toString(); io.storePassword(passwordWithHashApplied); - Intent googleDriveLauncher = new Intent(this, DriveContent.class); + /*Intent googleDriveLauncher = new Intent(this, DriveContent.class); startActivity(googleDriveLauncher); - savingPasswordProgress.dismiss(); - finish(); - /*DatabaseManager manager = DatabaseManager + savingPasswordProgress.dismiss();*/ + //finish(); + // This will try to create a DB + DatabaseManager manager = DatabaseManager .newInstance(this, passwordWithHashApplied); Thread databaseThread = manager.getDatabaseInitializer(); try { databaseThread.join(); - ISharedPreferencesManager preferencesManager = SharedPreferencesManager + /*ISharedPreferencesManager preferencesManager = SharedPreferencesManager .newInstance(); - preferencesManager.databaseInitialized(true); + preferencesManager.databaseInitialized(true);*/ savingPasswordProgress.dismiss(); } catch (InterruptedException e) { e.printStackTrace(); - }*/ + } } else Toast.makeText(v.getContext(), R.string.passwords_does_not_match, diff --git a/APP/app/src/main/res/raw/database_script.sql b/APP/app/src/main/res/raw/database_script.sql index 68919da..dae2392 100644 --- a/APP/app/src/main/res/raw/database_script.sql +++ b/APP/app/src/main/res/raw/database_script.sql @@ -1,27 +1,23 @@ -- ----------------------------------------------------- -- Schema securepassdb -- ----------------------------------------------------- - --- ----------------------------------------------------- --- Schema securepassdb +-- SCHEMAS ARE NOT ALLOWED ON SQLite -- ----------------------------------------------------- --- CREATE SCHEMA IF NOT EXISTS `securepassdb` DEFAULT CHARACTER SET utf8 ; --- USE `securepassdb` ; -- ----------------------------------------------------- -- Table `securepassdb`.`Category` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `securepassdb`.`Category` ( - `idCategory` INT NOT NULL DEFAULT 0, +CREATE TABLE IF NOT EXISTS `Category` ( + `idCategory` INT NOT NULL DEFAULT 0, -- NO SENSE - MUST BE AUTOINCREMENT `name` VARCHAR(45) NULL, - PRIMARY KEY (`idCategory`)) -ENGINE = InnoDB; + PRIMARY KEY (`idCategory`)); +-- ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `securepassdb`.`Entry` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `securepassdb`.`Entry` ( +CREATE TABLE IF NOT EXISTS `Entry` ( `idEntry` INT NOT NULL AUTO_INCREMENT, `account` VARCHAR(180) NOT NULL, `password` VARCHAR(180) NOT NULL, @@ -32,16 +28,16 @@ CREATE TABLE IF NOT EXISTS `securepassdb`.`Entry` ( INDEX `fk_Entry_Category1_idx` (`cidCategory` ASC), CONSTRAINT `fk_Entry_Category1` FOREIGN KEY (`cidCategory`) - REFERENCES `securepassdb`.`Category` (`idCategory`) + REFERENCES `Category` (`idCategory`) ON DELETE NO ACTION - ON UPDATE CASCADE) -ENGINE = InnoDB; + ON UPDATE CASCADE); +-- ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `securepassdb`.`QRCode` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `securepassdb`.`QRCode` ( +CREATE TABLE IF NOT EXISTS `QRCode` ( `idQRCode` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NOT NULL, `description` VARCHAR(180) NULL, @@ -51,26 +47,26 @@ CREATE TABLE IF NOT EXISTS `securepassdb`.`QRCode` ( INDEX `fk_QRCode_Entry1_idx` (`fidEntry` ASC), CONSTRAINT `fk_QRCode_Entry1` FOREIGN KEY (`fidEntry`) - REFERENCES `securepassdb`.`Entry` (`idEntry`) + REFERENCES `Entry` (`idEntry`) ON DELETE CASCADE - ON UPDATE NO ACTION) -ENGINE = InnoDB; + ON UPDATE NO ACTION); +-- ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `securepassdb`.`SecurityCodes` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `securepassdb`.`SecurityCodes` ( +CREATE TABLE IF NOT EXISTS `SecurityCodes` ( `idSecurityCodes` INT NOT NULL AUTO_INCREMENT, `accountName` VARCHAR(45) NOT NULL, - PRIMARY KEY (`idSecurityCodes`)) -ENGINE = InnoDB; + PRIMARY KEY (`idSecurityCodes`)); +-- ENGINE = InnoDB; -- ----------------------------------------------------- -- Table `securepassdb`.`Fields` -- ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS `securepassdb`.`Fields` ( +CREATE TABLE IF NOT EXISTS `Fields` ( `idField` INT NOT NULL AUTO_INCREMENT, `code` VARCHAR(180) NOT NULL, `used` TINYINT NOT NULL DEFAULT 0, @@ -79,10 +75,10 @@ CREATE TABLE IF NOT EXISTS `securepassdb`.`Fields` ( INDEX `fk_Fields_SecurityCodes1_idx` (`fidSecurityCodes` ASC), CONSTRAINT `fk_Fields_SecurityCodes1` FOREIGN KEY (`fidSecurityCodes`) - REFERENCES `securepassdb`.`SecurityCodes` (`idSecurityCodes`) + REFERENCES `SecurityCodes` (`idSecurityCodes`) ON DELETE CASCADE - ON UPDATE NO ACTION) -ENGINE = InnoDB; + ON UPDATE NO ACTION); +-- ENGINE = InnoDB; SET SQL_MODE=@OLD_SQL_MODE; From 9c95059112442b39b5672236657b9f85fb4addfa Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Sun, 29 Apr 2018 21:04:22 +0200 Subject: [PATCH 2/6] New database model - operations --- .../securepass/io/database/DatabaseOperations.java | 14 +++++++++++--- .../securepass/util/values/Constants.java | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java index f988fe7..5725e6c 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java @@ -1,5 +1,6 @@ package javinator9889.securepass.io.database; +import android.content.ContentValues; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -41,14 +42,21 @@ public static DatabaseOperations newInstance(DatabaseManager databaseManagerInst public void registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, @NonNull Category entryCategory) { - Object[] params = new Object[]{ + /*Object[] params = new Object[]{ accountName, accountPassword, icon, description, entryCategory.getId() - }; - database.execSQL(SQL.DB_NEW_ENTRY, params); + };*/ + ContentValues params = new ContentValues(); + params.put("account", accountName); + params.put("password", accountPassword); + params.put("icon", icon); + params.put("description", description); + params.put("cidCategory", entryCategory.getId()); + database.insert("Entry", null, params); + //database.execSQL(SQL.DB_NEW_ENTRY, params); } public void registerNewCategory(@NonNull String name) { diff --git a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java index 0143f45..628d1e6 100644 --- a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java +++ b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java @@ -13,13 +13,13 @@ public static final class SQL { public static String DB_FILENAME = "SecurePass.db"; public static String DB_INIT_THREAD_NAME = "DB Initializer"; public static String DB_DEFAULT_CATEGORY = "INSERT IF NOT EXISTS INTO " + - "Category(name) VALUE ?"; + "Category(name) VALUES (?)"; // INSERT SQL OPERATIONS public static String DB_NEW_ENTRY = "INSERT INTO Entry VALUES(?, ?, ?, ?, ?)"; - public static String DB_NEW_CATEGORY = "INSERT INTO Category VALUE(?)"; + public static String DB_NEW_CATEGORY = "INSERT INTO Category VALUES (?)"; public static String DB_NEW_QR = "INSERT INTO QRCode VALUES (?, ?, ?, ?)"; - public static String DB_NEW_SECURITY_CODE = "INSERT INTO SecurityCodes VALUE (?)"; + public static String DB_NEW_SECURITY_CODE = "INSERT INTO SecurityCodes VALUES (?)"; public static String DB_NEW_FIELD = "INSERT INTO Fields VALUES (?, ?, ?)"; //DELETE SQL OPERATIONS From bf3cc8ce24180653ce164eea29fccb44d04f1c98 Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Sun, 29 Apr 2018 21:06:05 +0200 Subject: [PATCH 3/6] Methods need a return value --- .../securepass/io/database/DatabaseOperations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java index 5725e6c..27b1611 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java @@ -39,7 +39,7 @@ public static DatabaseOperations newInstance(DatabaseManager databaseManagerInst return new DatabaseOperations(databaseManagerInstance); } - public void registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, + public long registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, @NonNull Category entryCategory) { /*Object[] params = new Object[]{ @@ -55,7 +55,7 @@ public void registerNewAccount(@NonNull String accountName, @NonNull String acco params.put("icon", icon); params.put("description", description); params.put("cidCategory", entryCategory.getId()); - database.insert("Entry", null, params); + return database.insert("Entry", null, params); //database.execSQL(SQL.DB_NEW_ENTRY, params); } From 9f9dd51dd6364f884ba7e4b2a5a9f3c769b1626c Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Wed, 2 May 2018 16:20:57 +0200 Subject: [PATCH 4/6] Database methods redefined - doing tests --- .../io/database/DatabaseManager.java | 18 +++++++++++------ .../io/database/DatabaseOperations.java | 6 ++++++ APP/app/src/main/res/raw/database_script.sql | 2 +- .../Database files/DATABASE_MODEL.mwb | Bin 11479 -> 11501 bytes .../Database files/DATABASE_SCRIPT.sql | 19 +++++++++++++++++- 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java index 7267d47..d95a795 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java @@ -45,14 +45,15 @@ private void initDB() { @Override public void run() { SQLiteDatabase.loadLibs(databaseContext); - File tempDatabaseFile = databaseContext.getDatabasePath(Constants.SQL.DB_FILENAME); + databaseFile = databaseContext + .getDatabasePath(Constants.SQL.DB_FILENAME); try { - tempDatabaseFile.createNewFile(); + databaseFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( - tempDatabaseFile, + databaseFile, databasePassword, null); String databaseScript; @@ -62,13 +63,12 @@ public void run() { if (!preferencesManager.isDatabaseInitialized()) { databaseScript = IOManager.newInstance(databaseContext).loadSQLScript(); database.execSQL(databaseScript); - database.execSQL(Constants.SQL.DB_DEFAULT_CATEGORY, new Object[]{"Global"}); + DatabaseManager.this.createDefaultCategory(); } } catch (IOException e) { throw new RuntimeException(e.getCause()); } finally { database.close(); - DatabaseManager.this.databaseFile = tempDatabaseFile; } } }); @@ -87,7 +87,6 @@ public Thread getDatabaseInitializer() { } private class ThreadExceptionHandler implements Thread.UncaughtExceptionHandler { - @Override public void uncaughtException(Thread t, Throwable e) { Log.e(t.getName(), "Exception in thread \"" + t.getName() + "\" with " + @@ -95,4 +94,11 @@ public void uncaughtException(Thread t, Throwable e) { e.printStackTrace(); } } + + private void createDefaultCategory() { + DatabaseOperations operations = DatabaseOperations.newInstance(this); + long id = operations.registerDefaultCategory(); + Log.d("DB", "Category ID: " + id); + operations.finishConnection(); + } } diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java index 27b1611..677dec2 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java @@ -39,6 +39,12 @@ public static DatabaseOperations newInstance(DatabaseManager databaseManagerInst return new DatabaseOperations(databaseManagerInstance); } + public long registerDefaultCategory() { + ContentValues params = new ContentValues(); + params.put("name", "Global"); + return database.insert("Category", null, params); + } + public long registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, @NonNull Category entryCategory) { diff --git a/APP/app/src/main/res/raw/database_script.sql b/APP/app/src/main/res/raw/database_script.sql index dae2392..17c5285 100644 --- a/APP/app/src/main/res/raw/database_script.sql +++ b/APP/app/src/main/res/raw/database_script.sql @@ -8,7 +8,7 @@ -- Table `securepassdb`.`Category` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Category` ( - `idCategory` INT NOT NULL DEFAULT 0, -- NO SENSE - MUST BE AUTOINCREMENT + `idCategory` INT NOT NULL DEFAULT 0, `name` VARCHAR(45) NULL, PRIMARY KEY (`idCategory`)); -- ENGINE = InnoDB; diff --git a/DESIGN/DATABASE/Database files/DATABASE_MODEL.mwb b/DESIGN/DATABASE/Database files/DATABASE_MODEL.mwb index fa5b3983e7f90188d0dfab345ae5200fa81d756c..0378677fc128c34ee7a643253a9b8f481d4fc5dc 100644 GIT binary patch delta 9231 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 diff --git a/DESIGN/DATABASE/Database files/DATABASE_SCRIPT.sql b/DESIGN/DATABASE/Database files/DATABASE_SCRIPT.sql index f341553..0c9ff07 100644 --- a/DESIGN/DATABASE/Database files/DATABASE_SCRIPT.sql +++ b/DESIGN/DATABASE/Database files/DATABASE_SCRIPT.sql @@ -1,3 +1,12 @@ +-- MySQL Script generated by MySQL Workbench +-- Wed May 2 15:52:00 2018 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + -- ----------------------------------------------------- -- Schema securepassdb -- ----------------------------------------------------- @@ -8,11 +17,19 @@ CREATE SCHEMA IF NOT EXISTS `securepassdb` DEFAULT CHARACTER SET utf8 ; USE `securepassdb` ; +-- ----------------------------------------------------- +-- Table `securepassdb`.`Application` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `securepassdb`.`Application` ( + `password` CHAR(64) NOT NULL) +ENGINE = InnoDB; + + -- ----------------------------------------------------- -- Table `securepassdb`.`Category` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `securepassdb`.`Category` ( - `idCategory` INT NOT NULL DEFAULT 0, + `idCategory` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, PRIMARY KEY (`idCategory`)) ENGINE = InnoDB; From 2cf759f5425b61087c660e3c07912e3ab2f41304 Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Sun, 20 May 2018 13:22:11 +0200 Subject: [PATCH 5/6] Updated methods for accessing to DB --- .../io/database/DatabaseOperations.java | 249 +++++++++++------- .../securepass/util/values/Constants.java | 71 +++-- .../util/values/DatabaseTables.java | 8 + 3 files changed, 214 insertions(+), 114 deletions(-) create mode 100644 APP/app/src/main/java/javinator9889/securepass/util/values/DatabaseTables.java diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java index 677dec2..30631d0 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java @@ -13,10 +13,10 @@ import javinator9889.securepass.data.entry.Category; import javinator9889.securepass.data.entry.Entry; -import javinator9889.securepass.data.entry.QRCode; import javinator9889.securepass.data.secret.Field; import javinator9889.securepass.data.secret.SecurityCode; import javinator9889.securepass.util.values.Constants.SQL; +import javinator9889.securepass.util.values.DatabaseTables; /** * Created by Javinator9889 on 29/03/2018. @@ -40,136 +40,123 @@ public static DatabaseOperations newInstance(DatabaseManager databaseManagerInst } public long registerDefaultCategory() { - ContentValues params = new ContentValues(); - params.put("name", "Global"); - return database.insert("Category", null, params); + ContentValues params = setParams(DatabaseTables.CATEGORY, "Global"); + return database.insert(SQL.CATEGORY.NAME, null, params); } public long registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, @NonNull Category entryCategory) { - /*Object[] params = new Object[]{ - accountName, - accountPassword, - icon, - description, - entryCategory.getId() - };*/ - ContentValues params = new ContentValues(); - params.put("account", accountName); - params.put("password", accountPassword); - params.put("icon", icon); - params.put("description", description); - params.put("cidCategory", entryCategory.getId()); - return database.insert("Entry", null, params); - //database.execSQL(SQL.DB_NEW_ENTRY, params); + ContentValues params = setParams(DatabaseTables.ENTRY, accountName, accountPassword, icon, + description, entryCategory.getId()); + return database.insert(SQL.ENTRY.NAME, null, params); } - public void registerNewCategory(@NonNull String name) { - Object[] params = new Object[]{name}; - database.execSQL(SQL.DB_NEW_CATEGORY, params); + public long registerNewCategory(@NonNull String name) { + ContentValues params = setParams(DatabaseTables.CATEGORY, name); + return database.insert(SQL.CATEGORY.NAME, null, params); } - public void registerQRCode(@NonNull Entry sourceEntry, @NonNull String name, + public long registerQRCode(@NonNull Entry sourceEntry, @NonNull String name, @Nullable String description, @NonNull String qrData) { - Object[] params = new Object[]{ - name, - description, - qrData, - sourceEntry.getId() - }; - database.execSQL(SQL.DB_NEW_QR, params); + ContentValues params = setParams(DatabaseTables.QR_CODE, name, description, qrData, + sourceEntry.getId()); + return database.insert(SQL.QR_CODE.NAME, null, params); } - public void registerNewSecurityCodeSource(@NonNull SecurityCode securityCodeSource) { - Object[] params = new Object[]{ - securityCodeSource.getAccountName() - }; - database.execSQL(SQL.DB_NEW_SECURITY_CODE, params); + public long registerNewSecurityCodeSource(@NonNull SecurityCode securityCodeSource) { + ContentValues params = setParams(DatabaseTables.SECURITY_CODE, + securityCodeSource.getAccountName()); + return database.insert(SQL.SECURITY_CODE.NAME, null, params); } - public void registerNewFieldForSecurityCodeSource(@NonNull Field newField) { - Object[] params = new Object[]{ - newField.getCode(), - newField.isCodeUsed(), - newField.getSecurityCodeID() - }; - database.execSQL(SQL.DB_NEW_FIELD, params); + public long registerNewFieldForSecurityCodeSource(@NonNull Field newField) { + ContentValues params = setParams(DatabaseTables.FIELD, + newField.getCode(), newField.isCodeUsed(), newField.getSecurityCodeID()); + return database.insert(SQL.FIELD.NAME, null, params); } public void deleteAccount(int accountID) { - Object[] params = new Object[]{accountID}; - database.execSQL(SQL.DB_DELETE_ENTRY, params); + String[] selectionArgs = setSelectionArgs(accountID); + database.delete(SQL.ENTRY.NAME, SQL.DB_DELETE_ENTRY_WHERE_CLAUSE, selectionArgs); } public void deleteCategory(int categoryID) { - Object[] params = new Object[]{categoryID}; - database.execSQL(SQL.DB_UPDATE_FOR_DELETED_CATEGORY, params); - database.execSQL(SQL.DB_DELETE_CATEGORY, params); + String[] selectionArgs = setSelectionArgs(categoryID); + ContentValues entryUpdatedValues = new ContentValues(); + entryUpdatedValues.put(SQL.ENTRY.E_PARENT_CATEGORY, 0); + database.update( + SQL.ENTRY.NAME, entryUpdatedValues, + SQL.DB_UPDATE_FOR_DELETED_CATEGORY_WHERE_CLAUSE, + selectionArgs); + database.delete(SQL.CATEGORY.NAME, SQL.DB_DELETE_CATEGORY_WHERE_CLAUSE, selectionArgs); } public void deleteQRCode(int qrID) { - Object[] params = new Object[]{qrID}; - database.execSQL(SQL.DB_DELETE_QR_CODE, params); + String[] selectionArgs = setSelectionArgs(qrID); + database.delete(SQL.QR_CODE.NAME, SQL.DB_DELETE_QR_CODE_WHERE_CLAUSE, selectionArgs); } public void deleteSecurityCode(int securityCodeID) { - Object[] params = new Object[]{securityCodeID}; - database.execSQL(SQL.DB_DELETE_FIELD_FROM_SECURITY_CODE, params); - database.execSQL(SQL.DB_DELETE_SECURITY_CODE, params); + String[] selectionArgs = setSelectionArgs(securityCodeID); + database.delete(SQL.FIELD.NAME, + SQL.DB_DELETE_FIELD_FROM_SECURITY_CODE_WHERE_CLAUSE, selectionArgs); + database.delete(SQL.SECURITY_CODE.NAME, SQL.DB_DELETE_CATEGORY_WHERE_CLAUSE, selectionArgs); } - public void deleteField(@NonNull String fieldCode) { - Object[] params = new Object[]{fieldCode}; - database.execSQL(SQL.DB_DELETE_FIELD, params); + public void deleteField(int fieldCodeID) { + String[] selectionArgs = setSelectionArgs(fieldCodeID); + database.delete(SQL.FIELD.NAME, SQL.DB_DELETE_FIELD_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForEntry(@NonNull Entry modifiedEntry) { - Object[] params = new Object[]{ - modifiedEntry.getAccountName(), - modifiedEntry.getAccountPassword(), - modifiedEntry.getIcon(), - modifiedEntry.getDescription(), - modifiedEntry.getCategory().getId(), - modifiedEntry.getId() - }; - database.execSQL(SQL.DB_UPDATE_ENTRY, params); + public void updateInformationForEntry(@NonNull String accountName, + @NonNull String accountPassword, + @NonNull String icon, + @Nullable String description, + @NonNull Category entryCategory, + int entryId) { + ContentValues params = setParams(DatabaseTables.ENTRY, + accountName, + accountPassword, + icon, + description, + entryCategory.getId()); + String[] selectionArgs = setSelectionArgs(entryId); + database.update(SQL.ENTRY.NAME, params, SQL.DB_UPDATE_ENTRY_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForCategory(@NonNull Category modifiedCategory) { - Object[] params = new Object[]{ - modifiedCategory.getName(), - modifiedCategory.getId() - }; - database.execSQL(SQL.DB_UPDATE_CATEGORY, params); + public void updateInformationForCategory(@NonNull String categoryName, int categoryId) { + ContentValues params = setParams(DatabaseTables.CATEGORY, categoryName); + String[] selectionArgs = setSelectionArgs(categoryId); + database.update(SQL.CATEGORY.NAME, params, SQL.DB_UPDATE_CATEGORY_WHERE_CLAUSE, + selectionArgs); } - public void updateInformationForQRCode(@NonNull QRCode modifiedQRCode) { - Object[] params = new Object[]{ - modifiedQRCode.getName(), - modifiedQRCode.getDescription(), - modifiedQRCode.getQrData(), - modifiedQRCode.getEntry().getId(), - modifiedQRCode.getId() - }; - database.execSQL(SQL.DB_UPDATE_QR_CODE, params); + public void updateInformationForQRCode(@NonNull Entry sourceEntry, @NonNull String name, + @Nullable String description, @NonNull String qrData, + int qrCodeId) { + ContentValues params = setParams(DatabaseTables.QR_CODE, name, + description, + qrData, + sourceEntry.getId()); + String[] selectionArgs = setSelectionArgs(qrCodeId); + database.update(SQL.QR_CODE.NAME, params, SQL.DB_UPDATE_QR_CODE_WHERE_CLAUSE, + selectionArgs); } public void updateInformationForSecurityCode(@NonNull SecurityCode modifiedSecurityCode) { - Object[] params = new Object[]{ - modifiedSecurityCode.getAccountName(), - modifiedSecurityCode.getId() - }; - database.execSQL(SQL.DB_UPDATE_SECURITY_CODE, params); + ContentValues params = setParams(DatabaseTables.SECURITY_CODE, + modifiedSecurityCode.getAccountName()); + String[] selectionArgs = setSelectionArgs(modifiedSecurityCode.getId()); + database.update(SQL.SECURITY_CODE.NAME, params, SQL.DB_UPDATE_SECURITY_CODE_WHERE_CLAUSE, + selectionArgs); } public void updateInformationForField(@NonNull Field modifiedField) { - Object[] params = new Object[]{ - modifiedField.getCode(), - modifiedField.isCodeUsed(), - modifiedField.getId() - }; - database.execSQL(SQL.DB_UPDATE_FIELD, params); + ContentValues params = setParams(DatabaseTables.FIELD, modifiedField.getCode(), + modifiedField.isCodeUsed()); + String[] selectionArgs = setSelectionArgs(modifiedField.getId()); + database.update(SQL.FIELD.NAME, params, SQL.DB_UPDATE_FIELD_WHERE_CLAUSE, selectionArgs); } private String[] loadDataIntoArray(Cursor sourceData) { @@ -189,7 +176,14 @@ private String[] loadDataIntoArray(Cursor sourceData) { } public List getAllCategories() { - Cursor categoriesCursor = database.rawQuery(SQL.DB_SELECT_CATEGORIES, null); + String sortOrder = SQL.CATEGORY.C_ID + " DESC"; + Cursor categoriesCursor = database.query(SQL.CATEGORY.NAME, + null, + null, + null, + null, + null, + sortOrder); List categoriesList = new ArrayList<>(); if (categoriesCursor.moveToFirst()) { do { @@ -201,7 +195,14 @@ public List getAllCategories() { } public List getAllEntries() { - Cursor entriesCursor = database.rawQuery(SQL.DB_SELECT_ENTRIES, null); + String sortOrder = SQL.ENTRY.E_ID + " DESC"; + Cursor entriesCursor = database.query(SQL.ENTRY.NAME, + null, + null, + null, + null, + null, + sortOrder); List entriesList = new ArrayList<>(); if (entriesCursor.moveToFirst()) { do { @@ -213,7 +214,14 @@ public List getAllEntries() { } public List getAllQRCodes() { - Cursor qrCodesCursor = database.rawQuery(SQL.DB_SELECT_QR_CODES, null); + String sortOrder = SQL.QR_CODE.Q_ID + " DESC"; + Cursor qrCodesCursor = database.query(SQL.QR_CODE.NAME, + null, + null, + null, + null, + null, + sortOrder); List qrCodesList = new ArrayList<>(); if (qrCodesCursor.moveToFirst()) { do { @@ -225,7 +233,14 @@ public List getAllQRCodes() { } public List getAllSecurityCodes() { - Cursor securityCodesCursor = database.rawQuery(SQL.DB_SELECT_SECURITY_CODES, null); + String sortOrder = SQL.SECURITY_CODE.S_ID + " DESC"; + Cursor securityCodesCursor = database.query(SQL.SECURITY_CODE.NAME, + null, + null, + null, + null, + null, + sortOrder); List securityCodesList = new ArrayList<>(); if (securityCodesCursor.moveToFirst()) { do { @@ -237,7 +252,14 @@ public List getAllSecurityCodes() { } public List getAllFields() { - Cursor fieldsCursor = database.rawQuery(SQL.DB_SELECT_FIELDS, null); + String sortOrder = SQL.FIELD.F_ID + " DESC"; + Cursor fieldsCursor = database.query(SQL.FIELD.NAME, + null, + null, + null, + null, + null, + sortOrder); List fieldsList = new ArrayList<>(); if (fieldsCursor.moveToFirst()) { do { @@ -251,4 +273,39 @@ public List getAllFields() { public void finishConnection() { database.close(); } + + private ContentValues setParams(DatabaseTables table, Object... values) { + ContentValues params = new ContentValues(); + switch (table) { + case CATEGORY: + params.put(SQL.CATEGORY.C_NAME, (String) values[0]); + break; + case ENTRY: + params.put(SQL.ENTRY.E_ACCOUNT, (String) values[0]); + params.put(SQL.ENTRY.E_PASSWORD, (String) values[1]); + params.put(SQL.ENTRY.E_ICON, (String) values[2]); + params.put(SQL.ENTRY.E_DESCRIPTION, (String) values[3]); + params.put(SQL.ENTRY.E_PARENT_CATEGORY, (int) values[4]); + break; + case QR_CODE: + params.put(SQL.QR_CODE.NAME, (String) values[0]); + params.put(SQL.QR_CODE.Q_DESCRIPTION, (String) values[1]); + params.put(SQL.QR_CODE.Q_DATA, (String) values[3]); + params.put(SQL.QR_CODE.Q_PARENT_ENTRY, (int) values[4]); + break; + case SECURITY_CODE: + params.put(SQL.SECURITY_CODE.S_ACCOUNT_NAME, (String) values[0]); + break; + case FIELD: + params.put(SQL.FIELD.F_CODE, (String) values[0]); + params.put(SQL.FIELD.F_USED, (boolean) values[1]); + params.put(SQL.FIELD.F_PARENT_SECURITY_CODE, (int) values[3]); + break; + } + return params; + } + + private String[] setSelectionArgs(int id) { + return new String[]{String.valueOf(id)}; + } } diff --git a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java index 628d1e6..be51a17 100644 --- a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java +++ b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java @@ -16,6 +16,45 @@ public static final class SQL { "Category(name) VALUES (?)"; // INSERT SQL OPERATIONS + public static final class CATEGORY { + public static String NAME = "Category"; + public static String C_ID = "idCategory"; + public static String C_NAME = "name"; + } + + public static final class ENTRY { + public static final String NAME = "Entry"; + public static final String E_ID = "idEntry"; + public static final String E_ACCOUNT = "account"; + public static final String E_PASSWORD = "password"; + public static final String E_ICON = "icon"; + public static final String E_DESCRIPTION = "description"; + public static final String E_PARENT_CATEGORY = "cidCategory"; + } + + public static final class QR_CODE { + public static final String NAME = "QRCode"; + public static final String Q_ID = "idQRCode"; + public static final String Q_NAME = "name"; + public static final String Q_DESCRIPTION = "description"; + public static final String Q_DATA = "data"; + public static final String Q_PARENT_ENTRY = "fidEntry"; + } + + public static final class SECURITY_CODE { + public static final String NAME = "SecurityCodes"; + public static final String S_ID = "idSecurityCodes"; + public static final String S_ACCOUNT_NAME = "accountName"; + } + + public static final class FIELD { + public static final String NAME = "Fields"; + public static final String F_ID = "idField"; + public static final String F_CODE = "code"; + public static final String F_USED = "used"; + public static final String F_PARENT_SECURITY_CODE = "fidSecurityCodes"; + } + public static String DB_NEW_ENTRY = "INSERT INTO Entry VALUES(?, ?, ?, ?, ?)"; public static String DB_NEW_CATEGORY = "INSERT INTO Category VALUES (?)"; public static String DB_NEW_QR = "INSERT INTO QRCode VALUES (?, ?, ?, ?)"; @@ -23,30 +62,26 @@ public static final class SQL { public static String DB_NEW_FIELD = "INSERT INTO Fields VALUES (?, ?, ?)"; //DELETE SQL OPERATIONS - public static String DB_DELETE_ENTRY = "DELETE FROM Entry WHERE Entry.idEntry = ?"; - public static String DB_DELETE_CATEGORY = - "DELETE FROM Category WHERE Category.idCategory = ?"; - public static String DB_DELETE_QR_CODE = "DELETE FROM QRCode WHERE QRCode.idQRCode = ?"; - public static String DB_DELETE_FIELD_FROM_SECURITY_CODE = "DELETE FROM Fields WHERE " + + public static String DB_DELETE_ENTRY_WHERE_CLAUSE = "Entry.idEntry = ?"; + public static String DB_DELETE_CATEGORY_WHERE_CLAUSE = "Category.idCategory = ?"; + public static String DB_DELETE_QR_CODE_WHERE_CLAUSE = "QRCode.idQRCode = ?"; + public static String DB_DELETE_FIELD_FROM_SECURITY_CODE_WHERE_CLAUSE = "Fields.fidSecurityCodes = ?"; - public static String DB_DELETE_SECURITY_CODE = "DELETE FROM SecurityCodes " + - "WHERE SecurityCodes.idSecurityCodes = ?"; - public static String DB_DELETE_FIELD = "DELETE FROM Fields WHERE Fields.idField = ?"; + public static String DB_DELETE_SECURITY_CODE_WHERE_CLAUSE = + "SecurityCodes.idSecurityCodes = ?"; + public static String DB_DELETE_FIELD_WHERE_CLAUSE = "Fields.idField = ?"; // UPDATE SQL OPERATIONS - public static String DB_UPDATE_FOR_DELETED_CATEGORY = "UPDATE Entry SET " + - "Entry.cidCategory = 0 WHERE Entry.cidCategory = ?"; - public static String DB_UPDATE_ENTRY = "UPDATE Entry SET Entry.account = ?," + - " Entry.password = ?, Entry.icon = ?, Entry.description = ?, " + - "Entry.cidCategory = ? WHERE Entry.idEntry = ?"; - public static String DB_UPDATE_CATEGORY = "UPDATE Category SET Category.name = ? WHERE" + + public static String DB_UPDATE_FOR_DELETED_CATEGORY_WHERE_CLAUSE = "Entry.cidCategory = ?"; + public static String DB_UPDATE_ENTRY_WHERE_CLAUSE = "Entry.idEntry = ?"; + public static String DB_UPDATE_CATEGORY_WHERE_CLAUSE = "UPDATE Category SET Category.name = ? WHERE" + " Category.idCategory = ?"; - public static String DB_UPDATE_QR_CODE = "UPDATE QRCode SET QRCode.name = ?," + + public static String DB_UPDATE_QR_CODE_WHERE_CLAUSE = "UPDATE QRCode SET QRCode.name = ?," + " QRCode.description = ?, QRCode.data = ?, QRCode.fidEntry = ? " + "WHERE QRCode.idQRCode = ?"; - public static String DB_UPDATE_SECURITY_CODE = "UPDATE SecurityCodes " + + public static String DB_UPDATE_SECURITY_CODE_WHERE_CLAUSE = "UPDATE SecurityCodes " + "SET SecurityCodes.accountName = ? WHERE SecurityCodes.idSecurityCodes = ?"; - public static String DB_UPDATE_FIELD = "UPDATE Fields SET Fields.code = ?, " + + public static String DB_UPDATE_FIELD_WHERE_CLAUSE = "UPDATE Fields SET Fields.code = ?, " + "Fields.used = ? WHERE Fields.idField = ?"; // SELECT SQL OPERATIONS @@ -74,7 +109,7 @@ public static final class FIRST_SETUP { public static final class SHARED_PREF { public static final String FILENAME = "userPreferences"; public static final int MODE = Context.MODE_PRIVATE; - public static final Object[][] VALUES = new Object[][] { + public static final Object[][] VALUES = new Object[][]{ {"isApplicationFirstExecuted", false, boolean.class}, {"isDatabaseInitialized", false, boolean.class} }; diff --git a/APP/app/src/main/java/javinator9889/securepass/util/values/DatabaseTables.java b/APP/app/src/main/java/javinator9889/securepass/util/values/DatabaseTables.java new file mode 100644 index 0000000..4fbfea8 --- /dev/null +++ b/APP/app/src/main/java/javinator9889/securepass/util/values/DatabaseTables.java @@ -0,0 +1,8 @@ +package javinator9889.securepass.util.values; + +/** + * Created by Javinator9889 on 18/05/2018. + */ +public enum DatabaseTables { + CATEGORY, ENTRY, QR_CODE, SECURITY_CODE, FIELD +} From 52de736e674e42ffe2af57644bace89bcf0fa419 Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Sat, 26 May 2018 19:40:20 +0200 Subject: [PATCH 6/6] Completed tests for database working - now full functional --- .../securepass/DatabaseTest.java | 88 ++++++ .../data/container/ClassContainer.java | 9 +- .../securepass/io/IOManager.java | 29 +- .../io/database/DatabaseManager.java | 9 +- .../io/database/DatabaseOperations.java | 252 ++++++++++++------ .../securepass/util/values/Constants.java | 14 +- APP/app/src/main/res/raw/create_category.sql | 4 + APP/app/src/main/res/raw/create_entry.sql | 13 + APP/app/src/main/res/raw/create_field.sql | 11 + APP/app/src/main/res/raw/create_qrcode.sql | 12 + .../src/main/res/raw/create_security_code.sql | 4 + APP/app/src/main/res/raw/database_script.sql | 119 +++------ 12 files changed, 376 insertions(+), 188 deletions(-) create mode 100644 APP/app/src/androidTest/java/javinator9889/securepass/DatabaseTest.java create mode 100644 APP/app/src/main/res/raw/create_category.sql create mode 100644 APP/app/src/main/res/raw/create_entry.sql create mode 100644 APP/app/src/main/res/raw/create_field.sql create mode 100644 APP/app/src/main/res/raw/create_qrcode.sql create mode 100644 APP/app/src/main/res/raw/create_security_code.sql diff --git a/APP/app/src/androidTest/java/javinator9889/securepass/DatabaseTest.java b/APP/app/src/androidTest/java/javinator9889/securepass/DatabaseTest.java new file mode 100644 index 0000000..3d19f41 --- /dev/null +++ b/APP/app/src/androidTest/java/javinator9889/securepass/DatabaseTest.java @@ -0,0 +1,88 @@ +package javinator9889.securepass; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Arrays; +import java.util.Map; + +import javinator9889.securepass.io.database.DatabaseManager; +import javinator9889.securepass.io.database.DatabaseOperations; + +/** + * Created by Javinator9889 on 20/05/2018. + */ +@RunWith(AndroidJUnit4.class) +public class DatabaseTest { + private Context context = InstrumentationRegistry.getTargetContext(); + + private DatabaseOperations op; + + @Before + public void initParams() { + DatabaseManager manager = DatabaseManager.newInstance(context, "1234"); + this.op = DatabaseOperations.newInstance(manager); + } + + @Test + public void insertIntoDB() { + long defaultCategoryId = op.registerDefaultCategory(); + long newAccountId = op.registerNewAccount("cuenta", "password", + "icono", "descripciĆ³n", defaultCategoryId); + long newCategoryId = op.registerNewCategory("cat2"); + long newQRCodeId = op.registerQRCode(newAccountId, "qr1", "desc", + "1234"); + long newSecurityCodeId = op.registerNewSecurityCodeSource("sec1"); + long newFieldForSecCodeId = op.registerNewFieldForSecurityCodeSource("12345", + false, + newSecurityCodeId); + op.updateInformationForCategory("cat3", newCategoryId); + op.updateInformationForEntry("cuent", "pass", "icon", + "desc", newCategoryId, newAccountId); + op.updateInformationForQRCode(newAccountId, "qr1,2", "descq", "data", + newQRCodeId); + op.updateInformationForSecurityCode("secCode", newSecurityCodeId); + op.updateInformationForField("12321", true, newFieldForSecCodeId, + newSecurityCodeId); + printer(); + op.registerNewAccount("cuenta", "password", "icono", + "descripciĆ³n", defaultCategoryId); + op.registerNewCategory("cat2"); + op.registerQRCode(newAccountId, "qr1", "desc", + "1234"); + op.registerNewSecurityCodeSource("sec1"); + op.registerNewFieldForSecurityCodeSource("12345",false, + newSecurityCodeId); + printer(); + op.deleteCategory(newCategoryId); + op.deleteAccount(newAccountId); + op.deleteQRCode(newQRCodeId); + op.deleteSecurityCode(newSecurityCodeId); + op.deleteField(newFieldForSecCodeId); + printer(); + } + + private void printer() { + for (Map objectMap : op.getAllCategories()) + System.out.println(objectMap); + for (Map objectMap : op.getAllEntries()) + System.out.println(objectMap); + for (Map objectMap : op.getAllQRCodes()) + System.out.println(objectMap); + for (Map objectMap : op.getAllSecurityCodes()) + System.out.println(objectMap); + for (Map objectMap : op.getAllFields()) + System.out.println(objectMap); + } + + @After + public void closeConnection() { + op.finishConnection(); + } +} diff --git a/APP/app/src/main/java/javinator9889/securepass/data/container/ClassContainer.java b/APP/app/src/main/java/javinator9889/securepass/data/container/ClassContainer.java index ced9bec..1ddd6c4 100644 --- a/APP/app/src/main/java/javinator9889/securepass/data/container/ClassContainer.java +++ b/APP/app/src/main/java/javinator9889/securepass/data/container/ClassContainer.java @@ -81,17 +81,18 @@ public void storeDataInDB() { entry.getAccountPassword(), entry.getIcon(), entry.getDescription(), - entry.getCategory()); + entry.getCategory().getId()); for (QRCode qrCode : qrCodes) operations.registerQRCode( - qrCode.getEntry(), + qrCode.getEntry().getId(), qrCode.getName(), qrCode.getDescription(), qrCode.getQrData()); for (SecurityCode code : securityCodes) - operations.registerNewSecurityCodeSource(code); + operations.registerNewSecurityCodeSource(code.getAccountName()); for (Field field : fields) - operations.registerNewFieldForSecurityCodeSource(field); + operations.registerNewFieldForSecurityCodeSource(field.getCode(), field.isCodeUsed(), + field.getSecurityCodeID()); operations.finishConnection(); } diff --git a/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java b/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java index 71e558c..2c64701 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/IOManager.java @@ -16,6 +16,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; import javinator9889.securepass.R; import javinator9889.securepass.util.cipher.PasswordCipher; @@ -28,14 +30,11 @@ public class IOManager { private Context activityContext; - private InputStream sqlScriptInputFile; private File filesCache; private IOManager(@NonNull Context activityContext) { this.activityContext = activityContext; this.filesCache = activityContext.getCacheDir(); - int sqlScript = R.raw.database_script; - this.sqlScriptInputFile = activityContext.getResources().openRawResource(sqlScript); } @NonNull @@ -43,14 +42,22 @@ public static IOManager newInstance(Context activityContext) { return new IOManager(activityContext); } - public String loadSQLScript() throws IOException { - BufferedReader sqlStringsInFile = new BufferedReader( - new InputStreamReader(sqlScriptInputFile)); - StringBuilder completeFileRead = new StringBuilder(); - String currentLine; - while ((currentLine = sqlStringsInFile.readLine()) != null) - completeFileRead.append(currentLine).append("\n"); - return completeFileRead.toString(); + public List loadSQLScript() throws IOException { + List result = new ArrayList<>(5); + int[] sqlScripts = new int[]{R.raw.create_category, R.raw.create_entry, R.raw.create_qrcode, + R.raw.create_security_code, R.raw.create_field}; + for (int sqlScript : sqlScripts) { + InputStream sqlScriptInputFile = this.activityContext.getResources() + .openRawResource(sqlScript); + StringBuilder builder = new StringBuilder(); + BufferedReader sqlStringsInFile = new BufferedReader( + new InputStreamReader(sqlScriptInputFile)); + String currentLine; + while ((currentLine = sqlStringsInFile.readLine()) != null) + builder.append(currentLine).append("\n"); + result.add(builder.toString()); + } + return result; } public void storePassword(@NonNull String userPassword) { diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java index d95a795..b776d65 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseManager.java @@ -8,6 +8,7 @@ import java.io.File; import java.io.IOException; +import java.util.List; import javinator9889.securepass.io.IOManager; import javinator9889.securepass.util.resources.ISharedPreferencesManager; @@ -56,13 +57,15 @@ public void run() { databaseFile, databasePassword, null); - String databaseScript; + List databaseScripts; ISharedPreferencesManager preferencesManager = SharedPreferencesManager .newInstance(); try { if (!preferencesManager.isDatabaseInitialized()) { - databaseScript = IOManager.newInstance(databaseContext).loadSQLScript(); - database.execSQL(databaseScript); + databaseScripts = IOManager.newInstance(databaseContext).loadSQLScript(); + for (String script : databaseScripts) { + database.execSQL(script); + } DatabaseManager.this.createDefaultCategory(); } } catch (IOException e) { diff --git a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java index 30631d0..ef601d9 100644 --- a/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java +++ b/APP/app/src/main/java/javinator9889/securepass/io/database/DatabaseOperations.java @@ -9,12 +9,10 @@ import net.sqlcipher.database.SQLiteDatabase; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import javinator9889.securepass.data.entry.Category; -import javinator9889.securepass.data.entry.Entry; -import javinator9889.securepass.data.secret.Field; -import javinator9889.securepass.data.secret.SecurityCode; import javinator9889.securepass.util.values.Constants.SQL; import javinator9889.securepass.util.values.DatabaseTables; @@ -40,15 +38,19 @@ public static DatabaseOperations newInstance(DatabaseManager databaseManagerInst } public long registerDefaultCategory() { - ContentValues params = setParams(DatabaseTables.CATEGORY, "Global"); - return database.insert(SQL.CATEGORY.NAME, null, params); +// ContentValues params = setParams(DatabaseTables.CATEGORY, "Global"); + ContentValues params = new ContentValues(); + params.put(SQL.CATEGORY.C_ID, 1); + params.put(SQL.CATEGORY.C_NAME, "Global"); + return database.insertWithOnConflict(SQL.CATEGORY.NAME, null, params, + SQLiteDatabase.CONFLICT_IGNORE); } public long registerNewAccount(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, - @NonNull Category entryCategory) { + long entryParentCategoryId) { ContentValues params = setParams(DatabaseTables.ENTRY, accountName, accountPassword, icon, - description, entryCategory.getId()); + description, entryParentCategoryId); return database.insert(SQL.ENTRY.NAME, null, params); } @@ -57,31 +59,33 @@ public long registerNewCategory(@NonNull String name) { return database.insert(SQL.CATEGORY.NAME, null, params); } - public long registerQRCode(@NonNull Entry sourceEntry, @NonNull String name, + public long registerQRCode(long sourceEntryId, @NonNull String name, @Nullable String description, @NonNull String qrData) { ContentValues params = setParams(DatabaseTables.QR_CODE, name, description, qrData, - sourceEntry.getId()); + sourceEntryId); return database.insert(SQL.QR_CODE.NAME, null, params); } - public long registerNewSecurityCodeSource(@NonNull SecurityCode securityCodeSource) { + public long registerNewSecurityCodeSource(@NonNull String securityCodeName) { ContentValues params = setParams(DatabaseTables.SECURITY_CODE, - securityCodeSource.getAccountName()); + securityCodeName); return database.insert(SQL.SECURITY_CODE.NAME, null, params); } - public long registerNewFieldForSecurityCodeSource(@NonNull Field newField) { + public long registerNewFieldForSecurityCodeSource(@NonNull String fieldCode, + boolean isCodeUsed, + long parentSecurityCodeId) { ContentValues params = setParams(DatabaseTables.FIELD, - newField.getCode(), newField.isCodeUsed(), newField.getSecurityCodeID()); + fieldCode, isCodeUsed, parentSecurityCodeId); return database.insert(SQL.FIELD.NAME, null, params); } - public void deleteAccount(int accountID) { + public void deleteAccount(long accountID) { String[] selectionArgs = setSelectionArgs(accountID); database.delete(SQL.ENTRY.NAME, SQL.DB_DELETE_ENTRY_WHERE_CLAUSE, selectionArgs); } - public void deleteCategory(int categoryID) { + public void deleteCategory(long categoryID) { String[] selectionArgs = setSelectionArgs(categoryID); ContentValues entryUpdatedValues = new ContentValues(); entryUpdatedValues.put(SQL.ENTRY.E_PARENT_CATEGORY, 0); @@ -92,19 +96,20 @@ public void deleteCategory(int categoryID) { database.delete(SQL.CATEGORY.NAME, SQL.DB_DELETE_CATEGORY_WHERE_CLAUSE, selectionArgs); } - public void deleteQRCode(int qrID) { + public void deleteQRCode(long qrID) { String[] selectionArgs = setSelectionArgs(qrID); database.delete(SQL.QR_CODE.NAME, SQL.DB_DELETE_QR_CODE_WHERE_CLAUSE, selectionArgs); } - public void deleteSecurityCode(int securityCodeID) { + public void deleteSecurityCode(long securityCodeID) { String[] selectionArgs = setSelectionArgs(securityCodeID); database.delete(SQL.FIELD.NAME, SQL.DB_DELETE_FIELD_FROM_SECURITY_CODE_WHERE_CLAUSE, selectionArgs); - database.delete(SQL.SECURITY_CODE.NAME, SQL.DB_DELETE_CATEGORY_WHERE_CLAUSE, selectionArgs); + database.delete(SQL.SECURITY_CODE.NAME, SQL.DB_DELETE_SECURITY_CODE_WHERE_CLAUSE, + selectionArgs); } - public void deleteField(int fieldCodeID) { + public void deleteField(long fieldCodeID) { String[] selectionArgs = setSelectionArgs(fieldCodeID); database.delete(SQL.FIELD.NAME, SQL.DB_DELETE_FIELD_WHERE_CLAUSE, selectionArgs); } @@ -113,69 +118,149 @@ public void updateInformationForEntry(@NonNull String accountName, @NonNull String accountPassword, @NonNull String icon, @Nullable String description, - @NonNull Category entryCategory, - int entryId) { + long parentEntryCategoryId, + long entryId) { ContentValues params = setParams(DatabaseTables.ENTRY, accountName, accountPassword, icon, description, - entryCategory.getId()); + parentEntryCategoryId); String[] selectionArgs = setSelectionArgs(entryId); database.update(SQL.ENTRY.NAME, params, SQL.DB_UPDATE_ENTRY_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForCategory(@NonNull String categoryName, int categoryId) { + public void updateInformationForCategory(@NonNull String categoryName, long categoryId) { ContentValues params = setParams(DatabaseTables.CATEGORY, categoryName); String[] selectionArgs = setSelectionArgs(categoryId); database.update(SQL.CATEGORY.NAME, params, SQL.DB_UPDATE_CATEGORY_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForQRCode(@NonNull Entry sourceEntry, @NonNull String name, + public void updateInformationForQRCode(long sourceEntryId, @NonNull String name, @Nullable String description, @NonNull String qrData, - int qrCodeId) { + long qrCodeId) { ContentValues params = setParams(DatabaseTables.QR_CODE, name, description, qrData, - sourceEntry.getId()); + sourceEntryId); String[] selectionArgs = setSelectionArgs(qrCodeId); database.update(SQL.QR_CODE.NAME, params, SQL.DB_UPDATE_QR_CODE_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForSecurityCode(@NonNull SecurityCode modifiedSecurityCode) { + public void updateInformationForSecurityCode(@NonNull String newSecurityCodeName, + long securityCodeId) { ContentValues params = setParams(DatabaseTables.SECURITY_CODE, - modifiedSecurityCode.getAccountName()); - String[] selectionArgs = setSelectionArgs(modifiedSecurityCode.getId()); + newSecurityCodeName); + String[] selectionArgs = setSelectionArgs(securityCodeId); database.update(SQL.SECURITY_CODE.NAME, params, SQL.DB_UPDATE_SECURITY_CODE_WHERE_CLAUSE, selectionArgs); } - public void updateInformationForField(@NonNull Field modifiedField) { - ContentValues params = setParams(DatabaseTables.FIELD, modifiedField.getCode(), - modifiedField.isCodeUsed()); - String[] selectionArgs = setSelectionArgs(modifiedField.getId()); + public void updateInformationForField(@NonNull String newFieldCode, + boolean isCodeUsed, + long fieldId, long securityCodeId) { + ContentValues params = setParams(DatabaseTables.FIELD, newFieldCode, + isCodeUsed, securityCodeId); + String[] selectionArgs = setSelectionArgs(fieldId); database.update(SQL.FIELD.NAME, params, SQL.DB_UPDATE_FIELD_WHERE_CLAUSE, selectionArgs); } - private String[] loadDataIntoArray(Cursor sourceData) { - int numberOfColumns = sourceData.getColumnCount(); - String[] currentData = new String[numberOfColumns]; - for (int i = 0; i < numberOfColumns; ++i) { - switch (sourceData.getType(i)) { - case Cursor.FIELD_TYPE_INTEGER: - currentData[i] = String.valueOf(sourceData.getInt(i)); - break; - default: - currentData[i] = sourceData.getString(i); - break; - } + private Map getValuesFromCursor(Cursor sourceData, DatabaseTables type) { + Map result = new HashMap<>(); + switch (type) { + case CATEGORY: + long categoryId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.CATEGORY.C_ID)); + String categoryName = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.CATEGORY.C_NAME)); + result.put(SQL.CATEGORY.C_ID, categoryId); + result.put(SQL.CATEGORY.C_NAME, categoryName); + return result; + case ENTRY: + long entryId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.ENTRY.E_ID)); + String entryName = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.ENTRY.E_ACCOUNT) + ); + String entryPassword = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.ENTRY.E_PASSWORD) + ); + String entryDescription = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.ENTRY.E_DESCRIPTION) + ); + String entryIcon = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.ENTRY.E_ICON) + ); + String entryParentCategory = sourceData.getString( + sourceData + .getColumnIndexOrThrow(SQL.ENTRY.E_PARENT_CATEGORY) + ); + result.put(SQL.ENTRY.E_ID, entryId); + result.put(SQL.ENTRY.E_ACCOUNT, entryName); + result.put(SQL.ENTRY.E_PASSWORD, entryPassword); + result.put(SQL.ENTRY.E_DESCRIPTION, entryDescription); + result.put(SQL.ENTRY.E_ICON, entryIcon); + result.put(SQL.ENTRY.E_PARENT_CATEGORY, entryParentCategory); + return result; + case QR_CODE: + long qrCodeId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.QR_CODE.Q_ID) + ); + String qrCodeName = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.QR_CODE.Q_NAME) + ); + String qrCodeData = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.QR_CODE.Q_DATA) + ); + String qrCodeDescription = sourceData.getString( + sourceData + .getColumnIndexOrThrow(SQL.QR_CODE.Q_DESCRIPTION) + ); + long qrCodeParentEntryId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.QR_CODE.Q_PARENT_ENTRY) + ); + result.put(SQL.QR_CODE.Q_ID, qrCodeId); + result.put(SQL.QR_CODE.Q_NAME, qrCodeName); + result.put(SQL.QR_CODE.Q_DATA, qrCodeData); + result.put(SQL.QR_CODE.Q_DESCRIPTION, qrCodeDescription); + result.put(SQL.QR_CODE.Q_PARENT_ENTRY, qrCodeParentEntryId); + return result; + case SECURITY_CODE: + long securityCodeId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.SECURITY_CODE.S_ID) + ); + String securityCodeName = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.SECURITY_CODE.S_ACCOUNT_NAME) + ); + result.put(SQL.SECURITY_CODE.S_ID, securityCodeId); + result.put(SQL.SECURITY_CODE.S_ACCOUNT_NAME, securityCodeName); + return result; + case FIELD: + long fieldId = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.FIELD.F_ID) + ); + String fieldCode = sourceData.getString( + sourceData.getColumnIndexOrThrow(SQL.FIELD.F_CODE) + ); + boolean isFieldUsed = sourceData.getInt( + sourceData.getColumnIndexOrThrow(SQL.FIELD.F_USED) + ) == 1; + long fieldParentSecurityCode = sourceData.getLong( + sourceData.getColumnIndexOrThrow(SQL.FIELD.F_PARENT_SECURITY_CODE) + ); + result.put(SQL.FIELD.F_ID, fieldId); + result.put(SQL.FIELD.F_CODE, fieldCode); + result.put(SQL.FIELD.F_USED, isFieldUsed); + result.put(SQL.FIELD.F_PARENT_SECURITY_CODE, fieldParentSecurityCode); + return result; + default: + return result; } - return currentData; } - public List getAllCategories() { + public List> getAllCategories() { String sortOrder = SQL.CATEGORY.C_ID + " DESC"; Cursor categoriesCursor = database.query(SQL.CATEGORY.NAME, null, @@ -184,17 +269,23 @@ public List getAllCategories() { null, null, sortOrder); - List categoriesList = new ArrayList<>(); - if (categoriesCursor.moveToFirst()) { - do { - categoriesList.add(loadDataIntoArray(categoriesCursor)); - } while (categoriesCursor.moveToNext()); + List> itemsObtained = new ArrayList<>(); + while (categoriesCursor.moveToNext()) { + itemsObtained.add(getValuesFromCursor(categoriesCursor, DatabaseTables.CATEGORY)); } categoriesCursor.close(); - return categoriesList; + return itemsObtained; +// List categoriesList = new ArrayList<>(); +// if (categoriesCursor.moveToFirst()) { +// do { +// categoriesList.add(loadDataIntoArray(categoriesCursor)); +// } while (categoriesCursor.moveToNext()); +// } +// categoriesCursor.close(); +// return categoriesList; } - public List getAllEntries() { + public List> getAllEntries() { String sortOrder = SQL.ENTRY.E_ID + " DESC"; Cursor entriesCursor = database.query(SQL.ENTRY.NAME, null, @@ -203,17 +294,15 @@ public List getAllEntries() { null, null, sortOrder); - List entriesList = new ArrayList<>(); - if (entriesCursor.moveToFirst()) { - do { - entriesList.add(loadDataIntoArray(entriesCursor)); - } while (entriesCursor.moveToNext()); + List> entriesList = new ArrayList<>(); + while (entriesCursor.moveToNext()) { + entriesList.add(getValuesFromCursor(entriesCursor, DatabaseTables.ENTRY)); } entriesCursor.close(); return entriesList; } - public List getAllQRCodes() { + public List> getAllQRCodes() { String sortOrder = SQL.QR_CODE.Q_ID + " DESC"; Cursor qrCodesCursor = database.query(SQL.QR_CODE.NAME, null, @@ -222,17 +311,15 @@ public List getAllQRCodes() { null, null, sortOrder); - List qrCodesList = new ArrayList<>(); - if (qrCodesCursor.moveToFirst()) { - do { - qrCodesList.add(loadDataIntoArray(qrCodesCursor)); - } while (qrCodesCursor.moveToNext()); + List> qrCodesList = new ArrayList<>(); + while (qrCodesCursor.moveToNext()) { + qrCodesList.add(getValuesFromCursor(qrCodesCursor, DatabaseTables.QR_CODE)); } qrCodesCursor.close(); return qrCodesList; } - public List getAllSecurityCodes() { + public List> getAllSecurityCodes() { String sortOrder = SQL.SECURITY_CODE.S_ID + " DESC"; Cursor securityCodesCursor = database.query(SQL.SECURITY_CODE.NAME, null, @@ -241,17 +328,16 @@ public List getAllSecurityCodes() { null, null, sortOrder); - List securityCodesList = new ArrayList<>(); - if (securityCodesCursor.moveToFirst()) { - do { - securityCodesList.add(loadDataIntoArray(securityCodesCursor)); - } while (securityCodesCursor.moveToNext()); + List> securityCodesList = new ArrayList<>(); + while (securityCodesCursor.moveToNext()) { + securityCodesList.add(getValuesFromCursor(securityCodesCursor, + DatabaseTables.SECURITY_CODE)); } securityCodesCursor.close(); return securityCodesList; } - public List getAllFields() { + public List> getAllFields() { String sortOrder = SQL.FIELD.F_ID + " DESC"; Cursor fieldsCursor = database.query(SQL.FIELD.NAME, null, @@ -260,11 +346,9 @@ public List getAllFields() { null, null, sortOrder); - List fieldsList = new ArrayList<>(); - if (fieldsCursor.moveToFirst()) { - do { - fieldsList.add(loadDataIntoArray(fieldsCursor)); - } while (fieldsCursor.moveToNext()); + List> fieldsList = new ArrayList<>(); + while (fieldsCursor.moveToNext()) { + fieldsList.add(getValuesFromCursor(fieldsCursor, DatabaseTables.FIELD)); } fieldsCursor.close(); return fieldsList; @@ -285,13 +369,13 @@ private ContentValues setParams(DatabaseTables table, Object... values) { params.put(SQL.ENTRY.E_PASSWORD, (String) values[1]); params.put(SQL.ENTRY.E_ICON, (String) values[2]); params.put(SQL.ENTRY.E_DESCRIPTION, (String) values[3]); - params.put(SQL.ENTRY.E_PARENT_CATEGORY, (int) values[4]); + params.put(SQL.ENTRY.E_PARENT_CATEGORY, (long) values[4]); break; case QR_CODE: - params.put(SQL.QR_CODE.NAME, (String) values[0]); + params.put(SQL.QR_CODE.Q_NAME, (String) values[0]); params.put(SQL.QR_CODE.Q_DESCRIPTION, (String) values[1]); - params.put(SQL.QR_CODE.Q_DATA, (String) values[3]); - params.put(SQL.QR_CODE.Q_PARENT_ENTRY, (int) values[4]); + params.put(SQL.QR_CODE.Q_DATA, (String) values[2]); + params.put(SQL.QR_CODE.Q_PARENT_ENTRY, (long) values[3]); break; case SECURITY_CODE: params.put(SQL.SECURITY_CODE.S_ACCOUNT_NAME, (String) values[0]); @@ -299,13 +383,13 @@ private ContentValues setParams(DatabaseTables table, Object... values) { case FIELD: params.put(SQL.FIELD.F_CODE, (String) values[0]); params.put(SQL.FIELD.F_USED, (boolean) values[1]); - params.put(SQL.FIELD.F_PARENT_SECURITY_CODE, (int) values[3]); + params.put(SQL.FIELD.F_PARENT_SECURITY_CODE, (long) values[2]); break; } return params; } - private String[] setSelectionArgs(int id) { + private String[] setSelectionArgs(long id) { return new String[]{String.valueOf(id)}; } } diff --git a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java index be51a17..70bd830 100644 --- a/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java +++ b/APP/app/src/main/java/javinator9889/securepass/util/values/Constants.java @@ -74,15 +74,11 @@ public static final class FIELD { // UPDATE SQL OPERATIONS public static String DB_UPDATE_FOR_DELETED_CATEGORY_WHERE_CLAUSE = "Entry.cidCategory = ?"; public static String DB_UPDATE_ENTRY_WHERE_CLAUSE = "Entry.idEntry = ?"; - public static String DB_UPDATE_CATEGORY_WHERE_CLAUSE = "UPDATE Category SET Category.name = ? WHERE" + - " Category.idCategory = ?"; - public static String DB_UPDATE_QR_CODE_WHERE_CLAUSE = "UPDATE QRCode SET QRCode.name = ?," + - " QRCode.description = ?, QRCode.data = ?, QRCode.fidEntry = ? " + - "WHERE QRCode.idQRCode = ?"; - public static String DB_UPDATE_SECURITY_CODE_WHERE_CLAUSE = "UPDATE SecurityCodes " + - "SET SecurityCodes.accountName = ? WHERE SecurityCodes.idSecurityCodes = ?"; - public static String DB_UPDATE_FIELD_WHERE_CLAUSE = "UPDATE Fields SET Fields.code = ?, " + - "Fields.used = ? WHERE Fields.idField = ?"; + public static String DB_UPDATE_CATEGORY_WHERE_CLAUSE = "Category.idCategory = ?"; + public static String DB_UPDATE_QR_CODE_WHERE_CLAUSE = "QRCode.idQRCode = ?"; + public static String DB_UPDATE_SECURITY_CODE_WHERE_CLAUSE = + "SecurityCodes.idSecurityCodes = ?"; + public static String DB_UPDATE_FIELD_WHERE_CLAUSE = "Fields.idField = ?"; // SELECT SQL OPERATIONS public static String DB_SELECT_CATEGORIES = "SELECT * FROM Categories"; diff --git a/APP/app/src/main/res/raw/create_category.sql b/APP/app/src/main/res/raw/create_category.sql new file mode 100644 index 0000000..0e15f7d --- /dev/null +++ b/APP/app/src/main/res/raw/create_category.sql @@ -0,0 +1,4 @@ +CREATE TABLE IF NOT EXISTS Category ( + idCategory INTEGER NOT NULL DEFAULT 0, + name VARCHAR(45) NULL, + PRIMARY KEY (idCategory)); \ No newline at end of file diff --git a/APP/app/src/main/res/raw/create_entry.sql b/APP/app/src/main/res/raw/create_entry.sql new file mode 100644 index 0000000..6a3e250 --- /dev/null +++ b/APP/app/src/main/res/raw/create_entry.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS Entry ( + idEntry INTEGER NOT NULL DEFAULT 0, + account VARCHAR(100) NOT NULL, + password VARCHAR(180) NOT NULL, + icon VARCHAR(180) NULL, + description LONGBLOB NULL, + cidCategory INT NOT NULL, + PRIMARY KEY (idEntry), + CONSTRAINT fk_Entry_Category + FOREIGN KEY (cidCategory) + REFERENCES Category (idCategory) + ON DELETE NO ACTION + ON UPDATE CASCADE); \ No newline at end of file diff --git a/APP/app/src/main/res/raw/create_field.sql b/APP/app/src/main/res/raw/create_field.sql new file mode 100644 index 0000000..76a5a1e --- /dev/null +++ b/APP/app/src/main/res/raw/create_field.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS Fields ( + idField INTEGER NOT NULL DEFAULT 0, + code VARCHAR(180) NOT NULL, + used TINYINT NOT NULL DEFAULT 0, + fidSecurityCodes INTEGER NOT NULL, + PRIMARY KEY (idField), + CONSTRAINT fk_Fields_SecurityCodes + FOREIGN KEY (fidSecurityCodes) + REFERENCES SecurityCodes (idSecurityCodes) + ON DELETE CASCADE + ON UPDATE NO ACTION); \ No newline at end of file diff --git a/APP/app/src/main/res/raw/create_qrcode.sql b/APP/app/src/main/res/raw/create_qrcode.sql new file mode 100644 index 0000000..08a2eae --- /dev/null +++ b/APP/app/src/main/res/raw/create_qrcode.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS QRCode ( + idQRCode INTEGER NOT NULL DEFAULT 0, + name VARCHAR(45) NOT NULL, + description VARCHAR(180) NULL, + data LONGTEXT NOT NULL, + fidEntry INTEGER NOT NULL, + PRIMARY KEY (idQRCode), + CONSTRAINT fk_QRCode_Entry + FOREIGN KEY (fidEntry) + REFERENCES Entry (idEntry) + ON DELETE CASCADE + ON UPDATE NO ACTION); \ No newline at end of file diff --git a/APP/app/src/main/res/raw/create_security_code.sql b/APP/app/src/main/res/raw/create_security_code.sql new file mode 100644 index 0000000..e205e39 --- /dev/null +++ b/APP/app/src/main/res/raw/create_security_code.sql @@ -0,0 +1,4 @@ +CREATE TABLE IF NOT EXISTS SecurityCodes ( + idSecurityCodes INTEGER NOT NULL DEFAULT 0, + accountName VARCHAR(45) NOT NULL, + PRIMARY KEY (idSecurityCodes)); \ No newline at end of file diff --git a/APP/app/src/main/res/raw/database_script.sql b/APP/app/src/main/res/raw/database_script.sql index 17c5285..93b8515 100644 --- a/APP/app/src/main/res/raw/database_script.sql +++ b/APP/app/src/main/res/raw/database_script.sql @@ -1,86 +1,51 @@ --- ----------------------------------------------------- --- Schema securepassdb --- ----------------------------------------------------- --- SCHEMAS ARE NOT ALLOWED ON SQLite --- ----------------------------------------------------- - --- ----------------------------------------------------- --- Table `securepassdb`.`Category` --- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Category` ( - `idCategory` INT NOT NULL DEFAULT 0, - `name` VARCHAR(45) NULL, - PRIMARY KEY (`idCategory`)); --- ENGINE = InnoDB; - + `idCategory` INT NOT NULL DEFAULT 0, + `name` VARCHAR(45) NULL, + PRIMARY KEY (`idCategory`)); --- ----------------------------------------------------- --- Table `securepassdb`.`Entry` --- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Entry` ( - `idEntry` INT NOT NULL AUTO_INCREMENT, - `account` VARCHAR(180) NOT NULL, - `password` VARCHAR(180) NOT NULL, - `icon` VARCHAR(180) NULL, - `description` LONGBLOB NULL, - `cidCategory` INT NOT NULL, - PRIMARY KEY (`idEntry`, `cidCategory`), - INDEX `fk_Entry_Category1_idx` (`cidCategory` ASC), - CONSTRAINT `fk_Entry_Category1` - FOREIGN KEY (`cidCategory`) - REFERENCES `Category` (`idCategory`) - ON DELETE NO ACTION - ON UPDATE CASCADE); --- ENGINE = InnoDB; + `idEntry` INT NOT NULL AUTO_INCREMENT, + `account` VARCHAR(180) NOT NULL, + `password` VARCHAR(180) NOT NULL, + `icon` VARCHAR(180) NULL, + `description` LONGBLOB NULL, + `cidCategory` INT NOT NULL, + PRIMARY KEY (`idEntry`, `cidCategory`), + INDEX `fk_Entry_Category1_idx` (`cidCategory` ASC), + CONSTRAINT `fk_Entry_Category1` + FOREIGN KEY (`cidCategory`) + REFERENCES `Category` (`idCategory`) + ON DELETE NO ACTION + ON UPDATE CASCADE); - --- ----------------------------------------------------- --- Table `securepassdb`.`QRCode` --- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `QRCode` ( - `idQRCode` INT NOT NULL AUTO_INCREMENT, - `name` VARCHAR(45) NOT NULL, - `description` VARCHAR(180) NULL, - `data` LONGTEXT NOT NULL, - `fidEntry` INT NOT NULL, - PRIMARY KEY (`idQRCode`, `fidEntry`), - INDEX `fk_QRCode_Entry1_idx` (`fidEntry` ASC), - CONSTRAINT `fk_QRCode_Entry1` - FOREIGN KEY (`fidEntry`) - REFERENCES `Entry` (`idEntry`) - ON DELETE CASCADE - ON UPDATE NO ACTION); --- ENGINE = InnoDB; - + `idQRCode` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(45) NOT NULL, + `description` VARCHAR(180) NULL, + `data` LONGTEXT NOT NULL, + `fidEntry` INT NOT NULL, + PRIMARY KEY (`idQRCode`, `fidEntry`), + INDEX `fk_QRCode_Entry1_idx` (`fidEntry` ASC), + CONSTRAINT `fk_QRCode_Entry1` + FOREIGN KEY (`fidEntry`) + REFERENCES `Entry` (`idEntry`) + ON DELETE CASCADE + ON UPDATE NO ACTION); --- ----------------------------------------------------- --- Table `securepassdb`.`SecurityCodes` --- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `SecurityCodes` ( - `idSecurityCodes` INT NOT NULL AUTO_INCREMENT, - `accountName` VARCHAR(45) NOT NULL, - PRIMARY KEY (`idSecurityCodes`)); --- ENGINE = InnoDB; + `idSecurityCodes` INT NOT NULL AUTO_INCREMENT, + `accountName` VARCHAR(45) NOT NULL, + PRIMARY KEY (`idSecurityCodes`)); - --- ----------------------------------------------------- --- Table `securepassdb`.`Fields` --- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `Fields` ( - `idField` INT NOT NULL AUTO_INCREMENT, - `code` VARCHAR(180) NOT NULL, - `used` TINYINT NOT NULL DEFAULT 0, - `fidSecurityCodes` INT NOT NULL, - PRIMARY KEY (`idField`, `fidSecurityCodes`), - INDEX `fk_Fields_SecurityCodes1_idx` (`fidSecurityCodes` ASC), - CONSTRAINT `fk_Fields_SecurityCodes1` - FOREIGN KEY (`fidSecurityCodes`) - REFERENCES `SecurityCodes` (`idSecurityCodes`) - ON DELETE CASCADE - ON UPDATE NO ACTION); --- ENGINE = InnoDB; - - -SET SQL_MODE=@OLD_SQL_MODE; -SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; -SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + `idField` INT NOT NULL AUTO_INCREMENT, + `code` VARCHAR(180) NOT NULL, + `used` TINYINT NOT NULL DEFAULT 0, + `fidSecurityCodes` INT NOT NULL, + PRIMARY KEY (`idField`, `fidSecurityCodes`), + INDEX `fk_Fields_SecurityCodes1_idx` (`fidSecurityCodes` ASC), + CONSTRAINT `fk_Fields_SecurityCodes1` + FOREIGN KEY (`fidSecurityCodes`) + REFERENCES `SecurityCodes` (`idSecurityCodes`) + ON DELETE CASCADE + ON UPDATE NO ACTION); \ No newline at end of file