From db54d38c14e3f6183bde8de13b355ed2d0fc7dac Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Wed, 27 Dec 2017 23:01:23 +0100 Subject: [PATCH] Fix a couple of bugs in the new profile edit activity --- .../java/me/impy/aegis/AddProfileActivity.java | 2 +- .../java/me/impy/aegis/EditProfileActivity.java | 17 +++++++++++++++++ .../main/java/me/impy/aegis/crypto/KeyInfo.java | 8 ++++++-- .../main/java/me/impy/aegis/crypto/otp/OTP.java | 2 +- .../main/java/me/impy/aegis/db/Database.java | 14 +++++++++++++- .../me/impy/aegis/importers/AegisImporter.java | 2 +- 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/me/impy/aegis/AddProfileActivity.java b/app/src/main/java/me/impy/aegis/AddProfileActivity.java index 5e9a405e..9e311644 100644 --- a/app/src/main/java/me/impy/aegis/AddProfileActivity.java +++ b/app/src/main/java/me/impy/aegis/AddProfileActivity.java @@ -67,7 +67,7 @@ public class AddProfileActivity extends AegisActivity { private void initializeForm() { KeyInfo info = _keyProfile.getEntry().getInfo(); _profileName.setText(info.getAccountName()); - _textAlgorithm.setText(info.getAlgorithm()); + _textAlgorithm.setText(info.getAlgorithm(false)); _textIssuer.setText(info.getIssuer()); _textPeriod.setText(info.getPeriod() + " seconds"); diff --git a/app/src/main/java/me/impy/aegis/EditProfileActivity.java b/app/src/main/java/me/impy/aegis/EditProfileActivity.java index 969824e3..3b90330e 100644 --- a/app/src/main/java/me/impy/aegis/EditProfileActivity.java +++ b/app/src/main/java/me/impy/aegis/EditProfileActivity.java @@ -2,6 +2,7 @@ package me.impy.aegis; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.ArrayRes; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -65,18 +66,24 @@ public class EditProfileActivity extends AegisActivity { _textSecret.setText(Base32.encodeOriginal(entry.getInfo().getSecret())); _textSecret.addTextChangedListener(watcher); + String type = entry.getInfo().getType(); _spinnerType = findViewById(R.id.spinner_type); SpinnerHelper.fillSpinner(this, _spinnerType, R.array.otp_types_array); + _spinnerType.setSelection(getStringResourceIndex(R.array.otp_types_array, type), false); _spinnerType.setOnTouchListener(_selectedListener); _spinnerType.setOnItemSelectedListener(_selectedListener); + String algo = entry.getInfo().getAlgorithm(false); _spinnerAlgo = findViewById(R.id.spinner_algo); SpinnerHelper.fillSpinner(this, _spinnerAlgo, R.array.otp_algo_array); + _spinnerAlgo.setSelection(getStringResourceIndex(R.array.otp_algo_array, algo), false); _spinnerAlgo.setOnTouchListener(_selectedListener); _spinnerAlgo.setOnItemSelectedListener(_selectedListener); + String digits = Integer.toString(entry.getInfo().getDigits()); _spinnerDigits = findViewById(R.id.spinner_digits); SpinnerHelper.fillSpinner(this, _spinnerDigits, R.array.otp_digits_array); + _spinnerDigits.setSelection(getStringResourceIndex(R.array.otp_digits_array, digits), false); _spinnerDigits.setOnTouchListener(_selectedListener); _spinnerDigits.setOnItemSelectedListener(_selectedListener); } @@ -217,4 +224,14 @@ public class EditProfileActivity extends AegisActivity { } } + + private int getStringResourceIndex(@ArrayRes int id, String string) { + String[] res = getResources().getStringArray(id); + for (int i = 0; i < res.length; i++) { + if (res[i].equals(string)) { + return i; + } + } + return -1; + } } diff --git a/app/src/main/java/me/impy/aegis/crypto/KeyInfo.java b/app/src/main/java/me/impy/aegis/crypto/KeyInfo.java index b91bd645..7bd653fa 100644 --- a/app/src/main/java/me/impy/aegis/crypto/KeyInfo.java +++ b/app/src/main/java/me/impy/aegis/crypto/KeyInfo.java @@ -21,6 +21,7 @@ public class KeyInfo implements Serializable { builder.scheme("otpauth"); builder.authority(_type); + builder.appendQueryParameter("digits", Integer.toString(_digits)); builder.appendQueryParameter("period", Integer.toString(_period)); builder.appendQueryParameter("algorithm", _algorithm); builder.appendQueryParameter("secret", Base32.encodeOriginal(_secret)); @@ -125,8 +126,11 @@ public class KeyInfo implements Serializable { public String getIssuer() { return _issuer; } - public String getAlgorithm() { - return "Hmac" + _algorithm; + public String getAlgorithm(boolean java) { + if (java) { + return "Hmac" + _algorithm; + } + return _algorithm; } public int getDigits() { return _digits; diff --git a/app/src/main/java/me/impy/aegis/crypto/otp/OTP.java b/app/src/main/java/me/impy/aegis/crypto/otp/OTP.java index 4e146040..d9615d24 100644 --- a/app/src/main/java/me/impy/aegis/crypto/otp/OTP.java +++ b/app/src/main/java/me/impy/aegis/crypto/otp/OTP.java @@ -15,7 +15,7 @@ public class OTP { switch (info.getType()) { case "totp": String time = Long.toHexString(System.currentTimeMillis() / 1000 / info.getPeriod()); - otp = TOTP.generateTOTP(info.getSecret(), time, info.getDigits(), info.getAlgorithm()); + otp = TOTP.generateTOTP(info.getSecret(), time, info.getDigits(), info.getAlgorithm(true)); break; case "hotp": otp = HOTP.generateOTP(info.getSecret(), info.getCounter(), info.getDigits(), false, -1); diff --git a/app/src/main/java/me/impy/aegis/db/Database.java b/app/src/main/java/me/impy/aegis/db/Database.java index 4213b6c9..5ecb4bc6 100644 --- a/app/src/main/java/me/impy/aegis/db/Database.java +++ b/app/src/main/java/me/impy/aegis/db/Database.java @@ -27,6 +27,10 @@ public class Database { } public void deserialize(byte[] data) throws Exception { + deserialize(data, true); + } + + public void deserialize(byte[] data, boolean incCount) throws Exception { JSONObject obj = new JSONObject(new String(data, "UTF-8")); // TODO: support different VERSION deserialization providers @@ -39,7 +43,15 @@ public class Database { for (int i = 0; i < array.length(); i++) { DatabaseEntry entry = new DatabaseEntry(null); entry.deserialize(array.getJSONObject(i)); - addKey(entry); + + // if incCount is false, don't increment the counter and don't set an ID + // this is used by the database importer to prevent an exception down the line + // TODO: find a better solution for this ugly hack + if (incCount) { + addKey(entry); + } else { + _entries.add(entry); + } } } diff --git a/app/src/main/java/me/impy/aegis/importers/AegisImporter.java b/app/src/main/java/me/impy/aegis/importers/AegisImporter.java index b5e9ebc4..94ba2051 100644 --- a/app/src/main/java/me/impy/aegis/importers/AegisImporter.java +++ b/app/src/main/java/me/impy/aegis/importers/AegisImporter.java @@ -16,7 +16,7 @@ public class AegisImporter extends DatabaseImporter { public List convert() throws Exception { byte[] bytes = _stream.getBytes(); Database db = new Database(); - db.deserialize(bytes); + db.deserialize(bytes, false); return db.getKeys(); }