Rework the import code a bit

This commit is contained in:
Alexander Bakker 2017-12-03 21:42:12 +01:00
parent df5a815e57
commit 41846f9114
6 changed files with 101 additions and 44 deletions

View file

@ -25,17 +25,20 @@ import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.UndeclaredThrowableException; import java.lang.reflect.UndeclaredThrowableException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import me.impy.aegis.crypto.MasterKey; import me.impy.aegis.crypto.MasterKey;
import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.db.DatabaseEntry;
import me.impy.aegis.db.DatabaseManager; import me.impy.aegis.db.DatabaseManager;
import me.impy.aegis.ext.FreeOTPImporter; import me.impy.aegis.ext.DatabaseImporter;
import me.impy.aegis.helpers.SimpleItemTouchHelperCallback; import me.impy.aegis.helpers.SimpleItemTouchHelperCallback;
import me.impy.aegis.util.ByteInputStream;
public class MainActivity extends AppCompatActivity { public class MainActivity extends AppCompatActivity {
private static final int CODE_GET_KEYINFO = 0; private static final int CODE_GET_KEYINFO = 0;
@ -49,7 +52,6 @@ public class MainActivity extends AppCompatActivity {
private DatabaseManager _db; private DatabaseManager _db;
private boolean _nightMode = false; private boolean _nightMode = false;
private Menu _menu; private Menu _menu;
@Override @Override
@ -145,28 +147,51 @@ public class MainActivity extends AppCompatActivity {
return; return;
} }
InputStream stream = null; InputStream fileStream = null;
try { try {
try { try {
stream = getContentResolver().openInputStream(data.getData()); fileStream = getContentResolver().openInputStream(data.getData());
} catch (Exception e) { } catch (Exception e) {
Toast.makeText(this, "An error occurred while trying to open the file", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "An error occurred while trying to open the file", Toast.LENGTH_SHORT).show();
return; return;
} }
FreeOTPImporter importer = new FreeOTPImporter(stream); ByteInputStream stream;
try { try {
for (DatabaseEntry profile : importer.convert()) { int read;
addKey(new KeyProfile(profile)); byte[] buf = new byte[4096];
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((read = fileStream.read(buf, 0, buf.length)) != -1) {
outStream.write(buf, 0, read);
} }
stream = new ByteInputStream(outStream.toByteArray());
} catch (Exception e) { } catch (Exception e) {
Toast.makeText(this, "An error occurred while trying to read the file", Toast.LENGTH_SHORT).show();
return;
}
List<DatabaseEntry> entries = null;
for (DatabaseImporter converter : DatabaseImporter.create(stream)) {
try {
entries = converter.convert();
break;
} catch (Exception e) {
stream.reset();
}
}
if (entries == null) {
Toast.makeText(this, "An error occurred while trying to parse the file", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "An error occurred while trying to parse the file", Toast.LENGTH_SHORT).show();
return; return;
} }
for (DatabaseEntry entry : entries) {
addKey(new KeyProfile(entry));
}
} finally { } finally {
if (stream != null) { if (fileStream != null) {
try { try {
stream.close(); fileStream.close();
} catch (Exception e) { } catch (Exception e) {
} }
} }

View file

@ -1,30 +1,27 @@
package me.impy.aegis.ext; package me.impy.aegis.ext;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List; import java.util.List;
import me.impy.aegis.db.Database; import me.impy.aegis.db.Database;
import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.db.DatabaseEntry;
import me.impy.aegis.util.ByteInputStream;
public class AegisImporter extends KeyConverter { public class AegisImporter extends DatabaseImporter {
public AegisImporter(InputStream stream) { public AegisImporter(ByteInputStream stream) {
super(stream); super(stream);
} }
@Override @Override
public List<DatabaseEntry> convert() throws Exception { public List<DatabaseEntry> convert() throws Exception {
int read; byte[] bytes = _stream.getBytes();
byte[] buffer = new byte[4096];
ByteArrayOutputStream stream = new ByteArrayOutputStream();
while ((read = _stream.read(buffer, 0, buffer.length)) != -1) {
stream.write(buffer, 0, read);
}
byte[] bytes = stream.toByteArray();
Database db = new Database(); Database db = new Database();
db.deserialize(bytes); db.deserialize(bytes);
return db.getKeys(); return db.getKeys();
} }
@Override
public String getName() {
return "Aegis";
}
} }

View file

@ -0,0 +1,41 @@
package me.impy.aegis.ext;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import me.impy.aegis.db.DatabaseEntry;
import me.impy.aegis.util.ByteInputStream;
public abstract class DatabaseImporter {
private static List<Class<? extends DatabaseImporter>> _converters = Collections.unmodifiableList(
new ArrayList<>(Arrays.asList(AegisImporter.class, FreeOTPImporter.class))
);
protected ByteInputStream _stream;
protected DatabaseImporter(ByteInputStream stream) {
_stream = stream;
}
public abstract List<DatabaseEntry> convert() throws Exception;
public abstract String getName();
public static DatabaseImporter create(ByteInputStream stream, Class<? extends DatabaseImporter> type) {
try {
return type.getConstructor(ByteInputStream.class).newInstance(stream);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static List<DatabaseImporter> create(ByteInputStream stream) {
List<DatabaseImporter> list = new ArrayList<>();
for (Class<? extends DatabaseImporter> type : _converters) {
list.add(create(stream, type));
}
return list;
}
}

View file

@ -9,15 +9,15 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import me.impy.aegis.crypto.KeyInfo; import me.impy.aegis.crypto.KeyInfo;
import me.impy.aegis.db.DatabaseEntry; import me.impy.aegis.db.DatabaseEntry;
import me.impy.aegis.util.ByteInputStream;
public class FreeOTPImporter extends KeyConverter { public class FreeOTPImporter extends DatabaseImporter {
public FreeOTPImporter(InputStream stream) { public FreeOTPImporter(ByteInputStream stream) {
super(stream); super(stream);
} }
@ -35,6 +35,11 @@ public class FreeOTPImporter extends KeyConverter {
return parse(parser); return parse(parser);
} }
@Override
public String getName() {
return "FreeOTP";
}
private static List<DatabaseEntry> parse(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { private static List<DatabaseEntry> parse(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException {
List<Entry> entries = new ArrayList<>(); List<Entry> entries = new ArrayList<>();

View file

@ -1,16 +0,0 @@
package me.impy.aegis.ext;
import java.io.InputStream;
import java.util.List;
import me.impy.aegis.db.DatabaseEntry;
public abstract class KeyConverter {
protected InputStream _stream;
public KeyConverter(InputStream stream) {
_stream = stream;
}
public abstract List<DatabaseEntry> convert() throws Exception;
}

View file

@ -1,8 +1,13 @@
package me.impy.aegis.util; package me.impy.aegis.util;
/** import java.io.ByteArrayInputStream;
* Created by alex on 12/3/17.
*/
public class ByteInputStream { public class ByteInputStream extends ByteArrayInputStream {
public ByteInputStream(byte[] buf) {
super(buf);
}
public byte[] getBytes() {
return this.buf;
}
} }