Repository: commons-dbcp
Updated Branches:
  refs/heads/master 70822f11d -> d7969ac93


[DBCP-517] Make defensive copies of char[] passwords.

Project: http://git-wip-us.apache.org/repos/asf/commons-dbcp/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-dbcp/commit/d7969ac9
Tree: http://git-wip-us.apache.org/repos/asf/commons-dbcp/tree/d7969ac9
Diff: http://git-wip-us.apache.org/repos/asf/commons-dbcp/diff/d7969ac9

Branch: refs/heads/master
Commit: d7969ac934e752e7a7b258fa5a5af9a563c40a13
Parents: 70822f1
Author: Gary Gregory <ggreg...@apache.org>
Authored: Tue Jul 24 16:34:43 2018 -0600
Committer: Gary Gregory <ggreg...@apache.org>
Committed: Tue Jul 24 16:34:43 2018 -0600

----------------------------------------------------------------------
 src/changes/changes.xml                                 |  5 ++++-
 src/main/java/org/apache/commons/dbcp2/Utils.java       | 12 ++++++++++++
 .../commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java    |  4 ++--
 .../dbcp2/datasources/CPDSConnectionFactory.java        | 11 ++++++++++-
 .../dbcp2/cpdsadapter/TestDriverAdapterCPDS.java        |  9 +++++++++
 .../dbcp2/datasources/TestCPDSConnectionFactory.java    | 10 ++++++++++
 6 files changed, 47 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c924411..8f1de55 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -61,9 +61,12 @@ The <action> type attribute can be add,update,fix,remove.
 
   <body>
     <release version="2.6.0" date="2018-MM-DD" description="This is a minor 
release, including bug fixes and enhancements.">
-      <action dev="ggregory" type="add" issue="DBCP-514" due-to="Gary Gregory">
+      <action dev="ggregory" type="add" issue="DBCP-514" due-to="Tom 
Jenkinson, Gary Gregory">
         Allow DBCP to register with a TransactionSynchronizationRegistry for 
XA cases.
       </action>
+      <action dev="ggregory" type="update" issue="DBCP-517" due-to="Gary 
Gregory">
+        Make defensive copies of char[] passwords.
+      </action>
     </release>
     <release version="2.5.0" date="2018-07-15" description="This is a minor 
release, including bug fixes and enhancements.">
       <action dev="ggregory" type="update" issue="DBCP-505" due-to="Gary 
Gregory">

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/main/java/org/apache/commons/dbcp2/Utils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/dbcp2/Utils.java 
b/src/main/java/org/apache/commons/dbcp2/Utils.java
index 8e798c4..244b51b 100644
--- a/src/main/java/org/apache/commons/dbcp2/Utils.java
+++ b/src/main/java/org/apache/commons/dbcp2/Utils.java
@@ -72,6 +72,17 @@ public final class Utils {
     }
 
     /**
+     * Clones the given char[] if not null.
+     *
+     * @param value
+     *            may be null.
+     * @return a cloned char[] or null.
+     */
+    public static char[] clone(final char[] value) {
+        return value == null ? null : value.clone();
+    }
+
+    /**
      * Closes the ResultSet (which may be null).
      *
      * @param resultSet
@@ -169,4 +180,5 @@ public final class Utils {
     public static String toString(final char[] value) {
         return value == null ? null : String.valueOf(value);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java 
b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
index bbc8831..0844c9b 100644
--- a/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
+++ b/src/main/java/org/apache/commons/dbcp2/cpdsadapter/DriverAdapterCPDS.java
@@ -423,8 +423,8 @@ public class DriverAdapterCPDS implements 
ConnectionPoolDataSource, Referenceabl
      */
     public void setPassword(final char[] userPassword) {
         assertInitializationAllowed();
-        this.userPassword = userPassword;
-        update(connectionProperties, KEY_PASSWORD, 
Utils.toString(userPassword));
+        this.userPassword = Utils.clone(userPassword);
+        update(connectionProperties, KEY_PASSWORD, 
Utils.toString(this.userPassword));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/main/java/org/apache/commons/dbcp2/datasources/CPDSConnectionFactory.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/commons/dbcp2/datasources/CPDSConnectionFactory.java 
b/src/main/java/org/apache/commons/dbcp2/datasources/CPDSConnectionFactory.java
index f0ae74d..c0ee90b 100644
--- 
a/src/main/java/org/apache/commons/dbcp2/datasources/CPDSConnectionFactory.java
+++ 
b/src/main/java/org/apache/commons/dbcp2/datasources/CPDSConnectionFactory.java
@@ -122,6 +122,15 @@ class CPDSConnectionFactory
     }
 
     /**
+     * (Testing API) Gets the value of password for the default user.
+     *
+     * @return value of password.
+     */
+    char[] getPasswordCharArray() {
+        return userPassword;
+    }
+    
+    /**
      * Returns the object pool used to pool connections created by this 
factory.
      *
      * @return ObjectPool managing pooled connections
@@ -335,7 +344,7 @@ class CPDSConnectionFactory
      *            new password
      */
     public synchronized void setPassword(final char[] userPassword) {
-        this.userPassword = userPassword;
+        this.userPassword =  Utils.clone(userPassword);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java 
b/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
index 0669b1f..7bae26e 100644
--- 
a/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
+++ 
b/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
@@ -208,6 +208,15 @@ public class TestDriverAdapterCPDS {
     }
 
     @Test
+    public void testSetPasswordThenModCharArray() {
+        char[] pwd = {'a' };
+        pcds.setPassword(pwd);
+        assertEquals("a", pcds.getPassword());
+        pwd[0] = 'b';
+        assertEquals("a", pcds.getPassword());
+    }
+
+    @Test
     public void testSetPasswordNullWithConnectionProperties() throws Exception 
{
         pcds.setConnectionProperties(new Properties());
         pcds.setPassword("Secret");

http://git-wip-us.apache.org/repos/asf/commons-dbcp/blob/d7969ac9/src/test/java/org/apache/commons/dbcp2/datasources/TestCPDSConnectionFactory.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/dbcp2/datasources/TestCPDSConnectionFactory.java
 
b/src/test/java/org/apache/commons/dbcp2/datasources/TestCPDSConnectionFactory.java
index 3f9c157..86c0dfe 100644
--- 
a/src/test/java/org/apache/commons/dbcp2/datasources/TestCPDSConnectionFactory.java
+++ 
b/src/test/java/org/apache/commons/dbcp2/datasources/TestCPDSConnectionFactory.java
@@ -143,6 +143,16 @@ public class TestCPDSConnectionFactory {
         assertEquals(0, pool.getNumIdle());
     }
 
+    @Test
+    public void testSetPasswordThenModCharArray() {
+        final CPDSConnectionFactory factory = new CPDSConnectionFactory(cpds, 
null, -1, false, "userName", "password");
+        char[] pwd = {'a' };
+        factory.setPassword(pwd);
+        assertEquals("a", String.valueOf(factory.getPasswordCharArray()));
+        pwd[0] = 'b';
+        assertEquals("a", String.valueOf(factory.getPasswordCharArray()));
+    }
+
     /**
      * JIRA: DBCP-442
      */

Reply via email to