From 327b7ccbaeb00cee496c3f6b32498ec1d052f84d Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Wed, 23 Jun 2021 18:06:01 +0200 Subject: [PATCH] Perform case changes using Locale.ROOT where applicable Fixes #777 --- .../java/com/beemdevelopment/aegis/encoding/Base32.java | 4 +++- .../main/java/com/beemdevelopment/aegis/encoding/Hex.java | 4 +++- .../java/com/beemdevelopment/aegis/icons/IconType.java | 4 +++- .../beemdevelopment/aegis/importers/AndOtpImporter.java | 3 ++- .../beemdevelopment/aegis/importers/FreeOtpImporter.java | 3 ++- .../main/java/com/beemdevelopment/aegis/otp/OtpInfo.java | 5 +++-- .../main/java/com/beemdevelopment/aegis/otp/SteamInfo.java | 3 ++- .../com/beemdevelopment/aegis/ui/EditEntryActivity.java | 7 +++---- 8 files changed, 21 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/beemdevelopment/aegis/encoding/Base32.java b/app/src/main/java/com/beemdevelopment/aegis/encoding/Base32.java index b23b1d1e..df30049f 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/encoding/Base32.java +++ b/app/src/main/java/com/beemdevelopment/aegis/encoding/Base32.java @@ -2,6 +2,8 @@ package com.beemdevelopment.aegis.encoding; import com.google.common.io.BaseEncoding; +import java.util.Locale; + public class Base32 { private Base32() { @@ -9,7 +11,7 @@ public class Base32 { public static byte[] decode(String s) throws EncodingException { try { - return BaseEncoding.base32().decode(s.toUpperCase()); + return BaseEncoding.base32().decode(s.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { throw new EncodingException(e); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/encoding/Hex.java b/app/src/main/java/com/beemdevelopment/aegis/encoding/Hex.java index db8ff046..506a9273 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/encoding/Hex.java +++ b/app/src/main/java/com/beemdevelopment/aegis/encoding/Hex.java @@ -2,6 +2,8 @@ package com.beemdevelopment.aegis.encoding; import com.google.common.io.BaseEncoding; +import java.util.Locale; + public class Hex { private Hex() { @@ -9,7 +11,7 @@ public class Hex { public static byte[] decode(String s) throws EncodingException { try { - return BaseEncoding.base16().decode(s.toUpperCase()); + return BaseEncoding.base16().decode(s.toUpperCase(Locale.ROOT)); } catch (IllegalArgumentException e) { throw new EncodingException(e); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/icons/IconType.java b/app/src/main/java/com/beemdevelopment/aegis/icons/IconType.java index 26ffa684..37850b00 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/icons/IconType.java +++ b/app/src/main/java/com/beemdevelopment/aegis/icons/IconType.java @@ -2,6 +2,8 @@ package com.beemdevelopment.aegis.icons; import com.google.common.io.Files; +import java.util.Locale; + public enum IconType { INVALID, SVG, @@ -23,7 +25,7 @@ public enum IconType { @SuppressWarnings("UnstableApiUsage") public static IconType fromFilename(String filename) { - switch (Files.getFileExtension(filename).toLowerCase()) { + switch (Files.getFileExtension(filename).toLowerCase(Locale.ROOT)) { case "svg": return SVG; case "png": diff --git a/app/src/main/java/com/beemdevelopment/aegis/importers/AndOtpImporter.java b/app/src/main/java/com/beemdevelopment/aegis/importers/AndOtpImporter.java index 2b1303f4..02cbcc83 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/importers/AndOtpImporter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/importers/AndOtpImporter.java @@ -38,6 +38,7 @@ import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.util.Arrays; +import java.util.Locale; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; @@ -225,7 +226,7 @@ public class AndOtpImporter extends DatabaseImporter { private static VaultEntry convertEntry(JSONObject obj) throws DatabaseImporterEntryException { try { - String type = obj.getString("type").toLowerCase(); + String type = obj.getString("type").toLowerCase(Locale.ROOT); String algo = obj.getString("algorithm"); int digits = obj.getInt("digits"); byte[] secret = Base32.decode(obj.getString("secret")); diff --git a/app/src/main/java/com/beemdevelopment/aegis/importers/FreeOtpImporter.java b/app/src/main/java/com/beemdevelopment/aegis/importers/FreeOtpImporter.java index a542c7ba..3fc7be18 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/importers/FreeOtpImporter.java +++ b/app/src/main/java/com/beemdevelopment/aegis/importers/FreeOtpImporter.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public class FreeOtpImporter extends DatabaseImporter { private static final String _subPath = "shared_prefs/tokens.xml"; @@ -83,7 +84,7 @@ public class FreeOtpImporter extends DatabaseImporter { private static VaultEntry convertEntry(JSONObject obj) throws DatabaseImporterEntryException { try { - String type = obj.getString("type").toLowerCase(); + String type = obj.getString("type").toLowerCase(Locale.ROOT); String algo = obj.getString("algo"); int digits = obj.getInt("digits"); byte[] secret = toBytes(obj.getJSONArray("secret")); diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java index 378059d0..a3408610 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/OtpInfo.java @@ -8,6 +8,7 @@ import org.json.JSONObject; import java.io.Serializable; import java.util.Arrays; +import java.util.Locale; public abstract class OtpInfo implements Serializable { public static final int DEFAULT_DIGITS = 6; @@ -32,7 +33,7 @@ public abstract class OtpInfo implements Serializable { public abstract String getTypeId(); public String getType() { - return getTypeId().toUpperCase(); + return getTypeId().toUpperCase(Locale.ROOT); } public JSONObject toJson() { @@ -76,7 +77,7 @@ public abstract class OtpInfo implements Serializable { if (algorithm.startsWith("Hmac")) { algorithm = algorithm.substring(4); } - algorithm = algorithm.toUpperCase(); + algorithm = algorithm.toUpperCase(Locale.ROOT); if (!isAlgorithmValid(algorithm)) { throw new OtpInfoException(String.format("unsupported algorithm: %s", algorithm)); diff --git a/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java b/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java index 6567dfa4..a475f403 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java +++ b/app/src/main/java/com/beemdevelopment/aegis/otp/SteamInfo.java @@ -5,6 +5,7 @@ import com.beemdevelopment.aegis.crypto.otp.TOTP; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import java.util.Locale; public class SteamInfo extends TotpInfo { public static final String ID = "steam"; @@ -36,6 +37,6 @@ public class SteamInfo extends TotpInfo { @Override public String getType() { String id = getTypeId(); - return id.substring(0, 1).toUpperCase() + id.substring(1); + return id.substring(0, 1).toUpperCase(Locale.ROOT) + id.substring(1); } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java index f5308881..5e8beb75 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/EditEntryActivity.java @@ -22,8 +22,6 @@ import android.widget.AutoCompleteTextView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; -import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -73,6 +71,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; @@ -234,7 +233,7 @@ public class EditEntryActivity extends AegisActivity { // show/hide period and counter fields on type change _dropdownType.setOnItemClickListener((parent, view, position, id) -> { - String type = _dropdownType.getText().toString().toLowerCase(); + String type = _dropdownType.getText().toString().toLowerCase(Locale.ROOT); switch (type) { case SteamInfo.ID: _dropdownAlgo.setText(OtpInfo.DEFAULT_ALGORITHM, false); @@ -646,7 +645,7 @@ public class EditEntryActivity extends AegisActivity { OtpInfo info; try { - switch (type.toLowerCase()) { + switch (type.toLowerCase(Locale.ROOT)) { case TotpInfo.ID: info = new TotpInfo(secret, algo, digits, parsePeriod()); break;