Am 25.07.2018 um 23:36 schrieb Gary Gregory:
> I'd we do not already have that, the name does not need "defensive".
> Commons Collections would be where to put collections related code.

I would rather think that this copy functionality is pretty basic, so I
would put it in [lang]. I would not want to depend on [collections] just
to use one or two copy methods. And the utility class could support
non-collection types (mainly arrays) as well.

Oliver

> 
> Gary
> 
> On Wed, Jul 25, 2018, 14:00 Oliver Heger <oliver.he...@oliver-heger.de>
> wrote:
> 
>> +1, Thank you.
>>
>> I had planned to create a patch for this issue, but did not find the
>> time so far.
>>
>> BTW, I have quite often the need to create defensive copies of arrays or
>> collections in some variants (e.g. null safe, with wrapping to an
>> unmodifiable collection, etc.). Could this be an addition to [lang]? A
>> new utility class like DefensiveCopyUtils?
>>
>> Oliver
>>
>> Am 25.07.2018 um 00:34 schrieb ggreg...@apache.org:
>>> 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
>>>       */
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>> For additional commands, e-mail: dev-h...@commons.apache.org
>>
>>
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to