From 8feee36de8e6042f928439b06a03d50018423afe Mon Sep 17 00:00:00 2001
From: jvergara <jvergara@localhost>
Date: Fri, 17 Aug 2007 00:53:26 +0000
Subject: [PATCH] The following modifications have the following goals:

---
 opends/src/quicksetup/org/opends/quicksetup/CliApplicationHelper.java |  282 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 277 insertions(+), 5 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/CliApplicationHelper.java b/opends/src/quicksetup/org/opends/quicksetup/CliApplicationHelper.java
index 89be10e..3ecaade 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/CliApplicationHelper.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/CliApplicationHelper.java
@@ -27,19 +27,26 @@
 
 package org.opends.quicksetup;
 
+
+import org.opends.admin.ads.util.ApplicationTrustManager;
+import org.opends.quicksetup.ui.CertificateDialog;
 import org.opends.messages.Message;
 import org.opends.messages.MessageBuilder;
+import static org.opends.messages.AdminToolMessages.*;
 import static org.opends.messages.QuickSetupMessages.*;
 
 import org.opends.quicksetup.util.Utils;
 import org.opends.server.util.args.ArgumentParser;
 import org.opends.server.util.args.ArgumentException;
 import org.opends.server.util.args.BooleanArgument;
+import org.opends.server.util.PasswordReader;
 import org.opends.server.util.StaticUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.io.PrintStream;
+import java.net.URI;
+import java.security.cert.X509Certificate;
 import java.util.Set;
 import java.util.ArrayList;
 import java.util.logging.Logger;
@@ -90,7 +97,7 @@
                                   Message defaultValue,
                                   Message[] validValues) {
 
-    System.out.println();
+    printLineBreak();
 
     boolean isValid = false;
     Message response = null;
@@ -103,7 +110,7 @@
       System.out.flush();
 
       response = Message.raw(readLine());
-      if (response.equals(""))
+      if (response.toString().equals(""))
       {
         response = defaultValue;
       }
@@ -130,12 +137,12 @@
    * @return  The string value read from the user.
    */
   protected String promptForString(Message prompt, String defaultValue) {
-    System.out.println();
+    printLineBreak();
     String wrappedPrompt = StaticUtils.wrapText(prompt,
             Utils.getCommandLineMaxLineWidth());
 
     while (true) {
-      System.out.println(wrappedPrompt);
+      System.out.print(wrappedPrompt);
 
       if (defaultValue == null) {
         System.out.print(": ");
@@ -162,6 +169,41 @@
     }
   }
 
+  /**
+   * Interactively prompts (on standard output) the user to provide a password
+   * value.
+   *
+   * @param  msg        The prompt to present to the user.
+   *
+   * @return  The string value read from the user.
+   */
+  protected String promptForPassword(Message msg)
+  {
+    String pwd;
+    printLineBreak();
+    String wrappedPrompt = StaticUtils.wrapText(msg,
+        Utils.getCommandLineMaxLineWidth());
+    System.out.print(wrappedPrompt+" ");
+    System.out.flush();
+    try
+    {
+      char[] pwChars = PasswordReader.readPassword();
+      if ((pwChars == null) || pwChars.length == 0)
+      {
+        pwd = null;
+      }
+      else
+      {
+        pwd = new String(pwChars);
+      }
+    }
+    catch (Throwable t)
+    {
+      LOG.log(Level.WARNING, "Error reading password: "+t, t);
+      pwd = null;
+    }
+    return pwd;
+  }
 
   /**
    * Reads a line of text from standard input.
@@ -217,7 +259,7 @@
     }
     catch (Exception e)
     {
-      err.println(INFO_CLI_ERROR_READING_STDIN.get());
+      err.println(INFO_CLI_ERROR_READING_STDIN.get().toString());
       return null;
     }
   }
@@ -345,4 +387,234 @@
     return argParser;
   }
 
+
+  /**
+   * Displays an error message in the error output (wrapping it if necessary).
+   * @param msg the error message to be displayed.
+   */
+  protected void printErrorMessage(Message msg)
+  {
+    System.err.println(org.opends.server.util.StaticUtils.wrapText(msg,
+        Utils.getCommandLineMaxLineWidth()));
+  }
+
+  /**
+   * Displays an error message in the error output (wrapping it if necessary).
+   * @param msg the error message to be displayed.
+   */
+  protected void printErrorMessage(String msg)
+  {
+    System.err.println(org.opends.server.util.StaticUtils.wrapText(msg,
+        Utils.getCommandLineMaxLineWidth()));
+  }
+
+  /**
+   * Prints a line break in the standard output.
+   */
+  protected void printLineBreak()
+  {
+    System.out.println();
+  }
+
+  /**
+   * Prompts the user to accept the certificate.
+   * @param t the throwable that was generated because the certificate was
+   * not trusted.
+   * @param trustManager the global trustManager that contains the certificates
+   * accepted by the user.
+   * @param usedUrl the LDAP URL used to connect to the server.
+   * @return <CODE>true</CODE> if the user accepted the certificate and
+   * <CODE>false</CODE> otherwise.
+   */
+  protected boolean promptForCertificateConfirmation(Throwable t,
+      ApplicationTrustManager trustManager, String usedUrl)
+  {
+    boolean returnValue = false;
+    ApplicationTrustManager.Cause cause = trustManager.getLastRefusedCause();
+
+    LOG.log(Level.INFO, "Certificate exception cause: "+cause);
+    UserDataCertificateException.Type excType = null;
+    if (cause == ApplicationTrustManager.Cause.NOT_TRUSTED)
+    {
+      excType = UserDataCertificateException.Type.NOT_TRUSTED;
+    }
+    else if (cause ==
+      ApplicationTrustManager.Cause.HOST_NAME_MISMATCH)
+    {
+      excType = UserDataCertificateException.Type.HOST_NAME_MISMATCH;
+    }
+    else
+    {
+      System.err.println();
+      Message msg = Utils.getThrowableMsg(INFO_ERROR_CONNECTING_TO_LOCAL.get(),
+          t);
+      printErrorMessage(msg);
+    }
+
+    if (excType != null)
+    {
+      String h;
+      int p;
+      try
+      {
+        URI uri = new URI(usedUrl);
+        h = uri.getHost();
+        p = uri.getPort();
+      }
+      catch (Throwable t1)
+      {
+        LOG.log(Level.WARNING, "Error parsing ldap url of ldap url.", t1);
+        h = INFO_NOT_AVAILABLE_LABEL.get().toString();
+        p = -1;
+      }
+      UserDataCertificateException udce =
+        new UserDataCertificateException(Step.REPLICATION_OPTIONS,
+            INFO_CERTIFICATE_EXCEPTION.get(h, String.valueOf(p)), t, h, p,
+                trustManager.getLastRefusedChain(),
+                trustManager.getLastRefusedAuthType(), excType);
+
+      returnValue = handleCertificateException(udce, trustManager, true);
+    }
+    return returnValue;
+  }
+
+  /**
+   * Prompts the user to accept the certificate that generated the provided
+   * UserDataCertificateException.
+   * @param trustManager the global trustManager that contains the certificates
+   * accepted by the user.
+   * @param udce the UserDataCertificateException that was generated.
+   * @param trustManager the global trustManager that contains the certificates
+   * accepted by the user.
+   * @param displayErrorMessage whether to display the message describing
+   * the error encountered (certificate not trusted) or only prompt to accept
+   * the certificate.
+   * @return <CODE>true</CODE> if the user accepted the certificate and
+   * <CODE>false</CODE> otherwise.
+   */
+  private boolean handleCertificateException(
+      UserDataCertificateException udce, ApplicationTrustManager trustManager,
+      boolean displayErrorMessage)
+  {
+    boolean accepted = false;
+    Message msg;
+    if (udce.getType() == UserDataCertificateException.Type.NOT_TRUSTED)
+    {
+      msg = INFO_CERTIFICATE_NOT_TRUSTED_TEXT_CLI.get(
+          udce.getHost(), String.valueOf(udce.getPort()),
+          udce.getHost(), String.valueOf(udce.getPort()));
+    }
+    else
+    {
+      msg = INFO_CERTIFICATE_NAME_MISMATCH_TEXT_CLI.get(
+          udce.getHost(), String.valueOf(udce.getPort()),
+          udce.getHost(),
+          udce.getHost(), String.valueOf(udce.getPort()),
+          udce.getHost(), String.valueOf(udce.getPort()));
+    }
+    if (displayErrorMessage)
+    {
+      printLineBreak();
+      printErrorMessage(msg);
+    }
+    Message[] validValues = {
+        INFO_CLI_ACCEPT_CERTIFICATE_LONG.get(),
+        INFO_CLI_REJECT_CERTIFICATE_LONG.get(),
+        INFO_CLI_VIEW_CERTIFICATE_LONG.get(),
+        INFO_CLI_ACCEPT_CERTIFICATE_SHORT.get(),
+        INFO_CLI_REJECT_CERTIFICATE_SHORT.get(),
+        INFO_CLI_VIEW_CERTIFICATE_SHORT.get()
+    };
+    Message answer = promptConfirm(INFO_CLI_ACCEPT_CERTIFICATE_PROMPT.get(),
+        validValues[0], validValues);
+
+    if (INFO_CLI_REJECT_CERTIFICATE_LONG.get().toString().equalsIgnoreCase(
+        answer.toString()) ||
+        INFO_CLI_REJECT_CERTIFICATE_SHORT.get().toString().equalsIgnoreCase(
+            answer.toString()))
+    {
+      accepted = false;
+    }
+    else if (INFO_CLI_VIEW_CERTIFICATE_LONG.get().toString().equalsIgnoreCase(
+        answer.toString()) ||
+        INFO_CLI_VIEW_CERTIFICATE_SHORT.get().toString().equalsIgnoreCase(
+            answer.toString()))
+    {
+      printLineBreak();
+      displayCertificate(udce);
+      accepted = handleCertificateException(udce, trustManager, false);
+    }
+    else
+    {
+      X509Certificate[] chain = udce.getChain();
+      String authType = udce.getAuthType();
+      String host = udce.getHost();
+
+      if ((chain != null) && (authType != null) && (host != null))
+      {
+        LOG.log(Level.INFO, "Accepting certificate presented by host "+host);
+        trustManager.acceptCertificate(chain, authType, host);
+        accepted = true;
+      }
+      else
+      {
+        if (chain == null)
+        {
+          LOG.log(Level.WARNING,
+          "The chain is null for the UserDataCertificateException");
+        }
+        if (authType == null)
+        {
+          LOG.log(Level.WARNING,
+          "The auth type is null for the UserDataCertificateException");
+        }
+        if (host == null)
+        {
+          LOG.log(Level.WARNING,
+          "The host is null for the UserDataCertificateException");
+        }
+      }
+    }
+    return accepted;
+  }
+
+  private void displayCertificate(UserDataCertificateException udce)
+  {
+    Message[] labels =
+    {
+        INFO_CERTIFICATE_SUBJECT_LABEL.get(),
+        INFO_CERTIFICATE_ISSUED_BY_LABEL.get(),
+        INFO_CERTIFICATE_VALID_FROM_LABEL.get(),
+        INFO_CERTIFICATE_EXPIRES_ON_LABEL.get(),
+        INFO_CERTIFICATE_TYPE_LABEL.get(),
+        INFO_CERTIFICATE_SERIAL_NUMBER_LABEL.get(),
+        INFO_CERTIFICATE_SIGNATURE_LABEL.get(),
+        INFO_CERTIFICATE_SIGNATURE_ALGORITHM_LABEL.get(),
+        INFO_CERTIFICATE_VERSION_LABEL.get(),
+        INFO_CERTIFICATE_PUBLIC_KEY_LABEL.get()
+    };
+    for (int i=0; i<udce.getChain().length; i++)
+    {
+      X509Certificate cert = udce.getChain()[i];
+      String[] values =
+      {
+          cert.getSubjectX500Principal().getName().toString(),
+          cert.getIssuerX500Principal().getName().toString(),
+          CertificateDialog.getValidFrom(cert),
+          CertificateDialog.getExpiresOn(cert),
+          cert.getType(),
+          String.valueOf(cert.getSerialNumber()),
+          CertificateDialog.getSignature(cert).toString(),
+          String.valueOf(cert.getSigAlgName()),
+          String.valueOf(cert.getVersion()),
+          cert.getPublicKey().toString()
+      };
+      for (int j=0; j<labels.length; j++)
+      {
+        System.out.println(StaticUtils.wrapText(labels[j]+" "+values[j],
+            Utils.getCommandLineMaxLineWidth()));
+      }
+    }
+    System.out.flush();
+  }
 }

--
Gitblit v1.10.0