diff options
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java')
| -rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java | 264 |
1 files changed, 0 insertions, 264 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java b/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java deleted file mode 100644 index 1bbe5235..00000000 --- a/app/src/main/java/com/zeapo/pwdstore/SshKeyGen.java +++ /dev/null @@ -1,264 +0,0 @@ -/* - * Copyright © 2014-2019 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ -package com.zeapo.pwdstore; - -import android.annotation.SuppressLint; -import android.app.Dialog; -import android.app.ProgressDialog; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; -import android.content.SharedPreferences; -import android.graphics.Typeface; -import android.os.AsyncTask; -import android.os.Bundle; -import android.text.InputType; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.AppCompatTextView; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.preference.PreferenceManager; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.android.material.textfield.TextInputEditText; -import com.jcraft.jsch.JSch; -import com.jcraft.jsch.KeyPair; -import java.io.File; -import java.io.FileOutputStream; -import java.lang.ref.WeakReference; -import java.nio.charset.StandardCharsets; -import org.apache.commons.io.FileUtils; - -public class SshKeyGen extends AppCompatActivity { - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - setTitle("Generate SSH Key"); - - if (savedInstanceState == null) { - getSupportFragmentManager() - .beginTransaction() - .replace(android.R.id.content, new SshKeyGenFragment()) - .commit(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - // The back arrow in the action bar should act the same as the back button. - onBackPressed(); - return true; - } - return super.onOptionsItemSelected(item); - } - - // Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a - // private and public key, then replaces the SshKeyGenFragment with a - // ShowSshKeyFragment which displays the public key. - public void generate(View view) { - String length = - Integer.toString((Integer) ((Spinner) findViewById(R.id.length)).getSelectedItem()); - String passphrase = ((EditText) findViewById(R.id.passphrase)).getText().toString(); - String comment = ((EditText) findViewById(R.id.comment)).getText().toString(); - new KeyGenerateTask(this).execute(length, passphrase, comment); - - InputMethodManager imm = - (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - - // SSH key generation UI - public static class SshKeyGenFragment extends Fragment { - public SshKeyGenFragment() {} - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View v = inflater.inflate(R.layout.fragment_ssh_keygen, container, false); - Typeface monoTypeface = - Typeface.createFromAsset( - requireContext().getAssets(), "fonts/sourcecodepro.ttf"); - - Spinner spinner = v.findViewById(R.id.length); - Integer[] lengths = new Integer[] {2048, 4096}; - ArrayAdapter<Integer> adapter = - new ArrayAdapter<>( - requireContext(), - android.R.layout.simple_spinner_dropdown_item, - lengths); - spinner.setAdapter(adapter); - - ((TextInputEditText) v.findViewById(R.id.passphrase)).setTypeface(monoTypeface); - - final CheckBox checkbox = v.findViewById(R.id.show_passphrase); - checkbox.setOnCheckedChangeListener( - (buttonView, isChecked) -> { - final TextInputEditText editText = v.findViewById(R.id.passphrase); - final int selection = editText.getSelectionEnd(); - if (isChecked) { - editText.setInputType( - InputType.TYPE_CLASS_TEXT - | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); - } else { - editText.setInputType( - InputType.TYPE_CLASS_TEXT - | InputType.TYPE_TEXT_VARIATION_PASSWORD); - } - editText.setSelection(selection); - }); - - return v; - } - } - - // Displays the generated public key .ssh_key.pub - public static class ShowSshKeyFragment extends DialogFragment { - public ShowSshKeyFragment() {} - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final FragmentActivity activity = requireActivity(); - final MaterialAlertDialogBuilder builder = - new MaterialAlertDialogBuilder(requireContext()); - LayoutInflater inflater = activity.getLayoutInflater(); - @SuppressLint("InflateParams") - final View v = inflater.inflate(R.layout.fragment_show_ssh_key, null); - builder.setView(v); - - AppCompatTextView textView = v.findViewById(R.id.public_key); - File file = new File(activity.getFilesDir() + "/.ssh_key.pub"); - try { - textView.setText(FileUtils.readFileToString(file, StandardCharsets.UTF_8)); - } catch (Exception e) { - System.out.println("Exception caught :("); - e.printStackTrace(); - } - - builder.setPositiveButton( - getResources().getString(R.string.dialog_ok), - (dialog, which) -> { - if (activity instanceof SshKeyGen) activity.finish(); - }); - - builder.setNegativeButton( - getResources().getString(R.string.dialog_cancel), (dialog, which) -> {}); - - builder.setNeutralButton(getResources().getString(R.string.ssh_keygen_copy), null); - - final AlertDialog ad = builder.setTitle("Your public key").create(); - ad.setOnShowListener( - dialog -> { - Button b = ad.getButton(AlertDialog.BUTTON_NEUTRAL); - b.setOnClickListener( - v1 -> { - AppCompatTextView textView1 = - getDialog().findViewById(R.id.public_key); - ClipboardManager clipboard = - (ClipboardManager) - activity.getSystemService( - Context.CLIPBOARD_SERVICE); - ClipData clip = - ClipData.newPlainText( - "public key", textView1.getText().toString()); - clipboard.setPrimaryClip(clip); - }); - }); - return ad; - } - } - - private static class KeyGenerateTask extends AsyncTask<String, Void, Exception> { - private ProgressDialog pd; - private WeakReference<SshKeyGen> weakReference; - - private KeyGenerateTask(final SshKeyGen activity) { - weakReference = new WeakReference<>(activity); - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - pd = ProgressDialog.show(weakReference.get(), "", "Generating keys"); - } - - protected Exception doInBackground(String... strings) { - int length = Integer.parseInt(strings[0]); - String passphrase = strings[1]; - String comment = strings[2]; - - JSch jsch = new JSch(); - try { - KeyPair kp = KeyPair.genKeyPair(jsch, KeyPair.RSA, length); - - File file = new File(weakReference.get().getFilesDir() + "/.ssh_key"); - FileOutputStream out = new FileOutputStream(file, false); - if (passphrase.length() > 0) { - kp.writePrivateKey(out, passphrase.getBytes()); - } else { - kp.writePrivateKey(out); - } - - file = new File(weakReference.get().getFilesDir() + "/.ssh_key.pub"); - out = new FileOutputStream(file, false); - kp.writePublicKey(out, comment); - return null; - } catch (Exception e) { - System.out.println("Exception caught :("); - e.printStackTrace(); - return e; - } - } - - @Override - protected void onPostExecute(Exception e) { - super.onPostExecute(e); - pd.dismiss(); - if (e == null) { - Toast.makeText(weakReference.get(), "SSH-key generated", Toast.LENGTH_LONG).show(); - DialogFragment df = new ShowSshKeyFragment(); - df.show(weakReference.get().getSupportFragmentManager(), "public_key"); - SharedPreferences prefs = - PreferenceManager.getDefaultSharedPreferences(weakReference.get()); - SharedPreferences.Editor editor = prefs.edit(); - editor.putBoolean("use_generated_key", true); - editor.apply(); - } else { - new MaterialAlertDialogBuilder(weakReference.get()) - .setTitle("Error while trying to generate the ssh-key") - .setMessage( - weakReference - .get() - .getResources() - .getString(R.string.ssh_key_error_dialog_text) - + e.getMessage()) - .setPositiveButton( - weakReference.get().getResources().getString(R.string.dialog_ok), - (dialogInterface, i) -> { - // pass - }) - .show(); - } - } - } -} |
