diff options
author | binsky08 <timo@binsky.org> | 2022-08-27 02:17:35 +0300 |
---|---|---|
committer | binsky08 <timo@binsky.org> | 2022-08-27 02:29:23 +0300 |
commit | 9a0ef6d1dd9c87a8c79537ba7e79f374faf74336 (patch) | |
tree | 4dccd2ff052ce0b98adb7708fdb1dda7a3044a51 | |
parent | 506e288df031c54a6905e0de276a3f36eab3fdf6 (diff) |
implement saving otp from credential edit
Signed-off-by: binsky08 <timo@binsky.org>
3 files changed, 133 insertions, 34 deletions
diff --git a/app/src/main/java/es/wolfi/app/passman/fragments/CredentialEditFragment.java b/app/src/main/java/es/wolfi/app/passman/fragments/CredentialEditFragment.java index 57b6e04..90f763f 100644 --- a/app/src/main/java/es/wolfi/app/passman/fragments/CredentialEditFragment.java +++ b/app/src/main/java/es/wolfi/app/passman/fragments/CredentialEditFragment.java @@ -25,7 +25,6 @@ import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -124,6 +123,9 @@ public class CredentialEditFragment extends Fragment implements View.OnClickList private RecyclerView customFieldsListRecyclerView; private Handler handler = null; private Runnable otp_refresh = null; + private String otp_qr_uri = ""; + private String otp_algorithm = "SHA1"; + private String otp_type = "totp"; public CredentialEditFragment() { // Required empty public constructor @@ -217,19 +219,10 @@ public class CredentialEditFragment extends Fragment implements View.OnClickList description.setText(this.credential.getDescription()); try { + Log.d("EditJSString", this.credential.getOtp()); JSONObject otpObj = new JSONObject(this.credential.getOtp()); - int otpDigits = 6; - if (otpObj.has("digits")) { - otpDigits = otpObj.getInt("digits"); - } - int otpPeriod = 30; - if (otpObj.has("period")) { - otpPeriod = otpObj.getInt("period"); - } - - otp_digits.setText(String.valueOf(otpDigits)); - otp_period.setText(String.valueOf(otpPeriod)); + setOTPValuesFromJSON(otpObj); if (otpObj.has("secret") && otpObj.getString("secret").length() > 4) { String otpSecret = otpObj.getString("secret"); @@ -291,34 +284,48 @@ public class CredentialEditFragment extends Fragment implements View.OnClickList }, 100); } - public void processScannedQRCodeData(String value, int requestCode) { - Log.d("CredentialEdit", "processScannedQRCodeData begins"); - + private void setOTPValuesFromJSON(JSONObject otpObj) { try { - JSONObject otpObj = new JSONObject(credential.getOtp()); - otpObj.put("qr_uri", value); - - Uri uri = Uri.parse(value); + if (otpObj.has("type")) { + otp_type = otpObj.getString("type"); + } + if (otpObj.has("algorithm")) { + otp_algorithm = otpObj.getString("algorithm"); + } + if (otpObj.has("qr_uri")) { + otp_qr_uri = otpObj.getString("qr_uri"); + } - String type = uri.getHost().equals("totp") ? "totp" : "hotp"; - otpObj.put("type", type); + otp_secret.setText(otpObj.getString("secret")); - String label = uri.getPath().replaceFirst("/", ""); - otpObj.put("label", label); + int period = 30; + if (otpObj.has("period")) { + period = otpObj.getInt("period"); + } + otp_period.setText(String.valueOf(period)); - String algo = uri.getQueryParameter("algorithm"); - String period = uri.getQueryParameter("period"); - String digits = uri.getQueryParameter("digits"); - String issuer = uri.getQueryParameter("issuer"); + int digits = 6; + if (otpObj.has("digits")) { + digits = otpObj.getInt("digits"); + } + otp_digits.setText(String.valueOf(digits)); - otpObj.put("algorithm", algo != null && !algo.isEmpty() ? uri.getQueryParameter("algorithm") : "SHA1"); + if (otpObj.has("label")) { + otp_label.setText(otpObj.getString("label")); + } + if (otpObj.has("issuer")) { + otp_issuer.setText(otpObj.getString("issuer")); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } - otp_period.setText(period != null && !period.isEmpty() ? uri.getQueryParameter("period") : "30"); - otp_digits.setText(digits != null && !digits.isEmpty() ? uri.getQueryParameter("digits") : "6"); - otp_label.setText(label); - otp_issuer.setText(issuer != null && !issuer.isEmpty() ? issuer : ""); - otp_secret.setText(uri.getQueryParameter("secret") != null ? uri.getQueryParameter("secret") : ""); + public void processScannedQRCodeData(String qr_uri, int requestCode) { + Log.d("CredentialEdit", "processScannedQRCodeData begins"); + try { + setOTPValuesFromJSON(TOTPHelper.getCompleteOTPDataFromQrUrl(qr_uri)); Log.d("CredentialEdit", "processScannedQRCodeData done"); } catch (JSONException e) { e.printStackTrace(); @@ -441,6 +448,17 @@ public class CredentialEditFragment extends Fragment implements View.OnClickList this.credential.setFiles(fed.getFilesString()); this.credential.setCustomFields(cfed.getCustomFieldsString()); + JSONObject otpObj = TOTPHelper.getCompleteOTPDataAsJSONObject(otp_secret, + otp_digits, + otp_period, + otp_label, + otp_issuer, + otp_qr_uri, + otp_algorithm, + otp_type + ); + this.credential.setOtp(otpObj.toString()); + alreadySaving.set(true); Context context = getContext(); diff --git a/app/src/main/java/es/wolfi/passman/API/Credential.java b/app/src/main/java/es/wolfi/passman/API/Credential.java index 405498b..b5ca5be 100644 --- a/app/src/main/java/es/wolfi/passman/API/Credential.java +++ b/app/src/main/java/es/wolfi/passman/API/Credential.java @@ -268,7 +268,7 @@ public class Credential extends Core implements Filterable { } public void setOtp(String otp) { - this.otp = encryptString(otp); + this.otp = encryptRawStringData(otp); } public boolean isHidden() { diff --git a/app/src/main/java/net/bierbaumer/otp_authenticator/TOTPHelper.java b/app/src/main/java/net/bierbaumer/otp_authenticator/TOTPHelper.java index 015eecc..ffe74ee 100644 --- a/app/src/main/java/net/bierbaumer/otp_authenticator/TOTPHelper.java +++ b/app/src/main/java/net/bierbaumer/otp_authenticator/TOTPHelper.java @@ -18,13 +18,17 @@ package net.bierbaumer.otp_authenticator; import android.animation.ObjectAnimator; +import android.net.Uri; import android.os.Handler; +import android.util.Log; import android.view.animation.LinearInterpolator; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import org.apache.commons.codec.binary.Base32; +import org.json.JSONException; +import org.json.JSONObject; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; @@ -119,4 +123,81 @@ public class TOTPHelper { } }; } + + public static JSONObject getCompleteOTPDataAsJSONObject(EditText otp_secret, + EditText otp_digits, + EditText otp_period, + EditText otp_label, + EditText otp_issuer, + String qr_uri, + String algorithm, + String type) { + + JSONObject otpObj = new JSONObject(); + + try { + if (qr_uri != null && !qr_uri.isEmpty()) { + otpObj.put("qr_uri", qr_uri); + } + if (type != null && !type.isEmpty()) { + otpObj.put("type", type); + } + + String label = otp_label.getText().toString(); + if (!label.isEmpty()) { + otpObj.put("label", label); + } + + String period = otp_period.getText().toString(); + otpObj.put("period", !period.isEmpty() ? Integer.parseInt(period) : 30); + + String digits = otp_digits.getText().toString(); + otpObj.put("digits", !digits.isEmpty() ? Integer.parseInt(digits) : 6); + + String issuer = otp_issuer.getText().toString(); + if (!issuer.isEmpty()) { + otpObj.put("issuer", issuer); + } + + otpObj.put("algorithm", algorithm != null && !algorithm.isEmpty() ? algorithm : "SHA1"); + + String secret = otp_secret.getText().toString(); + otpObj.put("secret", !secret.isEmpty() ? secret : ""); + } catch (JSONException e) { + e.printStackTrace(); + } + + Log.d("TOTPHelper", otpObj.toString()); + return otpObj; + } + + public static JSONObject getCompleteOTPDataFromQrUrl(String qr_uri) throws JSONException { + JSONObject otpObj = new JSONObject(); + + Uri uri = Uri.parse(qr_uri); + otpObj.put("qr_uri", qr_uri); + + String type = uri.getHost().equals("totp") ? "totp" : "hotp"; + otpObj.put("type", type); + + String label = uri.getPath().replaceFirst("/", ""); + String algorithm = uri.getQueryParameter("algorithm"); + String period = uri.getQueryParameter("period"); + String digits = uri.getQueryParameter("digits"); + String issuer = uri.getQueryParameter("issuer"); + + if (!label.isEmpty()) { + otpObj.put("label", label); + } + if (issuer != null && !issuer.isEmpty()) { + otpObj.put("issuer", issuer); + } + + otpObj.put("period", period != null && !period.isEmpty() ? Integer.parseInt(period) : 30); + otpObj.put("digits", digits != null && !digits.isEmpty() ? Integer.parseInt(digits) : 6); + otpObj.put("algorithm", algorithm != null && !algorithm.isEmpty() ? algorithm : "SHA1"); + otpObj.put("secret", uri.getQueryParameter("secret")); + + return otpObj; + } } |