Improve database file reading code

This commit is contained in:
Alexander Bakker 2017-12-04 22:08:50 +01:00
parent 4e10e5d514
commit 515e3a24eb
3 changed files with 27 additions and 12 deletions

View file

@ -22,6 +22,7 @@ import me.impy.aegis.crypto.slots.Slot;
import me.impy.aegis.crypto.slots.SlotCollection;
import me.impy.aegis.db.Database;
import me.impy.aegis.db.DatabaseFile;
import me.impy.aegis.db.DatabaseManager;
public class IntroActivity extends AppIntro implements DerivationTask.Callback {
public static final int RESULT_OK = 0;
@ -170,7 +171,7 @@ public class IntroActivity extends AppIntro implements DerivationTask.Callback {
_databaseFile.setContent(result.Data);
_databaseFile.setCryptParameters(result.Parameters);
}
_databaseFile.save(getApplicationContext());
_databaseFile.save(getApplicationContext(), DatabaseManager.FILENAME);
} catch (Exception e) {
setException(e);
return;

View file

@ -3,6 +3,7 @@ package me.impy.aegis.db;
import android.content.Context;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@ -20,7 +21,6 @@ public class DatabaseFile {
private static final byte SECTION_SLOTS = 0x01;
private static final byte SECTION_END = (byte) 0xFF;
private static final byte VERSION = 1;
private static final String FILENAME = "aegis.db";
private final byte[] HEADER;
@ -116,22 +116,34 @@ public class DatabaseFile {
return !_slots.isEmpty() && _cryptParameters != null;
}
public void save(Context context) throws IOException {
public void save(Context context, String filename) throws IOException {
byte[] data = serialize();
FileOutputStream file = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
FileOutputStream file = context.openFileOutput(filename, Context.MODE_PRIVATE);
file.write(data);
file.close();
}
public static DatabaseFile load(Context context) throws Exception {
FileInputStream file = context.openFileInput(FILENAME);
byte[] data = new byte[(int) file.getChannel().size()];
file.read(data);
file.close();
public static DatabaseFile load(Context context, String filename) throws Exception {
byte[] bytes;
FileInputStream file = null;
try {
file = context.openFileInput(filename);
DataInputStream stream = new DataInputStream(file);
bytes = new byte[(int) file.getChannel().size()];
stream.readFully(bytes);
stream.close();
} finally {
// always close the file
// there is no need to close the DataInputStream
if (file != null) {
file.close();
}
}
DatabaseFile db = new DatabaseFile();
db.deserialize(data);
db.deserialize(bytes);
return db;
}

View file

@ -10,6 +10,8 @@ import me.impy.aegis.crypto.CryptResult;
import me.impy.aegis.crypto.MasterKey;
public class DatabaseManager {
public static final String FILENAME = "aegis.db";
private MasterKey _key;
private DatabaseFile _file;
private Database _db;
@ -20,7 +22,7 @@ public class DatabaseManager {
}
public void load() throws Exception {
_file = DatabaseFile.load(_context);
_file = DatabaseFile.load(_context, FILENAME);
if (!_file.isEncrypted()) {
byte[] bytes = _file.getContent();
_db = new Database();
@ -48,7 +50,7 @@ public class DatabaseManager {
_file.setContent(result.Data);
_file.setCryptParameters(result.Parameters);
}
_file.save(_context);
_file.save(_context, FILENAME);
}
public void addKey(DatabaseEntry entry) throws Exception {