package com.amaze.filemanager.database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import com.amaze.filemanager.utils.CryptUtil; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.UnrecoverableEntryException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** * Created by vishal on 15/4/17. */ public class CryptHandler extends SQLiteOpenHelper { private static final String DATABASE_NAME = "explorer.db"; private static final String TABLE_ENCRYPTED = "encrypted"; private static final String COLUMN_ENCRYPTED_ID = "_id"; private static final String COLUMN_ENCRYPTED_PATH = "path"; private static final String COLUMN_ENCRYPTED_PASSWORD = "password"; private Context context; public CryptHandler(Context context) { super(context, DATABASE_NAME, null, TabHandler.DATABASE_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE_ENCRYPTED = "CREATE TABLE " + TABLE_ENCRYPTED + "(" + COLUMN_ENCRYPTED_ID + " INTEGER PRIMARY KEY," + COLUMN_ENCRYPTED_PATH + " TEXT," + COLUMN_ENCRYPTED_PASSWORD + " TEXT" + ")"; db.execSQL(CREATE_TABLE_ENCRYPTED); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_ENCRYPTED); onCreate(db); } public void addEntry(EncryptedEntry encryptedEntry) throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, UnrecoverableEntryException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, KeyStoreException, NoSuchProviderException, IllegalBlockSizeException { ContentValues contentValues = new ContentValues(); //contentValues.put(COLUMN_ENCRYPTED_ID, encryptedEntry.getId()); contentValues.put(COLUMN_ENCRYPTED_PATH, encryptedEntry.getPath()); contentValues.put(COLUMN_ENCRYPTED_PASSWORD, CryptUtil.encryptPassword(context, encryptedEntry.getPassword())); SQLiteDatabase sqLiteDatabase = getWritableDatabase(); sqLiteDatabase.insert(TABLE_ENCRYPTED, null, contentValues); sqLiteDatabase.close(); } public void clear(String path) { try { SQLiteDatabase sqLiteDatabase = getWritableDatabase(); sqLiteDatabase.delete(TABLE_ENCRYPTED, COLUMN_ENCRYPTED_PATH + " = ?", new String[]{path}); sqLiteDatabase.close(); } catch (NumberFormatException e) { e.printStackTrace(); } } public void updateEntry(EncryptedEntry oldEncryptedEntry, EncryptedEntry newEncryptedEntry) throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, UnrecoverableEntryException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, KeyStoreException, NoSuchProviderException, IllegalBlockSizeException { SQLiteDatabase sqLiteDatabase = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(COLUMN_ENCRYPTED_ID, newEncryptedEntry.getId()); contentValues.put(COLUMN_ENCRYPTED_PATH, newEncryptedEntry.getPath()); contentValues.put(COLUMN_ENCRYPTED_PASSWORD, CryptUtil.encryptPassword(context, newEncryptedEntry.getPassword())); sqLiteDatabase.update(TABLE_ENCRYPTED, contentValues, COLUMN_ENCRYPTED_ID + " = ?", new String[]{oldEncryptedEntry.getId() + ""}); sqLiteDatabase.close(); } public EncryptedEntry findEntry(String path) throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, UnrecoverableEntryException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, KeyStoreException, NoSuchProviderException, IllegalBlockSizeException { String query = "Select * FROM " + TABLE_ENCRYPTED + " WHERE " + COLUMN_ENCRYPTED_PATH + "= \"" + path + "\""; SQLiteDatabase sqLiteDatabase = getReadableDatabase(); Cursor cursor = sqLiteDatabase.rawQuery(query, null); EncryptedEntry encryptedEntry = new EncryptedEntry(); if (cursor.moveToFirst()) { cursor.moveToFirst(); encryptedEntry.setId((cursor.getInt(0))); encryptedEntry.setPath(cursor.getString(1)); encryptedEntry.setPassword(CryptUtil.decryptPassword(context, cursor.getString(2))); cursor.close(); } else { encryptedEntry = null; } sqLiteDatabase.close(); return encryptedEntry; } public List<EncryptedEntry> getAllEntries() throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, UnrecoverableEntryException, InvalidAlgorithmParameterException, NoSuchPaddingException, BadPaddingException, KeyStoreException, NoSuchProviderException, IllegalBlockSizeException { List<EncryptedEntry> entryList = new ArrayList<EncryptedEntry>(); // Select all query String query = "Select * FROM " + TABLE_ENCRYPTED; SQLiteDatabase sqLiteDatabase = getReadableDatabase(); Cursor cursor = null; try { cursor = sqLiteDatabase.rawQuery(query, null); // Looping through all rows and adding them to list if (cursor.getCount() > 0 && cursor.moveToFirst()) { do { EncryptedEntry encryptedEntry = new EncryptedEntry(); encryptedEntry.setId((cursor.getInt(0))); encryptedEntry.setPath(cursor.getString(1)); encryptedEntry.setPassword(CryptUtil.decryptPassword(context, cursor.getString(2))); entryList.add(encryptedEntry); } while (cursor.moveToNext()); } } finally { if (cursor != null) { cursor.close(); } } sqLiteDatabase.close(); return entryList; } }