On Thu, Jul 26, 2018 at 1:31 PM Oliver Heger <oliver.he...@oliver-heger.de> wrote:
> > > 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. > Hi Oliver, For a long time we've had ArrayUtils in [lang] CollectionUtils in [collections]. I do not think that it matters whether the code is "basic" or not; the domain of these operations is for Collection instances and [lang] does not concern itself with Collections, Commons Collections does. It so happens that Java makes the distinction between primitive and Objects which is why we have arrays like int[] and Collections like List<Integer>. These new methods belong in these two classes or in new classes but in their respective components, for example CopyArrays in [lang] and CopyCollection in [collections]. The theme for both components is well established so I am -1 to put Collection code in [lang]. Gary > > 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 > >