mirror of
https://github.com/beemdevelopment/Aegis.git
synced 2025-05-14 14:02:49 +00:00
Add support for importing from the new Google Authenticator export QR codes
This commit is contained in:
parent
6b650e777f
commit
56bde0e19b
9 changed files with 234 additions and 14 deletions
|
@ -3,6 +3,7 @@ package com.beemdevelopment.aegis.ui;
|
|||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.hardware.Camera;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
@ -10,14 +11,16 @@ import android.widget.Toast;
|
|||
|
||||
import com.beemdevelopment.aegis.R;
|
||||
import com.beemdevelopment.aegis.Theme;
|
||||
import com.beemdevelopment.aegis.vault.VaultEntry;
|
||||
import com.beemdevelopment.aegis.helpers.SquareFinderView;
|
||||
import com.beemdevelopment.aegis.otp.GoogleAuthInfo;
|
||||
import com.beemdevelopment.aegis.otp.GoogleAuthInfoException;
|
||||
import com.beemdevelopment.aegis.vault.VaultEntry;
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.Result;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import me.dm7.barcodescanner.core.IViewFinder;
|
||||
import me.dm7.barcodescanner.zxing.ZXingScannerView;
|
||||
|
@ -30,10 +33,15 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R
|
|||
private Menu _menu;
|
||||
private int _facing = CAMERA_FACING_BACK;
|
||||
|
||||
private int _batchId = 0;
|
||||
private int _batchIndex = -1;
|
||||
private List<VaultEntry> _entries;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle state) {
|
||||
super.onCreate(state);
|
||||
|
||||
_entries = new ArrayList<>();
|
||||
_scannerView = new ZXingScannerView(this) {
|
||||
@Override
|
||||
protected IViewFinder createViewFinderView(Context context) {
|
||||
|
@ -107,13 +115,14 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R
|
|||
@Override
|
||||
public void handleResult(Result rawResult) {
|
||||
try {
|
||||
GoogleAuthInfo info = GoogleAuthInfo.parseUri(rawResult.getText().trim());
|
||||
VaultEntry entry = new VaultEntry(info);
|
||||
Uri uri = Uri.parse(rawResult.getText().trim());
|
||||
if (uri.getScheme() != null && uri.getScheme().equals(GoogleAuthInfo.SCHEME_EXPORT)) {
|
||||
handleExportUri(uri);
|
||||
} else {
|
||||
handleUri(uri);
|
||||
}
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("entry", entry);
|
||||
setResult(RESULT_OK, intent);
|
||||
finish();
|
||||
_scannerView.resumeCameraPreview(this);
|
||||
} catch (GoogleAuthInfoException e) {
|
||||
e.printStackTrace();
|
||||
Dialogs.showErrorDialog(this, R.string.read_qr_error, e, (dialog, which) -> {
|
||||
|
@ -122,6 +131,47 @@ public class ScannerActivity extends AegisActivity implements ZXingScannerView.R
|
|||
}
|
||||
}
|
||||
|
||||
private void handleUri(Uri uri) throws GoogleAuthInfoException {
|
||||
GoogleAuthInfo info = GoogleAuthInfo.parseUri(uri);
|
||||
List<VaultEntry> entries = new ArrayList<>();
|
||||
entries.add(new VaultEntry(info));
|
||||
finish(entries);
|
||||
}
|
||||
|
||||
private void handleExportUri(Uri uri) throws GoogleAuthInfoException {
|
||||
GoogleAuthInfo.Export export = GoogleAuthInfo.parseExportUri(uri);
|
||||
|
||||
if (_batchId == 0) {
|
||||
_batchId = export.getBatchId();
|
||||
}
|
||||
|
||||
int batchIndex = export.getBatchIndex();
|
||||
if (_batchId != export.getBatchId()) {
|
||||
Toast.makeText(this, R.string.google_qr_export_unrelated, Toast.LENGTH_SHORT).show();
|
||||
} else if (_batchIndex == -1 || _batchIndex == batchIndex - 1) {
|
||||
for (GoogleAuthInfo info : export.getEntries()) {
|
||||
VaultEntry entry = new VaultEntry(info);
|
||||
_entries.add(entry);
|
||||
}
|
||||
|
||||
_batchIndex = batchIndex;
|
||||
if (_batchIndex + 1 == export.getBatchSize()) {
|
||||
finish(_entries);
|
||||
}
|
||||
|
||||
Toast.makeText(this, getString(R.string.google_qr_export_scanned, _batchIndex + 1, export.getBatchSize()), Toast.LENGTH_SHORT).show();
|
||||
} else if (_batchIndex != batchIndex) {
|
||||
Toast.makeText(this, getString(R.string.google_qr_export_unexpected, _batchIndex + 1, batchIndex + 1), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
private void finish(List<VaultEntry> entries) {
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("entries", (ArrayList<VaultEntry>) entries);
|
||||
setResult(RESULT_OK, intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
private void updateCameraIcon() {
|
||||
if (_menu != null) {
|
||||
MenuItem item = _menu.findItem(R.id.action_camera);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue