Bug 578024 - Improve TrustCertificateDialog

Add helpContext and shows expiration date.

Change-Id: Ie8b3c737669655e34060496f7b25468fc36fc1d6
Reviewed-on: https://git.eclipse.org/r/c/equinox/rt.equinox.p2/+/189481
Tested-by: Equinox Bot <equinox-bot@eclipse.org>
Reviewed-by: Mickael Istria <mistria@redhat.com>
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
index cba53aa..3c75aa5 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
@@ -13,35 +13,37 @@
  *******************************************************************************/
 package org.eclipse.equinox.internal.p2.ui;
 
-
 /**
  * Help context ids for the P2 UI
  * <p>
  * This interface contains constants only; it is not intended to be implemented
  * or extended.
  * </p>
+ *
  * @since 3.4
  * @noextend This interface is not intended to be extended by clients.
  * @noimplement This interface is not intended to be implemented by clients.
  */
 
 public interface IProvHelpContextIds {
-	public static final String PREFIX = ProvUIActivator.PLUGIN_ID + "."; //$NON-NLS-1$
+	String PREFIX = ProvUIActivator.PLUGIN_ID + "."; //$NON-NLS-1$
 
-	public static final String REVERT_CONFIGURATION_WIZARD = PREFIX + "revert_configuration_wizard_context"; //$NON-NLS-1$
+	String REVERT_CONFIGURATION_WIZARD = PREFIX + "revert_configuration_wizard_context"; //$NON-NLS-1$
 
-	public static final String UNINSTALL_WIZARD = PREFIX + "uinstall_wizard_context"; //$NON-NLS-1$
+	String UNINSTALL_WIZARD = PREFIX + "uinstall_wizard_context"; //$NON-NLS-1$
 
-	public static final String UPDATE_WIZARD = PREFIX + "update_wizard_context"; //$NON-NLS-1$
+	String UPDATE_WIZARD = PREFIX + "update_wizard_context"; //$NON-NLS-1$
 
-	public static final String ADD_REPOSITORY_DIALOG = PREFIX + "add_repository_dialog_context"; //$NON-NLS-1$
+	String ADD_REPOSITORY_DIALOG = PREFIX + "add_repository_dialog_context"; //$NON-NLS-1$
 
-	public static final String INSTALL_WIZARD = PREFIX + "install_wizard_context"; //$NON-NLS-1$
+	String INSTALL_WIZARD = PREFIX + "install_wizard_context"; //$NON-NLS-1$
 
-	public static final String REPOSITORY_MANIPULATION_DIALOG = PREFIX + "repository_manipulation_dialog_context"; //$NON-NLS-1$
+	String REPOSITORY_MANIPULATION_DIALOG = PREFIX + "repository_manipulation_dialog_context"; //$NON-NLS-1$
 
-	public static final String INSTALLED_SOFTWARE = PREFIX + "installed_software_context"; //$NON-NLS-1$
+	String INSTALLED_SOFTWARE = PREFIX + "installed_software_context"; //$NON-NLS-1$
 
-	public static final String AVAILABLE_SOFTWARE = PREFIX + "available_software_context"; //$NON-NLS-1$
+	String AVAILABLE_SOFTWARE = PREFIX + "available_software_context"; //$NON-NLS-1$
+
+	String TRUST_DIALOG = PREFIX + "trust_dialog_context"; //$NON-NLS-1$
 
 }
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
index 5ffad2e..23fcf9b 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
@@ -17,29 +17,30 @@
 import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
 
 import java.io.*;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Iterator;
+import java.security.cert.*;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
 import java.util.function.Function;
 import org.bouncycastle.bcpg.ArmoredOutputStream;
 import org.bouncycastle.openpgp.PGPPublicKey;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
-import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
+import org.eclipse.equinox.internal.p2.ui.*;
 import org.eclipse.equinox.internal.p2.ui.viewers.CertificateLabelProvider;
 import org.eclipse.equinox.internal.provisional.security.ui.X500PrincipalHelper;
 import org.eclipse.equinox.internal.provisional.security.ui.X509CertificateViewDialog;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.viewers.*;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.*;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.SelectionDialog;
 
 /**
@@ -69,6 +70,7 @@
 		setMessage(containsPGPKeys(inputElement) ? ProvUIMessages.TrustCertificateDialog_MessageWithPGP
 				: ProvUIMessages.TrustCertificateDialog_Message);
 		setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | getDefaultOrientation());
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parentShell, IProvHelpContextIds.TRUST_DIALOG);
 	}
 
 	private static boolean containsPGPKeys(Object inputElement) {
@@ -245,6 +247,7 @@
 		data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
 		data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
 		listViewer.getTable().setLayoutData(data);
+		listViewer.getTable().setHeaderVisible(true);
 
 		listViewer.setContentProvider(contentProvider);
 		TableViewerColumn typeColumn = new TableViewerColumn(listViewer, SWT.NONE);
@@ -268,7 +271,27 @@
 			return principalHelper.getCN() + "; " + principalHelper.getOU() + "; " //$NON-NLS-1$ //$NON-NLS-2$
 					+ principalHelper.getO();
 		}));
-		listViewer.getTable().setHeaderVisible(true);
+		TableViewerColumn validColumn = new TableViewerColumn(listViewer, SWT.NONE);
+		validColumn.getColumn().setText(ProvUIMessages.TrustCertificateDialog_dates);
+		validColumn.getColumn().setWidth(100);
+		validColumn.setLabelProvider(new PGPOrX509ColumnLabelProvider(pgp -> {
+			if (pgp.getCreationTime().after(Date.from(Instant.now()))) {
+				return NLS.bind(ProvUIMessages.TrustCertificateDialog_NotYetValidStartDate, pgp.getCreationTime());
+			}
+			Instant expires = pgp.getCreationTime().toInstant().plus(pgp.getValidSeconds(), ChronoUnit.SECONDS);
+			return expires.isBefore(Instant.now())
+					? NLS.bind(ProvUIMessages.TrustCertificateDialog_expiredSince, expires)
+					: NLS.bind(ProvUIMessages.TrustCertificateDialog_validExpires, expires);
+		}, x509 -> {
+			try {
+				x509.checkValidity();
+				return ProvUIMessages.TrustCertificateDialog_valid;
+			} catch (CertificateExpiredException expired) {
+				return ProvUIMessages.TrustCertificateDialog_expired;
+			} catch (CertificateNotYetValidException notYetValid) {
+				return ProvUIMessages.TrustCertificateDialog_notYetValid;
+			}
+		}));
 
 		Menu menu = new Menu(listViewer.getTable());
 		listViewer.getTable().setMenu(menu);