package com.hdweiss.morgand.settings;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.widget.Toast;
import com.hdweiss.morgand.R;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.KeyPair;
import com.lamerman.FileDialog;
import com.lamerman.SelectionMode;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class KeySettingActivity extends Activity {
public final static String KeyfileName = "keyfile";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(getBaseContext(), FileDialog.class);
intent.putExtra(FileDialog.START_PATH, Environment.getExternalStorageDirectory().getPath());
intent.putExtra(FileDialog.CAN_SELECT_DIR, false);
//intent.putExtra(FileDialog.FORMAT_FILTER, new String[] { "_rsa" });
intent.putExtra(FileDialog.SELECTION_MODE, SelectionMode.MODE_OPEN);
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
String filePath = data.getStringExtra(FileDialog.RESULT_PATH);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String passphrase = prefs.getString("git_password", "");
if (CopyKeyToStorage(filePath, passphrase)) {
SharedPreferences.Editor edit = prefs.edit();
edit.putString("git_key_info", GetKeyprint(GetInternalKeyPath(), passphrase));
edit.putString("git_key_path", GetInternalKeyPath());
edit.commit();
}
} else if (resultCode == Activity.RESULT_CANCELED) {
}
finish();
}
private String GetKeyprint(String keyfilePath, String passphrase) {
try {
KeyPair keyPair = KeyPair.load(new JSch(), keyfilePath);
if (!passphrase.isEmpty() && keyPair.isEncrypted())
keyPair.decrypt(passphrase);
else if (passphrase.isEmpty() && keyPair.isEncrypted()) {
Toast.makeText(this, R.string.error_key_need_pass, Toast.LENGTH_LONG).show();
return "";
}
String fingerprint = keyPair.getFingerPrint();
keyPair.dispose();
return fingerprint;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
private boolean CopyKeyToStorage(String filePath, String passphrase) {
String fingerprint = GetKeyprint(filePath, passphrase);
if (TextUtils.isEmpty(fingerprint)) {
Toast.makeText(this, R.string.error_key_file_info, Toast.LENGTH_LONG).show();
return false;
}
try {
FileInputStream fis = new FileInputStream(filePath);
FileOutputStream fos = openFileOutput(KeyfileName, MODE_PRIVATE);
byte[] buffer = new byte[1444];
int byteread = 0;
int bytesum = 0;
while ((byteread = fis.read(buffer)) != -1) {
bytesum += byteread;
fos.write(buffer, 0, byteread);
}
fos.close();
fis.close();
return true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, getText(R.string.error_key_file_copy), Toast.LENGTH_LONG);
}
return false;
}
private String GetInternalKeyPath() {
return getFilesDir() + "/" + KeyfileName;
}
}