2010-04-06 19:54:51 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package org.thialfihar.android.apg;
|
|
|
|
|
|
|
|
|
|
import org.bouncycastle2.jce.provider.BouncyCastleProvider;
|
|
|
|
|
import org.bouncycastle2.openpgp.PGPException;
|
|
|
|
|
import org.bouncycastle2.openpgp.PGPSecretKey;
|
|
|
|
|
|
|
|
|
|
import android.app.Activity;
|
|
|
|
|
import android.app.AlertDialog;
|
|
|
|
|
import android.app.Dialog;
|
|
|
|
|
import android.content.DialogInterface;
|
|
|
|
|
import android.text.InputType;
|
|
|
|
|
import android.text.method.PasswordTransformationMethod;
|
|
|
|
|
import android.view.ViewGroup.LayoutParams;
|
|
|
|
|
import android.widget.EditText;
|
|
|
|
|
import android.widget.LinearLayout;
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
public class AskForSecretKeyPassPhrase {
|
|
|
|
|
public static interface PassPhraseCallbackInterface {
|
|
|
|
|
void passPhraseCallback(String passPhrase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Dialog createDialog(Activity context, long secretKeyId,
|
|
|
|
|
PassPhraseCallbackInterface callback) {
|
|
|
|
|
AlertDialog.Builder alert = new AlertDialog.Builder(context);
|
|
|
|
|
|
2010-04-23 17:00:52 +00:00
|
|
|
alert.setTitle(R.string.title_authentification);
|
2010-04-06 19:54:51 +00:00
|
|
|
|
2010-04-23 17:00:52 +00:00
|
|
|
final PGPSecretKey secretKey;
|
2010-04-06 19:54:51 +00:00
|
|
|
|
2010-04-23 17:00:52 +00:00
|
|
|
if (secretKeyId == 0) {
|
|
|
|
|
secretKey = null;
|
2010-04-23 17:03:05 +00:00
|
|
|
alert.setMessage("Pass phrase for symmetric encryption");
|
2010-04-23 17:00:52 +00:00
|
|
|
} else {
|
|
|
|
|
secretKey = Apg.getMasterKey(Apg.findSecretKeyRing(secretKeyId));
|
|
|
|
|
if (secretKey == null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
String userId = Apg.getMainUserIdSafe(context, secretKey);
|
|
|
|
|
alert.setMessage("Pass phrase for " + userId);
|
|
|
|
|
}
|
2010-04-06 19:54:51 +00:00
|
|
|
|
|
|
|
|
final EditText input = new EditText(context);
|
|
|
|
|
input.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
|
|
|
|
input.setTransformationMethod(new PasswordTransformationMethod());
|
|
|
|
|
// 5dip padding
|
|
|
|
|
int padding = (int) (10 * context.getResources().getDisplayMetrics().densityDpi / 160);
|
|
|
|
|
LinearLayout layout = new LinearLayout(context);
|
|
|
|
|
layout.setPadding(padding, 0, padding, 0);
|
|
|
|
|
layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
|
|
|
|
|
LayoutParams.WRAP_CONTENT));
|
|
|
|
|
input.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
|
|
|
|
|
LayoutParams.WRAP_CONTENT));
|
|
|
|
|
layout.addView(input);
|
|
|
|
|
alert.setView(layout);
|
|
|
|
|
|
|
|
|
|
final PassPhraseCallbackInterface cb = callback;
|
|
|
|
|
final Activity activity = context;
|
|
|
|
|
alert.setPositiveButton(android.R.string.ok,
|
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
|
public void onClick(DialogInterface dialog, int id) {
|
major restructuring, moving dialog, message, menu, option menu, task, type IDs into Id in a similar structure as the generated R, also introducing a BaseActivity class that almost all activities derive from, which generates some common dialogs, handles the progress update, thread management, and thread communication
also adding first draft of encrypt file activity, not very functional yet
2010-04-19 02:12:13 +00:00
|
|
|
activity.removeDialog(Id.dialog.pass_phrase);
|
2010-04-06 19:54:51 +00:00
|
|
|
String passPhrase = "" + input.getText();
|
2010-04-23 17:00:52 +00:00
|
|
|
if (secretKey != null) {
|
|
|
|
|
try {
|
|
|
|
|
secretKey.extractPrivateKey(passPhrase.toCharArray(),
|
|
|
|
|
new BouncyCastleProvider());
|
|
|
|
|
} catch (PGPException e) {
|
|
|
|
|
Toast.makeText(activity,
|
|
|
|
|
R.string.wrong_pass_phrase,
|
|
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2010-04-06 19:54:51 +00:00
|
|
|
}
|
|
|
|
|
cb.passPhraseCallback(passPhrase);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
alert.setNegativeButton(android.R.string.cancel,
|
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
|
public void onClick(DialogInterface dialog, int id) {
|
major restructuring, moving dialog, message, menu, option menu, task, type IDs into Id in a similar structure as the generated R, also introducing a BaseActivity class that almost all activities derive from, which generates some common dialogs, handles the progress update, thread management, and thread communication
also adding first draft of encrypt file activity, not very functional yet
2010-04-19 02:12:13 +00:00
|
|
|
activity.removeDialog(Id.dialog.pass_phrase);
|
2010-04-06 19:54:51 +00:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return alert.create();
|
|
|
|
|
}
|
|
|
|
|
}
|