You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by sd...@apache.org on 2023/01/27 11:39:56 UTC

[netbeans] branch vsnetbeans_1603 updated: Proper escaping of TNS_ADMIN path. Select JDBC driver with defined implementation. (#5363)

This is an automated email from the ASF dual-hosted git repository.

sdedic pushed a commit to branch vsnetbeans_1603
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/vsnetbeans_1603 by this push:
     new f7f6f605b2e Proper escaping of TNS_ADMIN path. Select JDBC driver with defined implementation. (#5363)
f7f6f605b2e is described below

commit f7f6f605b2e63e1010bba642e0afd7e633d3ce5d
Author: Svatopluk Dedic <sv...@oracle.com>
AuthorDate: Fri Jan 27 10:59:14 2023 +0100

    Proper escaping of TNS_ADMIN path. Select JDBC driver with defined implementation. (#5363)
    
    * Proper escaping of TNS_ADMIN path. Select JDBC driver with defined implementation.
    
    * Issue warning if driver w/o code locations is selected.
---
 .../cloud/oracle/actions/DownloadWalletAction.java | 75 +++++++++++++++++++---
 1 file changed, 65 insertions(+), 10 deletions(-)

diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/actions/DownloadWalletAction.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/actions/DownloadWalletAction.java
index 81a909b86ea..3e0df5933d3 100644
--- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/actions/DownloadWalletAction.java
+++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/actions/DownloadWalletAction.java
@@ -20,12 +20,15 @@ package org.netbeans.modules.cloud.oracle.actions;
 
 import java.awt.event.ActionEvent;
 import java.io.IOException;
+import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.text.MessageFormat;
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -44,6 +47,8 @@ import org.openide.awt.ActionReference;
 import org.openide.awt.ActionReferences;
 import org.openide.awt.ActionRegistration;
 import org.openide.awt.StatusDisplayer;
+import org.openide.filesystems.URLMapper;
+import org.openide.util.BaseUtilities;
 import org.openide.util.ContextAwareAction;
 import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
@@ -71,11 +76,15 @@ import org.openide.util.NbBundle;
     "CTL_DownloadWalletAction=Download Wallet",
     "MSG_WalletDownloaded=Database Wallet was downloaded to {0}",
     "MSG_WalletDownloadedPassword=Database Wallet was downloaded. \nGenerated wallet password is: {0}",
-    "MSG_WalletNoConnection=Wallet doesn't contain any connection"
+    "MSG_WalletNoConnection=Wallet doesn't contain any connection",
+    "WARN_DriverWithoutJars=No matching JDBC drivers are configured with code location(s). Driver {0} will be associated with the connection, but the " +
+            "connection may fail because driver's code is not loadable. Continue ?"
+    
 })
 public class DownloadWalletAction extends AbstractAction implements ContextAwareAction {
-
-    private static final String URL_TEMPLATE = "jdbc:oracle:thin:@{0}?TNS_ADMIN=\"{1}\""; //NOI18N
+    private static final Logger LOG = Logger.getLogger(DownloadWalletAction.class.getName());
+    
+    private static final String URL_TEMPLATE = "jdbc:oracle:thin:@{0}?TNS_ADMIN={1}"; //NOI18N
     private final DatabaseItem context;
     private OCIProfile session;
 
@@ -107,7 +116,27 @@ public class DownloadWalletAction extends AbstractAction implements ContextAware
             if (p.getDbUser() != null && p.getDbPassword() != null) {
 
                 JDBCDriver[] drivers = JDBCDriverManager.getDefault().getDrivers("oracle.jdbc.OracleDriver"); //NOI18N
+                JDBCDriver jarsPresent = null;
+
                 if (drivers.length > 0) {
+
+                    // prefer a driver that actually defines some JARs.
+                    for (JDBCDriver d : drivers) {
+                        if (isAvailable(d)) {
+                            jarsPresent = d;
+                            break;
+                        }
+                    }
+                    if (jarsPresent == null) {
+                        jarsPresent = drivers[0];
+                        LOG.log(Level.WARNING, "Unable to find driver JARs for wallet {0}, using fallback driver: {1}", new Object[] { walletPath, jarsPresent.getName() });
+                        NotifyDescriptor.Confirmation msg = new NotifyDescriptor.Confirmation(Bundle.WARN_DriverWithoutJars(jarsPresent.getName()), 
+                            NotifyDescriptor.WARNING_MESSAGE, NotifyDescriptor.YES_NO_OPTION);
+                        Object choice = DialogDisplayer.getDefault().notify(msg);
+                        if (choice != NotifyDescriptor.YES_OPTION && choice != NotifyDescriptor.OK_OPTION) {
+                            return;
+                        }
+                    }
                     String connectionName = context.getConnectionName();
                     if (connectionName == null) {
                         Optional<String> n = parseConnectionNames(walletPath).stream().findFirst();
@@ -118,17 +147,20 @@ public class DownloadWalletAction extends AbstractAction implements ContextAware
                             return;
                         }
                     }
-                    String dbUrl = MessageFormat.format(URL_TEMPLATE, connectionName, walletPath);
+                    String dbUrl = MessageFormat.format(URL_TEMPLATE, connectionName, BaseUtilities.escapeParameters(new String[] { walletPath.toString() }));
                     DatabaseConnection dbConn = DatabaseConnection.create(
-                            drivers[0],
-                            dbUrl,
-                            p.getDbUser(),
-                            p.getDbUser(),
-                            new String(p.getDbPassword()),
-                            true,
+                            drivers[0], 
+                            dbUrl, 
+                            p.getDbUser(), 
+                            p.getDbUser(), 
+                            new String(p.getDbPassword()), 
+                            true, 
                             context.getName());
                     ConnectionManager.getDefault().addConnection(dbConn);
                 }
+
+                // PENDING: what should happen, if the driver is not found at all - display an info message ?
+
                 DialogDisplayer.getDefault().notifyLater(
                         new NotifyDescriptor.Message(
                                 Bundle.MSG_WalletDownloadedPassword(
@@ -140,6 +172,29 @@ public class DownloadWalletAction extends AbstractAction implements ContextAware
             Exceptions.printStackTrace(ex);
         }
     }
+    
+    static boolean isAvailable(JDBCDriver driver) {
+        URL[] urls = driver.getURLs();
+        for (URL u : urls) {
+            if (URLMapper.findFileObject(u) == null) {
+                return false;
+            }
+        }
+        if (urls.length > 0) {
+            // true, some jar is defined && exists.
+            return true;
+        } else {
+            // if the JDBC drive does not list jars, its class must be reachable. DbDriverManager uses no-arg classloader constructor, so it is
+            // using systemClassLoader as a parent for no-URL URLClassloader.
+            try {
+                Class.forName(driver.getClassName(), true, ClassLoader.getSystemClassLoader());
+                return true;
+            } catch (ClassNotFoundException | SecurityException | LinkageError ex) {
+                // expected, class is not avaialble
+                return false;
+            }
+        }
+    }
 
     protected List<String> parseConnectionNames(Path wallet) {
         Path tns = wallet.resolve("tnsnames.ora"); //NOI18N


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists