X-Git-Url: http://www.average.org/gitweb/?p=YkNeoCR.git;a=blobdiff_plain;f=src%2Forg%2Faverage%2Fnfcauthcr%2FCheck.java;fp=src%2Forg%2Faverage%2Fnfcauthcr%2FCheck.java;h=c3738f7fc4f80dbe2c799925d522beaa0ea62153;hp=0000000000000000000000000000000000000000;hb=a0d60dab1717e69b6d853eb91d0065fe378e3c28;hpb=bdfe828f712fa2a187a424923c6594f12e965a5d diff --git a/src/org/average/nfcauthcr/Check.java b/src/org/average/nfcauthcr/Check.java new file mode 100644 index 0000000..c3738f7 --- /dev/null +++ b/src/org/average/nfcauthcr/Check.java @@ -0,0 +1,122 @@ +package org.average.nfcauthcr; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.nfc.NfcAdapter; +import android.nfc.Tag; +import android.nfc.TagLostException; +import android.nfc.tech.IsoDep; +import android.util.Log; +import android.widget.Toast; + +import org.average.nfcauthcr.YkNeo; + +public class Check extends Activity { + + private final String TAG = getClass().getName(); + + private AlertDialog swipeDialog; + private PendingIntent tagIntent; + + @Override + protected void onResume() { + super.onResume(); + Log.v(TAG, "Starting the work"); + + Intent intent = getIntent(); + setResult(RESULT_CANCELED); + if (swipeDialog != null) { + swipeDialog.dismiss(); + swipeDialog = null; + } + int slot = intent.getIntExtra("slot", -1); + if (slot > 0) { + swipeDialog = makeDialog(); + swipeDialog.show(); + enableDispatch(slot); + } + } + + @Override + protected void onPause() { + super.onPause(); + Log.v(TAG, "Finished the work"); + + if(swipeDialog != null) { + swipeDialog.dismiss(); + swipeDialog = null; + } + disableDispatch(); + } + + public void onNewIntent(Intent intent) { + Log.v(TAG, "NFC Intent arrived"); + int slot = intent.getIntExtra("slot", -1); + byte[] challenge = intent.getByteArrayExtra("challenge"); + if (slot <= 0) return; + Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); + if (tag == null) return; + IsoDep isoTag = IsoDep.get(tag); + byte[] response = YkNeo.doChallengeYubiKey( + isoTag, slot, challenge); + if (response != null) { + Intent data = getIntent(); + data.putExtra("response", response); + setResult(RESULT_OK, data); + } + finish(); + } + + private AlertDialog makeDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.challenging); + builder.setMessage(R.string.swipe); + builder.setOnCancelListener( + new DialogInterface.OnCancelListener() { + public void onCancel(DialogInterface dialog) { + finish(); + } + }); + return builder.create(); + } + + private void enableDispatch(int slot) { + Intent intent = getIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra("slot", slot); + tagIntent = PendingIntent.getActivity(this, 0, intent, 0); + IntentFilter iso = + new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); + NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this); + if (adapter == null) { + Toast.makeText(this, R.string.no_nfc, + Toast.LENGTH_LONG).show(); + finish(); + return; + } + if (! adapter.isEnabled()) { + Toast.makeText(this, R.string.nfc_disabled, + Toast.LENGTH_LONG).show(); + finish(); + return; + } + adapter.enableForegroundDispatch( + this, tagIntent, new IntentFilter[] {iso}, + new String[][] {new String[] {IsoDep.class.getName()}}); + } + + private void disableDispatch() { + if (tagIntent != null) { + tagIntent.cancel(); + tagIntent = null; + } + NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this); + if (adapter != null) { + adapter.disableForegroundDispatch(this); + } + } +}