diff --git a/app/src/main/java/me/impy/aegis/MainActivity.java b/app/src/main/java/me/impy/aegis/MainActivity.java index bd7b75ef..3f786569 100644 --- a/app/src/main/java/me/impy/aegis/MainActivity.java +++ b/app/src/main/java/me/impy/aegis/MainActivity.java @@ -25,17 +25,20 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.Toast; +import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.lang.reflect.UndeclaredThrowableException; import java.util.ArrayList; import java.util.Collections; +import java.util.List; import me.impy.aegis.crypto.MasterKey; import me.impy.aegis.db.DatabaseEntry; 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.util.ByteInputStream; public class MainActivity extends AppCompatActivity { private static final int CODE_GET_KEYINFO = 0; @@ -49,7 +52,6 @@ public class MainActivity extends AppCompatActivity { private DatabaseManager _db; private boolean _nightMode = false; - private Menu _menu; @Override @@ -145,28 +147,51 @@ public class MainActivity extends AppCompatActivity { return; } - InputStream stream = null; + InputStream fileStream = null; try { try { - stream = getContentResolver().openInputStream(data.getData()); + fileStream = getContentResolver().openInputStream(data.getData()); } catch (Exception e) { Toast.makeText(this, "An error occurred while trying to open the file", Toast.LENGTH_SHORT).show(); return; } - FreeOTPImporter importer = new FreeOTPImporter(stream); + ByteInputStream stream; try { - for (DatabaseEntry profile : importer.convert()) { - addKey(new KeyProfile(profile)); + int read; + 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) { + Toast.makeText(this, "An error occurred while trying to read the file", Toast.LENGTH_SHORT).show(); + return; + } + + List 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(); return; } + + for (DatabaseEntry entry : entries) { + addKey(new KeyProfile(entry)); + } } finally { - if (stream != null) { + if (fileStream != null) { try { - stream.close(); + fileStream.close(); } catch (Exception e) { } } diff --git a/app/src/main/java/me/impy/aegis/ext/AegisImporter.java b/app/src/main/java/me/impy/aegis/ext/AegisImporter.java index 1a5d1a4a..4b866bda 100644 --- a/app/src/main/java/me/impy/aegis/ext/AegisImporter.java +++ b/app/src/main/java/me/impy/aegis/ext/AegisImporter.java @@ -1,30 +1,27 @@ package me.impy.aegis.ext; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; import java.util.List; import me.impy.aegis.db.Database; 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); } @Override public List convert() throws Exception { - int read; - 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(); + byte[] bytes = _stream.getBytes(); Database db = new Database(); db.deserialize(bytes); return db.getKeys(); } + + @Override + public String getName() { + return "Aegis"; + } } diff --git a/app/src/main/java/me/impy/aegis/ext/DatabaseImporter.java b/app/src/main/java/me/impy/aegis/ext/DatabaseImporter.java new file mode 100644 index 00000000..c2fe84b0 --- /dev/null +++ b/app/src/main/java/me/impy/aegis/ext/DatabaseImporter.java @@ -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> _converters = Collections.unmodifiableList( + new ArrayList<>(Arrays.asList(AegisImporter.class, FreeOTPImporter.class)) + ); + + protected ByteInputStream _stream; + + protected DatabaseImporter(ByteInputStream stream) { + _stream = stream; + } + + public abstract List convert() throws Exception; + + public abstract String getName(); + + public static DatabaseImporter create(ByteInputStream stream, Class type) { + try { + return type.getConstructor(ByteInputStream.class).newInstance(stream); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static List create(ByteInputStream stream) { + List list = new ArrayList<>(); + for (Class type : _converters) { + list.add(create(stream, type)); + } + return list; + } +} diff --git a/app/src/main/java/me/impy/aegis/ext/FreeOTPImporter.java b/app/src/main/java/me/impy/aegis/ext/FreeOTPImporter.java index bcad669c..9d13216c 100644 --- a/app/src/main/java/me/impy/aegis/ext/FreeOTPImporter.java +++ b/app/src/main/java/me/impy/aegis/ext/FreeOTPImporter.java @@ -9,15 +9,15 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.List; import me.impy.aegis.crypto.KeyInfo; import me.impy.aegis.db.DatabaseEntry; +import me.impy.aegis.util.ByteInputStream; -public class FreeOTPImporter extends KeyConverter { - public FreeOTPImporter(InputStream stream) { +public class FreeOTPImporter extends DatabaseImporter { + public FreeOTPImporter(ByteInputStream stream) { super(stream); } @@ -35,6 +35,11 @@ public class FreeOTPImporter extends KeyConverter { return parse(parser); } + @Override + public String getName() { + return "FreeOTP"; + } + private static List parse(XmlPullParser parser) throws IOException, XmlPullParserException, JSONException { List entries = new ArrayList<>(); diff --git a/app/src/main/java/me/impy/aegis/ext/KeyConverter.java b/app/src/main/java/me/impy/aegis/ext/KeyConverter.java deleted file mode 100644 index d2d603db..00000000 --- a/app/src/main/java/me/impy/aegis/ext/KeyConverter.java +++ /dev/null @@ -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 convert() throws Exception; -} diff --git a/app/src/main/java/me/impy/aegis/util/ByteInputStream.java b/app/src/main/java/me/impy/aegis/util/ByteInputStream.java index 1ec321d7..3d52fbc9 100644 --- a/app/src/main/java/me/impy/aegis/util/ByteInputStream.java +++ b/app/src/main/java/me/impy/aegis/util/ByteInputStream.java @@ -1,8 +1,13 @@ package me.impy.aegis.util; -/** - * Created by alex on 12/3/17. - */ +import java.io.ByteArrayInputStream; -public class ByteInputStream { +public class ByteInputStream extends ByteArrayInputStream { + public ByteInputStream(byte[] buf) { + super(buf); + } + + public byte[] getBytes() { + return this.buf; + } }