Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/passman-android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbinsky08 <timo@binsky.org>2022-08-27 02:17:35 +0300
committerbinsky08 <timo@binsky.org>2022-08-27 02:29:23 +0300
commit9a0ef6d1dd9c87a8c79537ba7e79f374faf74336 (patch)
tree4dccd2ff052ce0b98adb7708fdb1dda7a3044a51
parent506e288df031c54a6905e0de276a3f36eab3fdf6 (diff)
implement saving otp from credential edit
Signed-off-by: binsky08 <timo@binsky.org>
-rw-r--r--app/src/main/java/es/wolfi/app/passman/fragments/CredentialEditFragment.java84
-rw-r--r--app/src/main/java/es/wolfi/passman/API/Credential.java2
-rw-r--r--app/src/main/java/net/bierbaumer/otp_authenticator/TOTPHelper.java81
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;
+ }
}