Commons Dbcp
  1. Commons Dbcp
  2. DBCP-245

SharedPoolDataSource saves wrong password forever

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 1.1, 1.2, 1.2.1, 1.2.2
    • Fix Version/s: 1.3
    • Labels:
      None
    • Environment:

      Description

      The SharedPoolDataSource saves wrong password forever

      1. Get a connection for user1 (use username of user1 and password of user1) ---> connection ok
      2. Get a connection for user2 (use username of user2 and a wrong password) --> connection failed
      3. Get a connection for user2 (use username of user2 and password of user2) --> connection will be failed too because the wrong password is stored in the usersKey map.

      Bugfix
      ===================================================================

      protected synchronized PooledConnectionAndInfo
      getPooledConnectionAndInfo(String username, String password)
      throws SQLException {
      if (pool == null) {
      try

      { registerPool(username, password); }

      catch (NamingException e)

      { throw new SQLNestedException("RegisterPool failed", e); }

      }

      PooledConnectionAndInfo info = null;
      UserPassKey userPassKey = null;
      try

      { userPassKey = getUserPassKey(username, password); info = (PooledConnectionAndInfo) pool .borrowObject(userPassKey); }

      catch (Exception e) {

      if (userKeys != null && userKeys.containsKey(username))

      { userKeys.remove(username); }

      throw new SQLNestedException(
      "Could not retrieve connection info from pool", e);
      }
      return info;
      }

        Activity

        Hide
        Phil Steitz added a comment -

        Thanks for reporting this. It would be great to have the code above put into a patch, with the steps to reproduce put into a test case that fails before and succeeds after the fix.

        Show
        Phil Steitz added a comment - Thanks for reporting this. It would be great to have the code above put into a patch, with the steps to reproduce put into a test case that fails before and succeeds after the fix.
        Hide
        Michael Drechsel added a comment -

        Hello Phil Steitz,

        thanks for your eMail. Here a have an test case that reproduces the bug.

        test case

        ========

        String serverName = "localhost";
        String serverDB = "localweb";

        String user1 = "doris";
        String password1 = "doris";

        String user2 = "cramer";
        String password2 = "cramer";

        Connection con = null;

        PGConnectionPoolDataSource ConPoolDS = new
        PGConnectionPoolDataSource();
        ConPoolDS.setServerName(serverName);
        ConPoolDS.setDatabaseName(serverDB);
        ConPoolDS.setUser(user1);
        ConPoolDS.setPassword(password1);
        // --------------------------------------
        // dbcp caching via SharedPoolDataSource
        // --------------------------------------
        SharedPoolDataSource SharedDS = new SharedPoolDataSource();
        SharedDS.setConnectionPoolDataSource(ConPoolDS);
        SharedDS.setMaxActive(10); // 0 = no limit
        SharedDS.setMaxIdle(10);
        SharedDS.setMinEvictableIdleTimeMillis(1000);
        SharedDS.setMaxWait(1000); // -1 = no limit
        SharedDS.setTimeBetweenEvictionRunsMillis(1000);
        SharedDS.setTestWhileIdle(true);

        try

        { con = SharedDS.getConnection(user1, password1); }

        catch (Exception e)

        { // TODO Auto-generated catch block e.printStackTrace(); }

        try
        { con = SharedDS.getConnection(user2, "wrongpassword"); }
        catch (Exception e)
        { // TODO Auto-generated catch block e.printStackTrace(); }

        try

        { // connection will fail because the wrong password is stored in the usersKey map. con = SharedDS.getConnection(user2, password2); }

        catch (Exception e)

        { // TODO Auto-generated catch block e.printStackTrace(); }

        steps to reproduce

        ================

        The SharedPoolDataSource saves wrong password forever
        1. Get a connection for user1 (use username of user1 and password of user1) ---> connection ok
        2. Get a connection for user2 (use username of user2 and a wrong password) --> connection failed
        3. Get a connection for user2 (use username of user2 and password of user2) --> connection will be failed too because the wrong password is stored in the usersKey map.

        _________________________________________________________________________________________

        Show
        Michael Drechsel added a comment - Hello Phil Steitz, thanks for your eMail. Here a have an test case that reproduces the bug. test case ======== String serverName = "localhost"; String serverDB = "localweb"; String user1 = "doris"; String password1 = "doris"; String user2 = "cramer"; String password2 = "cramer"; Connection con = null; PGConnectionPoolDataSource ConPoolDS = new PGConnectionPoolDataSource(); ConPoolDS.setServerName(serverName); ConPoolDS.setDatabaseName(serverDB); ConPoolDS.setUser(user1); ConPoolDS.setPassword(password1); // -------------------------------------- // dbcp caching via SharedPoolDataSource // -------------------------------------- SharedPoolDataSource SharedDS = new SharedPoolDataSource(); SharedDS.setConnectionPoolDataSource(ConPoolDS); SharedDS.setMaxActive(10); // 0 = no limit SharedDS.setMaxIdle(10); SharedDS.setMinEvictableIdleTimeMillis(1000); SharedDS.setMaxWait(1000); // -1 = no limit SharedDS.setTimeBetweenEvictionRunsMillis(1000); SharedDS.setTestWhileIdle(true); try { con = SharedDS.getConnection(user1, password1); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { con = SharedDS.getConnection(user2, "wrongpassword"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { // connection will fail because the wrong password is stored in the usersKey map. con = SharedDS.getConnection(user2, password2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } steps to reproduce ================ The SharedPoolDataSource saves wrong password forever 1. Get a connection for user1 (use username of user1 and password of user1) ---> connection ok 2. Get a connection for user2 (use username of user2 and a wrong password) --> connection failed 3. Get a connection for user2 (use username of user2 and password of user2) --> connection will be failed too because the wrong password is stored in the usersKey map. _________________________________________________________________________________________
        Hide
        Phil Steitz added a comment -

        Slightly modified version of the suggested fix implemented in r616142.
        Thanks!

        Show
        Phil Steitz added a comment - Slightly modified version of the suggested fix implemented in r616142. Thanks!

          People

          • Assignee:
            Unassigned
            Reporter:
            Michael Drechsel
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development