Modified: incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java URL: http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java?rev=165585&r1=165584&r2=165585&view=diff ============================================================================== --- incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java (original) +++ incubator/derby/code/trunk/java/client/org/apache/derby/client/net/NetConnection.java Sun May 1 23:25:59 2005 @@ -19,1479 +19,1491 @@ */ package org.apache.derby.client.net; -import org.apache.derby.client.am.SqlException; -import org.apache.derby.client.am.DisconnectException; -import org.apache.derby.client.am.Utils; -import org.apache.derby.client.am.Statement; -import org.apache.derby.client.am.PreparedStatement; +import org.apache.derby.client.ClientBaseDataSource; import org.apache.derby.client.am.CallableStatement; import org.apache.derby.client.am.DatabaseMetaData; +import org.apache.derby.client.am.DisconnectException; +import org.apache.derby.client.am.EncryptionManager; +import org.apache.derby.client.am.PreparedStatement; import org.apache.derby.client.am.ProductLevel; +import org.apache.derby.client.am.SqlException; +import org.apache.derby.client.am.Statement; +import org.apache.derby.client.am.Utils; import org.apache.derby.jdbc.ClientDataSource; -import org.apache.derby.client.ClientBaseDataSource; -import org.apache.derby.client.am.EncryptionManager; -public class NetConnection extends org.apache.derby.client.am.Connection -{ +public class NetConnection extends org.apache.derby.client.am.Connection { - protected NetAgent netAgent_; + protected NetAgent netAgent_; + // For XA Transaction + protected int pendingEndXACallinfoOffset_ = -1; - // For XA Transaction - protected int pendingEndXACallinfoOffset_ = -1; - - - // byte[] to save the connect flows for connection reset - protected byte[] cachedConnectBytes_ = null; - protected boolean wroteConnectFromCache_ = false; - //-----------------------------state------------------------------------------ - - // these variables store the manager levels for the connection. - // they are initialized to the highest value which this driver supports - // at the current time. theses intial values should be increased when - // new manager level support is added to this driver. these initial values - // are sent to the server in the excsat command. the server will return a - // set of values and these will be parsed out by parseExcsatrd and parseMgrlvlls. - // during this parsing, these instance variable values will be reset to the negotiated - // levels for the connection. these values may be less than the - // values origionally set here at constructor time. it is these new values - // (following the parse) which are the levels for the connection. after - // a successful excsat command, these values can be checked to see - // what protocol is supported by this particular connection. - // if support for a new manager class is added, the buildExcsat and parseMgrlvlls - // methods will need to be changed to accomodate sending and receiving the new class. - protected int targetAgent_ = NetConfiguration.MGRLVL_7; //01292003jev monitoring - protected int targetCmntcpip_ = NetConfiguration.MGRLVL_5; - protected int targetRdb_ = NetConfiguration.MGRLVL_7; - public int targetSecmgr_ = NetConfiguration.MGRLVL_7; - protected int targetCmnappc_ = NetConfiguration.MGRLVL_NA; //NA since currently not used by net - protected int targetXamgr_ = NetConfiguration.MGRLVL_7; - protected int targetSyncptmgr_ = NetConfiguration.MGRLVL_NA; - protected int targetRsyncmgr_ = NetConfiguration.MGRLVL_NA; - - - // this is the external name of the target server. - // it is set by the parseExcsatrd method but not really used for much at this - // time. one possible use is for logging purposes and in the future it - // may be placed in the trace. - String targetExtnam_; - String extnam_; - - // Server Class Name of the target server returned in excsatrd. - // Again this is something which the driver is not currently using - // to make any decions. Right now it is just stored for future logging. - // It does contain some useful information however and possibly - // the database meta data object will make use of this - // for example, the product id (prdid) would give this driver an idea of - // what type of sevrer it is connected to. - public String targetSrvclsnm_; - - // Server Name of the target server returned in excsatrd. - // Again this is something which we don't currently use but - // keep it in case we want to log it in some problem determination - // trace/dump later. - protected String targetSrvnam_; - - // Server Product Release Level of the target server returned in excsatrd. - // specifies the procuct release level of a ddm server. - // Again this is something which we don't currently use but - // keep it in case we want to log it in some problem determination - // trace/dump later. - public String targetSrvrlslv_; - - // Keys used for encryption. - transient byte[] publicKey_; - transient byte[] targetPublicKey_; - - // Product-Specific Data (prddta) sent to the server in the accrdb command. - // The prddta has a specified format. It is saved in case it is needed again - // since it takes a little effort to compute. Saving this information is - // useful for when the connect flows need to be resent (right now the connect - // flow is resent when this driver disconnects and reconnects with - // non unicode ccsids. this is done when the server doesn't recoginze the - // unicode ccsids). - // - - byte[] prddta_; - - // Correlation Token of the source sent to the server in the accrdb. - // It is saved like the prddta in case it is needed for a connect reflow. - public byte[] crrtkn_; - - // The Secmec used by the target. - // It contains the negotiated security mechanism for the connection. - // Initially the value of this is 0. It is set only when the server and - // the target successfully negotiate a security mechanism. - int targetSecmec_; - - // the security mechanism requested by the application - protected int securityMechanism_; - - // stored the password for deferred reset only. - private transient char[] deferredResetPassword_ = null; - - private void setDeferredResetPassword (String password) - { - deferredResetPassword_ = (password == null) ? null : flipBits(password.toCharArray()); - } - private String getDeferredResetPassword () - { - if (deferredResetPassword_ == null) return null; - String password = new String(flipBits(deferredResetPassword_)); - flipBits( deferredResetPassword_ ); // re-encrypt password - return password; - } - - protected byte[] cnntkn_ = null; - - // resource manager Id for XA Connections. - private int rmId_ = 0; - protected NetXAResource xares_ = null; - protected java.util.Hashtable indoubtTransactions_ = null; - protected int currXACallInfoOffset_ = 0; - private short seqNo_ = 1; - - // Flag to indicate a read only transaction - protected boolean readOnlyTransaction_ = true; - - //---------------------constructors/finalizer--------------------------------- - - public NetConnection (NetLogWriter netLogWriter, - String databaseName, - java.util.Properties properties) throws SqlException - { - super (netLogWriter, 0, "", -1, databaseName, properties); - } - - public NetConnection (NetLogWriter netLogWriter, - org.apache.derby.jdbc.ClientDataSource dataSource, - String user, - String password) throws SqlException - { - super (netLogWriter, user, password, dataSource); - setDeferredResetPassword(password); - } - - // For jdbc 1 connections - public NetConnection (NetLogWriter netLogWriter, - int driverManagerLoginTimeout, - String serverName, - int portNumber, - String databaseName, - java.util.Properties properties) throws SqlException - { - super (netLogWriter, driverManagerLoginTimeout, serverName, portNumber, databaseName, properties); - netAgent_ = (NetAgent) super.agent_; - if (netAgent_.exceptionOpeningSocket_ != null) - throw netAgent_.exceptionOpeningSocket_; - checkDatabaseName(); - String password = ClientDataSource.getPassword (properties); - securityMechanism_ = ClientDataSource.getSecurityMechanism (properties); - flowConnect (password, securityMechanism_); - completeConnect(); - } - - // For JDBC 2 Connections - public NetConnection (NetLogWriter netLogWriter, - String user, - String password, - org.apache.derby.jdbc.ClientDataSource dataSource, - int rmId, - boolean isXAConn) throws SqlException - { - super (netLogWriter, user, password, isXAConn, dataSource); - netAgent_ = (NetAgent) super.agent_; - initialize ( user, password, dataSource, rmId, isXAConn); - } - - public NetConnection (NetLogWriter netLogWriter, - String ipaddr, - int portNumber, - org.apache.derby.jdbc.ClientDataSource dataSource, - boolean isXAConn) throws SqlException - { - super (netLogWriter, isXAConn, dataSource); - netAgent_ = (NetAgent) super.agent_; - if (netAgent_.exceptionOpeningSocket_ != null) - throw netAgent_.exceptionOpeningSocket_; - checkDatabaseName(); - this.isXAConnection_ = isXAConn; - flowSimpleConnect (); - productID_ = targetSrvrlslv_; - super.completeConnect(); - } - - private void initialize ( - String user, - String password, - org.apache.derby.jdbc.ClientDataSource dataSource, - int rmId, - boolean isXAConn) throws SqlException - { - securityMechanism_ = dataSource.getSecurityMechanism(); - - setDeferredResetPassword(password); - checkDatabaseName(); - dataSource_ = dataSource; - this.rmId_ = rmId; - this.isXAConnection_ = isXAConn; - flowConnect ( password, securityMechanism_); - completeConnect(); - - } - - // preferably without password in the method signature. - // We can probally get rid of flowReconnect method. - public void resetNetConnection (org.apache.derby.client.am.LogWriter logWriter, - String user, - String password, - org.apache.derby.jdbc.ClientDataSource ds, - boolean recomputeFromDataSource) throws SqlException - { - super.resetConnection (logWriter, user, ds, recomputeFromDataSource); - //---------------------------------------------------- - if (recomputeFromDataSource) { - // do not reset managers on a connection reset. this information shouldn't - // change and can be used to check secmec support. - - targetExtnam_ = null; - targetSrvclsnm_ = null; - targetSrvnam_ = null; - targetSrvrlslv_ = null; - publicKey_ = null; - targetPublicKey_ = null; - targetSecmec_ = 0; - if (ds != null && securityMechanism_==0 ) securityMechanism_ = ds.getSecurityMechanism(); - resetConnectionAtFirstSql_ = false; - if (resultSetHoldability_ == 0) - ((org.apache.derby.client.net.NetDatabaseMetaData)databaseMetaData_).setDefaultResultSetHoldability (); - } - if (password != null) - deferredResetPassword_ = null; - else - password = getDeferredResetPassword(); - // properties prddta_ and crrtkn_ will be initialized by - // calls to constructPrddta() and constructCrrtkn() - //---------------------------------------------------------- - boolean isDeferredReset = flowReconnect (password, securityMechanism_); - completeReset (isDeferredReset, recomputeFromDataSource); - } - - - protected void reset_ (org.apache.derby.client.am.LogWriter logWriter, - String user, String password, - ClientDataSource ds, - boolean recomputeFromDataSource) throws SqlException - { - checkResetPreconditions (logWriter, user, password, ds); - resetNetConnection (logWriter, user, password, ds, recomputeFromDataSource); - } - - protected void reset_ (org.apache.derby.client.am.LogWriter logWriter, - ClientDataSource ds, - boolean recomputeFromDataSource) throws SqlException - { - checkResetPreconditions (logWriter, null,null, ds); - resetNetConnection (logWriter, ds, recomputeFromDataSource); - } - - private void resetNetConnection (org.apache.derby.client.am.LogWriter logWriter, - org.apache.derby.jdbc.ClientDataSource ds, - boolean recomputeFromDataSource) throws SqlException - { - super.resetConnection (logWriter, null, ds, recomputeFromDataSource); - //---------------------------------------------------- - if (recomputeFromDataSource) { - // do not reset managers on a connection reset. this information shouldn't - // change and can be used to check secmec support. - - targetExtnam_ = null; - targetSrvclsnm_ = null; - targetSrvnam_ = null; - targetSrvrlslv_ = null; - publicKey_ = null; - targetPublicKey_ = null; - targetSecmec_ = 0; - if (ds != null && securityMechanism_ == 0) - securityMechanism_ = ds.getSecurityMechanism(); - resetConnectionAtFirstSql_ = false; - - if (resultSetHoldability_ == 0) - ((org.apache.derby.client.net.NetDatabaseMetaData)databaseMetaData_).setDefaultResultSetHoldability (); - } - // properties prddta_ and crrtkn_ will be initialized by - // calls to constructPrddta() and constructCrrtkn() - //---------------------------------------------------------- - boolean isDeferredReset = flowReconnect (null, securityMechanism_); - completeReset (isDeferredReset, recomputeFromDataSource); - } - - protected void checkResetPreconditions (org.apache.derby.client.am.LogWriter logWriter, - String user, - String password, - ClientDataSource ds) throws SqlException - { - if (inUnitOfWork_) - throw new SqlException (logWriter, "Connection reset is not allowed when inside a unit of work."); - } - - java.util.List getSpecialRegisters() - { - if (xares_ != null) - return xares_.getSpecialRegisters(); - else - return null; - } - - public void addSpecialRegisters (String s) - { - if (xares_ != null) - xares_.addSpecialRegisters (s); - } - - public void completeConnect() throws SqlException - { - super.completeConnect(); - } - - protected void completeReset (boolean isDeferredReset, boolean recomputeFromDataSource) throws SqlException - { - super.completeReset (isDeferredReset, recomputeFromDataSource); - } - - public void flowConnect ( - String password, - int securityMechanism) throws SqlException - { - netAgent_ = (NetAgent) super.agent_; - constructExtnam(); - // these calls need to be after newing up the agent - // because they require the ccsid manager - constructPrddta (); // construct product data - - netAgent_.typdef_ = new Typdef (netAgent_, 1208, NetConfiguration.SYSTEM_ASC, 1200, 1208); - netAgent_.targetTypdef_ = new Typdef (netAgent_); - netAgent_.originalTargetTypdef_ = netAgent_.targetTypdef_; - setDeferredResetPassword(password); - - // If password is not null, change security mechanism from - // SECMEC_USRIDONL to SECMEC_USRIDPWD - securityMechanism = ClientBaseDataSource. getUpgradedSecurityMechanism((short)securityMechanism,password); - try { - switch (securityMechanism){ - case NetConfiguration.SECMEC_USRIDPWD: // Clear text user id and password - checkUserPassword (user_, password); - flowUSRIDPWDconnect (password); - break; - case NetConfiguration.SECMEC_USRIDONL: // Clear text user, no password sent to server - checkUser (user_); - flowUSRIDONLconnect(); - break; - case NetConfiguration.SECMEC_USRENCPWD: // Clear text user, encrypted password - checkUserPassword (user_, password); - flowUSRENCPWDconnect (password); - break; - case NetConfiguration.SECMEC_EUSRIDPWD: // Encrypted user, encrypted password - checkUserPassword (user_, password); - flowEUSRIDPWDconnect (password); - break; - case NetConfiguration.SECMEC_EUSRIDDTA: - checkUserPassword (user_, password); - flowEUSRIDDTAconnect (); - break; - case NetConfiguration.SECMEC_EUSRPWDDTA: - checkUserPassword (user_, password); - flowEUSRPWDDTAconnect (password); - break; - - default: - throw new SqlException (agent_.logWriter_,"security mechanism '" + securityMechanism + "' not supported"); - } - } - catch (java.lang.Throwable e) { // if *anything* goes wrong, make sure the connection is destroyed - // always mark the connection closed in case of an error. - // This prevents attempts to use this closed connection - // to retrieve error message text if an error SQLCA - // is returned in one of the connect flows. - open_ = false; - // logWriter may be closed in agent_.close(), - // so SqlException needs to be created before that - // but to be thrown after. - SqlException exceptionToBeThrown; - if (e instanceof SqlException) // rethrow original exception if it's an SqlException - exceptionToBeThrown = (SqlException)e; - else // any other exceptions will be wrapped by an SqlException first - exceptionToBeThrown = new SqlException (agent_.logWriter_, e, "Unexpected throwable caught " + e.toString()); - - try { - if (agent_ != null) { agent_.close(); } - } - catch (SqlException ignoreMe) {} - - throw exceptionToBeThrown; - } - } - - protected void flowSimpleConnect () throws SqlException - { - netAgent_ = (NetAgent) super.agent_; - constructExtnam(); - // these calls need to be after newing up the agent - // because they require the ccsid manager - constructPrddta (); // construct product data - - netAgent_.typdef_ = new Typdef (netAgent_, 1208, NetConfiguration.SYSTEM_ASC, 1200, 1208); - netAgent_.targetTypdef_ = new Typdef (netAgent_); - netAgent_.originalTargetTypdef_ = netAgent_.targetTypdef_; - - try { - flowServerAttributes(); - } - catch (java.lang.Throwable e) { // if *anything* goes wrong, make sure the connection is destroyed - // always mark the connection closed in case of an error. - // This prevents attempts to use this closed connection - // to retrieve error message text if an error SQLCA - // is returned in one of the connect flows. - open_ = false; - // logWriter may be closed in agent_.close(), - // so SqlException needs to be created before that - // but to be thrown after. - SqlException exceptionToBeThrown; - if (e instanceof SqlException) // rethrow original exception if it's an SqlException - exceptionToBeThrown = (SqlException)e; - else // any other exceptions will be wrapped by an SqlException first - exceptionToBeThrown = new SqlException (agent_.logWriter_, e, "Unexpected throwable caught " + e.toString()); - - try { - if (agent_ != null) { agent_.close(); } - } - catch (SqlException ignoreMe) {} - - throw exceptionToBeThrown; - } - } - - protected boolean flowReconnect (String password, int securityMechanism) throws SqlException - { - constructExtnam(); - // these calls need to be after newing up the agent - // because they require the ccsid manager - constructPrddta(); //modify this to not new up an array - - checkSecmgrForSecmecSupport (securityMechanism); - try { - switch (securityMechanism){ - case NetConfiguration.SECMEC_USRIDPWD: // Clear text user id and password - checkUserPassword (user_, password); - resetConnectionAtFirstSql_ = true; - setDeferredResetPassword(password); - return true; - case NetConfiguration.SECMEC_USRIDONL: // Clear text user, no password sent to server - checkUser (user_); - resetConnectionAtFirstSql_ = true; - return true; - case NetConfiguration.SECMEC_USRENCPWD: // Clear text user, encrypted password - checkUserPassword (user_, password); - resetConnectionAtFirstSql_ = true; - setDeferredResetPassword(password); - return true; - case NetConfiguration.SECMEC_EUSRIDPWD: // Encrypted user, encrypted password - checkUserPassword (user_, password); - resetConnectionAtFirstSql_ = true; - setDeferredResetPassword(password); - return true; - case NetConfiguration.SECMEC_EUSRIDDTA: - checkUserPassword (user_, password); - resetConnectionAtFirstSql_ = true; - setDeferredResetPassword(password); - return true; - case NetConfiguration.SECMEC_EUSRPWDDTA: - checkUserPassword (user_, password); - resetConnectionAtFirstSql_ = true; - setDeferredResetPassword(password); - return true; - default: - throw new SqlException (agent_.logWriter_,"security mechanism '" + securityMechanism + "' not supported"); - } - } - catch (SqlException sqle) { // this may not be needed because on method up the stack - open_ = false; // all reset exceptions are caught and wrapped in disconnect exceptions - try { - if (agent_ != null) { agent_.close(); } - } - catch (SqlException ignoreMe) {} - throw sqle; - } - } - - protected void finalize () throws java.lang.Throwable - { - super.finalize(); - } - - protected byte[] getCnnToken() - { - return cnntkn_; - } - - protected short getSequenceNumber() - { - return ++seqNo_; - } - - //--------------------------------flow methods-------------------------------- - - private void flowUSRIDPWDconnect (String password) throws SqlException - { - flowServerAttributesAndKeyExchange(NetConfiguration.SECMEC_USRIDPWD, - null); // publicKey - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - user_, - password, - null, //encryptedUserid - null); //encryptedPassword - } - - - private void flowUSRIDONLconnect () throws SqlException - { - flowServerAttributesAndKeyExchange(NetConfiguration.SECMEC_USRIDONL, - null); //publicKey - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - user_, - null, //password - null, //encryptedUserid - null); //encryptedPassword - } - - - private void flowUSRENCPWDconnect (String password) throws SqlException - { - flowServerAttributes(); - - checkSecmgrForSecmecSupport (NetConfiguration.SECMEC_USRENCPWD); - initializePublicKeyForEncryption(); - flowKeyExchange (NetConfiguration.SECMEC_USRENCPWD, publicKey_); - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - user_, - null, //password - null, //encryptedUserid - encryptedPasswordForUSRENCPWD (password)); - } - - - private void flowEUSRIDPWDconnect (String password) throws SqlException - { - flowServerAttributes(); - - checkSecmgrForSecmecSupport (NetConfiguration.SECMEC_EUSRIDPWD); - initializePublicKeyForEncryption(); - flowKeyExchange (NetConfiguration.SECMEC_EUSRIDPWD, publicKey_); - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - null, //user - null, //password - encryptedUseridForEUSRIDPWD(), - encryptedPasswordForEUSRIDPWD (password)); - } - - private void flowEUSRIDDTAconnect () throws SqlException - { - flowServerAttributes(); - - checkSecmgrForSecmecSupport (NetConfiguration.SECMEC_EUSRIDPWD); - initializePublicKeyForEncryption(); - flowKeyExchange (NetConfiguration.SECMEC_EUSRIDDTA, publicKey_); - - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - null, //user - null, //password - encryptedUseridForEUSRIDPWD(), - null);//encryptedPasswordForEUSRIDPWD (password), - } - - private void flowEUSRPWDDTAconnect (String password) throws SqlException - { - flowServerAttributes(); - - checkSecmgrForSecmecSupport (NetConfiguration.SECMEC_EUSRPWDDTA); - initializePublicKeyForEncryption(); - flowKeyExchange (NetConfiguration.SECMEC_EUSRPWDDTA, publicKey_); - - - flowSecurityCheckAndAccessRdb (targetSecmec_, //securityMechanism - null, //user - null, //password - encryptedUseridForEUSRIDPWD(), - encryptedPasswordForEUSRIDPWD (password)); - } - - private void flowServerAttributes () throws SqlException - { - agent_.beginWriteChainOutsideUOW(); - netAgent_.netConnectionRequest_.writeExchangeServerAttributes ( - extnam_, //externalName - targetAgent_, - netAgent_.targetSqlam_, - targetRdb_, - targetSecmgr_, - targetCmntcpip_, - targetCmnappc_, - targetXamgr_, - targetSyncptmgr_, - targetRsyncmgr_); - agent_.flowOutsideUOW(); - netAgent_.netConnectionReply_.readExchangeServerAttributes (this); - agent_.endReadChain(); - } - - private void flowKeyExchange (int securityMechanism, byte[] publicKey) throws SqlException - { - agent_.beginWriteChainOutsideUOW(); - netAgent_.netConnectionRequest_.writeAccessSecurity (securityMechanism, - databaseName_, - publicKey); - agent_.flowOutsideUOW(); - netAgent_.netConnectionReply_.readAccessSecurity (this, securityMechanism); - agent_.endReadChain(); - } - - private void flowServerAttributesAndKeyExchange (int securityMechanism, - byte[] publicKey) throws SqlException - { - agent_.beginWriteChainOutsideUOW(); - writeServerAttributesAndKeyExchange (securityMechanism, publicKey); - agent_.flowOutsideUOW(); - readServerAttributesAndKeyExchange (securityMechanism); - agent_.endReadChain(); - } - - private void flowSecurityCheckAndAccessRdb (int securityMechanism, - String user, - String password, - byte[] encryptedUserid, - byte[] encryptedPassword - ) throws SqlException - { - agent_.beginWriteChainOutsideUOW(); - writeSecurityCheckAndAccessRdb (securityMechanism, - user, - password, - encryptedUserid, - encryptedPassword); - agent_.flowOutsideUOW(); - readSecurityCheckAndAccessRdb(); - agent_.endReadChain(); - } - private void writeAllConnectCommandsChained (int securityMechanism, - String user, - String password) throws SqlException - { - writeServerAttributesAndKeyExchange (securityMechanism, - null); // publicKey - writeSecurityCheckAndAccessRdb (securityMechanism, - user, - password, - null, //encryptedUserid - null); //encryptedPassword, - } - - private void readAllConnectCommandsChained (int securityMechanism) throws SqlException - { - readServerAttributesAndKeyExchange (securityMechanism); - readSecurityCheckAndAccessRdb(); - } - - private void writeServerAttributesAndKeyExchange (int securityMechanism, - byte[] publicKey) throws SqlException - { - netAgent_.netConnectionRequest_.writeExchangeServerAttributes ( - extnam_, //externalName - targetAgent_, - netAgent_.targetSqlam_, - targetRdb_, - targetSecmgr_, - targetCmntcpip_, - targetCmnappc_, - targetXamgr_, - targetSyncptmgr_, - targetRsyncmgr_); - netAgent_.netConnectionRequest_.writeAccessSecurity (securityMechanism, - databaseName_, - publicKey); - } - - private void readServerAttributesAndKeyExchange (int securityMechanism) throws SqlException - { - netAgent_.netConnectionReply_.readExchangeServerAttributes (this); - netAgent_.netConnectionReply_.readAccessSecurity (this, securityMechanism); - } - private void writeSecurityCheckAndAccessRdb (int securityMechanism, + // byte[] to save the connect flows for connection reset + protected byte[] cachedConnectBytes_ = null; + protected boolean wroteConnectFromCache_ = false; + //-----------------------------state------------------------------------------ + + // these variables store the manager levels for the connection. + // they are initialized to the highest value which this driver supports + // at the current time. theses intial values should be increased when + // new manager level support is added to this driver. these initial values + // are sent to the server in the excsat command. the server will return a + // set of values and these will be parsed out by parseExcsatrd and parseMgrlvlls. + // during this parsing, these instance variable values will be reset to the negotiated + // levels for the connection. these values may be less than the + // values origionally set here at constructor time. it is these new values + // (following the parse) which are the levels for the connection. after + // a successful excsat command, these values can be checked to see + // what protocol is supported by this particular connection. + // if support for a new manager class is added, the buildExcsat and parseMgrlvlls + // methods will need to be changed to accomodate sending and receiving the new class. + protected int targetAgent_ = NetConfiguration.MGRLVL_7; //01292003jev monitoring + protected int targetCmntcpip_ = NetConfiguration.MGRLVL_5; + protected int targetRdb_ = NetConfiguration.MGRLVL_7; + public int targetSecmgr_ = NetConfiguration.MGRLVL_7; + protected int targetCmnappc_ = NetConfiguration.MGRLVL_NA; //NA since currently not used by net + protected int targetXamgr_ = NetConfiguration.MGRLVL_7; + protected int targetSyncptmgr_ = NetConfiguration.MGRLVL_NA; + protected int targetRsyncmgr_ = NetConfiguration.MGRLVL_NA; + + + // this is the external name of the target server. + // it is set by the parseExcsatrd method but not really used for much at this + // time. one possible use is for logging purposes and in the future it + // may be placed in the trace. + String targetExtnam_; + String extnam_; + + // Server Class Name of the target server returned in excsatrd. + // Again this is something which the driver is not currently using + // to make any decions. Right now it is just stored for future logging. + // It does contain some useful information however and possibly + // the database meta data object will make use of this + // for example, the product id (prdid) would give this driver an idea of + // what type of sevrer it is connected to. + public String targetSrvclsnm_; + + // Server Name of the target server returned in excsatrd. + // Again this is something which we don't currently use but + // keep it in case we want to log it in some problem determination + // trace/dump later. + protected String targetSrvnam_; + + // Server Product Release Level of the target server returned in excsatrd. + // specifies the procuct release level of a ddm server. + // Again this is something which we don't currently use but + // keep it in case we want to log it in some problem determination + // trace/dump later. + public String targetSrvrlslv_; + + // Keys used for encryption. + transient byte[] publicKey_; + transient byte[] targetPublicKey_; + + // Product-Specific Data (prddta) sent to the server in the accrdb command. + // The prddta has a specified format. It is saved in case it is needed again + // since it takes a little effort to compute. Saving this information is + // useful for when the connect flows need to be resent (right now the connect + // flow is resent when this driver disconnects and reconnects with + // non unicode ccsids. this is done when the server doesn't recoginze the + // unicode ccsids). + // + + byte[] prddta_; + + // Correlation Token of the source sent to the server in the accrdb. + // It is saved like the prddta in case it is needed for a connect reflow. + public byte[] crrtkn_; + + // The Secmec used by the target. + // It contains the negotiated security mechanism for the connection. + // Initially the value of this is 0. It is set only when the server and + // the target successfully negotiate a security mechanism. + int targetSecmec_; + + // the security mechanism requested by the application + protected int securityMechanism_; + + // stored the password for deferred reset only. + private transient char[] deferredResetPassword_ = null; + + private void setDeferredResetPassword(String password) { + deferredResetPassword_ = (password == null) ? null : flipBits(password.toCharArray()); + } + + private String getDeferredResetPassword() { + if (deferredResetPassword_ == null) { + return null; + } + String password = new String(flipBits(deferredResetPassword_)); + flipBits(deferredResetPassword_); // re-encrypt password + return password; + } + + protected byte[] cnntkn_ = null; + + // resource manager Id for XA Connections. + private int rmId_ = 0; + protected NetXAResource xares_ = null; + protected java.util.Hashtable indoubtTransactions_ = null; + protected int currXACallInfoOffset_ = 0; + private short seqNo_ = 1; + + // Flag to indicate a read only transaction + protected boolean readOnlyTransaction_ = true; + + //---------------------constructors/finalizer--------------------------------- + + public NetConnection(NetLogWriter netLogWriter, + String databaseName, + java.util.Properties properties) throws SqlException { + super(netLogWriter, 0, "", -1, databaseName, properties); + } + + public NetConnection(NetLogWriter netLogWriter, + org.apache.derby.jdbc.ClientDataSource dataSource, + String user, + String password) throws SqlException { + super(netLogWriter, user, password, dataSource); + setDeferredResetPassword(password); + } + + // For jdbc 1 connections + public NetConnection(NetLogWriter netLogWriter, + int driverManagerLoginTimeout, + String serverName, + int portNumber, + String databaseName, + java.util.Properties properties) throws SqlException { + super(netLogWriter, driverManagerLoginTimeout, serverName, portNumber, databaseName, properties); + netAgent_ = (NetAgent) super.agent_; + if (netAgent_.exceptionOpeningSocket_ != null) { + throw netAgent_.exceptionOpeningSocket_; + } + checkDatabaseName(); + String password = ClientDataSource.getPassword(properties); + securityMechanism_ = ClientDataSource.getSecurityMechanism(properties); + flowConnect(password, securityMechanism_); + completeConnect(); + } + + // For JDBC 2 Connections + public NetConnection(NetLogWriter netLogWriter, + String user, + String password, + org.apache.derby.jdbc.ClientDataSource dataSource, + int rmId, + boolean isXAConn) throws SqlException { + super(netLogWriter, user, password, isXAConn, dataSource); + netAgent_ = (NetAgent) super.agent_; + initialize(user, password, dataSource, rmId, isXAConn); + } + + public NetConnection(NetLogWriter netLogWriter, + String ipaddr, + int portNumber, + org.apache.derby.jdbc.ClientDataSource dataSource, + boolean isXAConn) throws SqlException { + super(netLogWriter, isXAConn, dataSource); + netAgent_ = (NetAgent) super.agent_; + if (netAgent_.exceptionOpeningSocket_ != null) { + throw netAgent_.exceptionOpeningSocket_; + } + checkDatabaseName(); + this.isXAConnection_ = isXAConn; + flowSimpleConnect(); + productID_ = targetSrvrlslv_; + super.completeConnect(); + } + + private void initialize(String user, + String password, + org.apache.derby.jdbc.ClientDataSource dataSource, + int rmId, + boolean isXAConn) throws SqlException { + securityMechanism_ = dataSource.getSecurityMechanism(); + + setDeferredResetPassword(password); + checkDatabaseName(); + dataSource_ = dataSource; + this.rmId_ = rmId; + this.isXAConnection_ = isXAConn; + flowConnect(password, securityMechanism_); + completeConnect(); + + } + + // preferably without password in the method signature. + // We can probally get rid of flowReconnect method. + public void resetNetConnection(org.apache.derby.client.am.LogWriter logWriter, + String user, + String password, + org.apache.derby.jdbc.ClientDataSource ds, + boolean recomputeFromDataSource) throws SqlException { + super.resetConnection(logWriter, user, ds, recomputeFromDataSource); + //---------------------------------------------------- + if (recomputeFromDataSource) { + // do not reset managers on a connection reset. this information shouldn't + // change and can be used to check secmec support. + + targetExtnam_ = null; + targetSrvclsnm_ = null; + targetSrvnam_ = null; + targetSrvrlslv_ = null; + publicKey_ = null; + targetPublicKey_ = null; + targetSecmec_ = 0; + if (ds != null && securityMechanism_ == 0) { + securityMechanism_ = ds.getSecurityMechanism(); + } + resetConnectionAtFirstSql_ = false; + if (resultSetHoldability_ == 0) { + ((org.apache.derby.client.net.NetDatabaseMetaData) databaseMetaData_).setDefaultResultSetHoldability(); + } + } + if (password != null) { + deferredResetPassword_ = null; + } else { + password = getDeferredResetPassword(); + } + // properties prddta_ and crrtkn_ will be initialized by + // calls to constructPrddta() and constructCrrtkn() + //---------------------------------------------------------- + boolean isDeferredReset = flowReconnect(password, securityMechanism_); + completeReset(isDeferredReset, recomputeFromDataSource); + } + + + protected void reset_(org.apache.derby.client.am.LogWriter logWriter, + String user, String password, + ClientDataSource ds, + boolean recomputeFromDataSource) throws SqlException { + checkResetPreconditions(logWriter, user, password, ds); + resetNetConnection(logWriter, user, password, ds, recomputeFromDataSource); + } + + protected void reset_(org.apache.derby.client.am.LogWriter logWriter, + ClientDataSource ds, + boolean recomputeFromDataSource) throws SqlException { + checkResetPreconditions(logWriter, null, null, ds); + resetNetConnection(logWriter, ds, recomputeFromDataSource); + } + + private void resetNetConnection(org.apache.derby.client.am.LogWriter logWriter, + org.apache.derby.jdbc.ClientDataSource ds, + boolean recomputeFromDataSource) throws SqlException { + super.resetConnection(logWriter, null, ds, recomputeFromDataSource); + //---------------------------------------------------- + if (recomputeFromDataSource) { + // do not reset managers on a connection reset. this information shouldn't + // change and can be used to check secmec support. + + targetExtnam_ = null; + targetSrvclsnm_ = null; + targetSrvnam_ = null; + targetSrvrlslv_ = null; + publicKey_ = null; + targetPublicKey_ = null; + targetSecmec_ = 0; + if (ds != null && securityMechanism_ == 0) { + securityMechanism_ = ds.getSecurityMechanism(); + } + resetConnectionAtFirstSql_ = false; + + if (resultSetHoldability_ == 0) { + ((org.apache.derby.client.net.NetDatabaseMetaData) databaseMetaData_).setDefaultResultSetHoldability(); + } + } + // properties prddta_ and crrtkn_ will be initialized by + // calls to constructPrddta() and constructCrrtkn() + //---------------------------------------------------------- + boolean isDeferredReset = flowReconnect(null, securityMechanism_); + completeReset(isDeferredReset, recomputeFromDataSource); + } + + protected void checkResetPreconditions(org.apache.derby.client.am.LogWriter logWriter, + String user, + String password, + ClientDataSource ds) throws SqlException { + if (inUnitOfWork_) { + throw new SqlException(logWriter, "Connection reset is not allowed when inside a unit of work."); + } + } + + java.util.List getSpecialRegisters() { + if (xares_ != null) { + return xares_.getSpecialRegisters(); + } else { + return null; + } + } + + public void addSpecialRegisters(String s) { + if (xares_ != null) { + xares_.addSpecialRegisters(s); + } + } + + public void completeConnect() throws SqlException { + super.completeConnect(); + } + + protected void completeReset(boolean isDeferredReset, boolean recomputeFromDataSource) throws SqlException { + super.completeReset(isDeferredReset, recomputeFromDataSource); + } + + public void flowConnect(String password, + int securityMechanism) throws SqlException { + netAgent_ = (NetAgent) super.agent_; + constructExtnam(); + // these calls need to be after newing up the agent + // because they require the ccsid manager + constructPrddta(); // construct product data + + netAgent_.typdef_ = new Typdef(netAgent_, 1208, NetConfiguration.SYSTEM_ASC, 1200, 1208); + netAgent_.targetTypdef_ = new Typdef(netAgent_); + netAgent_.originalTargetTypdef_ = netAgent_.targetTypdef_; + setDeferredResetPassword(password); + + // If password is not null, change security mechanism from + // SECMEC_USRIDONL to SECMEC_USRIDPWD + securityMechanism = ClientBaseDataSource.getUpgradedSecurityMechanism((short) securityMechanism, password); + try { + switch (securityMechanism) { + case NetConfiguration.SECMEC_USRIDPWD: // Clear text user id and password + checkUserPassword(user_, password); + flowUSRIDPWDconnect(password); + break; + case NetConfiguration.SECMEC_USRIDONL: // Clear text user, no password sent to server + checkUser(user_); + flowUSRIDONLconnect(); + break; + case NetConfiguration.SECMEC_USRENCPWD: // Clear text user, encrypted password + checkUserPassword(user_, password); + flowUSRENCPWDconnect(password); + break; + case NetConfiguration.SECMEC_EUSRIDPWD: // Encrypted user, encrypted password + checkUserPassword(user_, password); + flowEUSRIDPWDconnect(password); + break; + case NetConfiguration.SECMEC_EUSRIDDTA: + checkUserPassword(user_, password); + flowEUSRIDDTAconnect(); + break; + case NetConfiguration.SECMEC_EUSRPWDDTA: + checkUserPassword(user_, password); + flowEUSRPWDDTAconnect(password); + break; + + default: + throw new SqlException(agent_.logWriter_, "security mechanism '" + securityMechanism + "' not supported"); + } + } catch (java.lang.Throwable e) { // if *anything* goes wrong, make sure the connection is destroyed + // always mark the connection closed in case of an error. + // This prevents attempts to use this closed connection + // to retrieve error message text if an error SQLCA + // is returned in one of the connect flows. + open_ = false; + // logWriter may be closed in agent_.close(), + // so SqlException needs to be created before that + // but to be thrown after. + SqlException exceptionToBeThrown; + if (e instanceof SqlException) // rethrow original exception if it's an SqlException + { + exceptionToBeThrown = (SqlException) e; + } else // any other exceptions will be wrapped by an SqlException first + { + exceptionToBeThrown = new SqlException(agent_.logWriter_, e, "Unexpected throwable caught " + e.toString()); + } + + try { + if (agent_ != null) { + agent_.close(); + } + } catch (SqlException ignoreMe) { + } + + throw exceptionToBeThrown; + } + } + + protected void flowSimpleConnect() throws SqlException { + netAgent_ = (NetAgent) super.agent_; + constructExtnam(); + // these calls need to be after newing up the agent + // because they require the ccsid manager + constructPrddta(); // construct product data + + netAgent_.typdef_ = new Typdef(netAgent_, 1208, NetConfiguration.SYSTEM_ASC, 1200, 1208); + netAgent_.targetTypdef_ = new Typdef(netAgent_); + netAgent_.originalTargetTypdef_ = netAgent_.targetTypdef_; + + try { + flowServerAttributes(); + } catch (java.lang.Throwable e) { // if *anything* goes wrong, make sure the connection is destroyed + // always mark the connection closed in case of an error. + // This prevents attempts to use this closed connection + // to retrieve error message text if an error SQLCA + // is returned in one of the connect flows. + open_ = false; + // logWriter may be closed in agent_.close(), + // so SqlException needs to be created before that + // but to be thrown after. + SqlException exceptionToBeThrown; + if (e instanceof SqlException) // rethrow original exception if it's an SqlException + { + exceptionToBeThrown = (SqlException) e; + } else // any other exceptions will be wrapped by an SqlException first + { + exceptionToBeThrown = new SqlException(agent_.logWriter_, e, "Unexpected throwable caught " + e.toString()); + } + + try { + if (agent_ != null) { + agent_.close(); + } + } catch (SqlException ignoreMe) { + } + + throw exceptionToBeThrown; + } + } + + protected boolean flowReconnect(String password, int securityMechanism) throws SqlException { + constructExtnam(); + // these calls need to be after newing up the agent + // because they require the ccsid manager + constructPrddta(); //modify this to not new up an array + + checkSecmgrForSecmecSupport(securityMechanism); + try { + switch (securityMechanism) { + case NetConfiguration.SECMEC_USRIDPWD: // Clear text user id and password + checkUserPassword(user_, password); + resetConnectionAtFirstSql_ = true; + setDeferredResetPassword(password); + return true; + case NetConfiguration.SECMEC_USRIDONL: // Clear text user, no password sent to server + checkUser(user_); + resetConnectionAtFirstSql_ = true; + return true; + case NetConfiguration.SECMEC_USRENCPWD: // Clear text user, encrypted password + checkUserPassword(user_, password); + resetConnectionAtFirstSql_ = true; + setDeferredResetPassword(password); + return true; + case NetConfiguration.SECMEC_EUSRIDPWD: // Encrypted user, encrypted password + checkUserPassword(user_, password); + resetConnectionAtFirstSql_ = true; + setDeferredResetPassword(password); + return true; + case NetConfiguration.SECMEC_EUSRIDDTA: + checkUserPassword(user_, password); + resetConnectionAtFirstSql_ = true; + setDeferredResetPassword(password); + return true; + case NetConfiguration.SECMEC_EUSRPWDDTA: + checkUserPassword(user_, password); + resetConnectionAtFirstSql_ = true; + setDeferredResetPassword(password); + return true; + default: + throw new SqlException(agent_.logWriter_, "security mechanism '" + securityMechanism + "' not supported"); + } + } catch (SqlException sqle) { // this may not be needed because on method up the stack + open_ = false; // all reset exceptions are caught and wrapped in disconnect exceptions + try { + if (agent_ != null) { + agent_.close(); + } + } catch (SqlException ignoreMe) { + } + throw sqle; + } + } + + protected void finalize() throws java.lang.Throwable { + super.finalize(); + } + + protected byte[] getCnnToken() { + return cnntkn_; + } + + protected short getSequenceNumber() { + return ++seqNo_; + } + + //--------------------------------flow methods-------------------------------- + + private void flowUSRIDPWDconnect(String password) throws SqlException { + flowServerAttributesAndKeyExchange(NetConfiguration.SECMEC_USRIDPWD, + null); // publicKey + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + user_, + password, + null, //encryptedUserid + null); //encryptedPassword + } + + + private void flowUSRIDONLconnect() throws SqlException { + flowServerAttributesAndKeyExchange(NetConfiguration.SECMEC_USRIDONL, + null); //publicKey + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + user_, + null, //password + null, //encryptedUserid + null); //encryptedPassword + } + + + private void flowUSRENCPWDconnect(String password) throws SqlException { + flowServerAttributes(); + + checkSecmgrForSecmecSupport(NetConfiguration.SECMEC_USRENCPWD); + initializePublicKeyForEncryption(); + flowKeyExchange(NetConfiguration.SECMEC_USRENCPWD, publicKey_); + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + user_, + null, //password + null, //encryptedUserid + encryptedPasswordForUSRENCPWD(password)); + } + + + private void flowEUSRIDPWDconnect(String password) throws SqlException { + flowServerAttributes(); + + checkSecmgrForSecmecSupport(NetConfiguration.SECMEC_EUSRIDPWD); + initializePublicKeyForEncryption(); + flowKeyExchange(NetConfiguration.SECMEC_EUSRIDPWD, publicKey_); + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + null, //user + null, //password + encryptedUseridForEUSRIDPWD(), + encryptedPasswordForEUSRIDPWD(password)); + } + + private void flowEUSRIDDTAconnect() throws SqlException { + flowServerAttributes(); + + checkSecmgrForSecmecSupport(NetConfiguration.SECMEC_EUSRIDPWD); + initializePublicKeyForEncryption(); + flowKeyExchange(NetConfiguration.SECMEC_EUSRIDDTA, publicKey_); + + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + null, //user + null, //password + encryptedUseridForEUSRIDPWD(), + null);//encryptedPasswordForEUSRIDPWD (password), + } + + private void flowEUSRPWDDTAconnect(String password) throws SqlException { + flowServerAttributes(); + + checkSecmgrForSecmecSupport(NetConfiguration.SECMEC_EUSRPWDDTA); + initializePublicKeyForEncryption(); + flowKeyExchange(NetConfiguration.SECMEC_EUSRPWDDTA, publicKey_); + + + flowSecurityCheckAndAccessRdb(targetSecmec_, //securityMechanism + null, //user + null, //password + encryptedUseridForEUSRIDPWD(), + encryptedPasswordForEUSRIDPWD(password)); + } + + private void flowServerAttributes() throws SqlException { + agent_.beginWriteChainOutsideUOW(); + netAgent_.netConnectionRequest_.writeExchangeServerAttributes(extnam_, //externalName + targetAgent_, + netAgent_.targetSqlam_, + targetRdb_, + targetSecmgr_, + targetCmntcpip_, + targetCmnappc_, + targetXamgr_, + targetSyncptmgr_, + targetRsyncmgr_); + agent_.flowOutsideUOW(); + netAgent_.netConnectionReply_.readExchangeServerAttributes(this); + agent_.endReadChain(); + } + + private void flowKeyExchange(int securityMechanism, byte[] publicKey) throws SqlException { + agent_.beginWriteChainOutsideUOW(); + netAgent_.netConnectionRequest_.writeAccessSecurity(securityMechanism, + databaseName_, + publicKey); + agent_.flowOutsideUOW(); + netAgent_.netConnectionReply_.readAccessSecurity(this, securityMechanism); + agent_.endReadChain(); + } + + private void flowServerAttributesAndKeyExchange(int securityMechanism, + byte[] publicKey) throws SqlException { + agent_.beginWriteChainOutsideUOW(); + writeServerAttributesAndKeyExchange(securityMechanism, publicKey); + agent_.flowOutsideUOW(); + readServerAttributesAndKeyExchange(securityMechanism); + agent_.endReadChain(); + } + + private void flowSecurityCheckAndAccessRdb(int securityMechanism, String user, String password, byte[] encryptedUserid, - byte[] encryptedPassword) throws SqlException - { - netAgent_.netConnectionRequest_.writeSecurityCheck (securityMechanism, - databaseName_, - user, - password, - encryptedUserid, - encryptedPassword); - netAgent_.netConnectionRequest_.writeAccessDatabase (databaseName_, - false, - crrtkn_, - prddta_, - netAgent_.typdef_); - } - private void cacheConnectBytes (int beginOffset, int endOffset) - { - int length = endOffset - beginOffset; - cachedConnectBytes_ = new byte[length]; - netAgent_.netConnectionRequest_.finalizePreviousChainedDss (false); - System.arraycopy (netAgent_.netConnectionRequest_.bytes_, - beginOffset, - cachedConnectBytes_, - 0, - length); - netAgent_.netConnectionRequest_.setDssLengthLocation (netAgent_.netConnectionRequest_.offset_); - } - private void readSecurityCheckAndAccessRdb () throws SqlException - { - netAgent_.netConnectionReply_.readSecurityCheck (this); - netAgent_.netConnectionReply_.readAccessDatabase (this); - } - - void writeDeferredReset () throws SqlException - { - if (canUseCachedConnectBytes_ && cachedConnectBytes_ != null && - (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD || - securityMechanism_ == NetConfiguration.SECMEC_USRIDONL)) { - writeDeferredResetFromCache(); - wroteConnectFromCache_ = true; - } - else { - int beginOffset = netAgent_.netConnectionRequest_.offset_; - int endOffset = 0; - // NetConfiguration.SECMEC_USRIDPWD - if (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD) { - writeAllConnectCommandsChained(NetConfiguration.SECMEC_USRIDPWD, - user_, - getDeferredResetPassword()); - endOffset = netAgent_.netConnectionRequest_.offset_; - cacheConnectBytes (beginOffset, endOffset); - } - // NetConfiguration.SECMEC_USRIDONL - else if (securityMechanism_ == NetConfiguration.SECMEC_USRIDONL) { - writeAllConnectCommandsChained(NetConfiguration.SECMEC_USRIDONL, - user_, - null); //password - endOffset = netAgent_.netConnectionRequest_.offset_; - cacheConnectBytes (beginOffset, endOffset); - } - // either NetConfiguration.SECMEC_USRENCPWD or NetConfiguration.SECMEC_EUSRIDPWD - else { - initializePublicKeyForEncryption (); - // Set the resetConnectionAtFirstSql_ to false to avoid going in an - // infinite loop, since all the flow methods call beginWriteChain which then - // calls writeDeferredResetConnection where the check for resetConnectionAtFirstSql_ - // is done. By setting the resetConnectionAtFirstSql_ to false will avoid calling the - // writeDeferredReset method again. - resetConnectionAtFirstSql_ = false; - flowServerAttributesAndKeyExchange(securityMechanism_, publicKey_); + byte[] encryptedPassword) throws SqlException { agent_.beginWriteChainOutsideUOW(); + writeSecurityCheckAndAccessRdb(securityMechanism, + user, + password, + encryptedUserid, + encryptedPassword); + agent_.flowOutsideUOW(); + readSecurityCheckAndAccessRdb(); + agent_.endReadChain(); + } + + private void writeAllConnectCommandsChained(int securityMechanism, + String user, + String password) throws SqlException { + writeServerAttributesAndKeyExchange(securityMechanism, + null); // publicKey + writeSecurityCheckAndAccessRdb(securityMechanism, + user, + password, + null, //encryptedUserid + null); //encryptedPassword, + } + + private void readAllConnectCommandsChained(int securityMechanism) throws SqlException { + readServerAttributesAndKeyExchange(securityMechanism); + readSecurityCheckAndAccessRdb(); + } + + private void writeServerAttributesAndKeyExchange(int securityMechanism, + byte[] publicKey) throws SqlException { + netAgent_.netConnectionRequest_.writeExchangeServerAttributes(extnam_, //externalName + targetAgent_, + netAgent_.targetSqlam_, + targetRdb_, + targetSecmgr_, + targetCmntcpip_, + targetCmnappc_, + targetXamgr_, + targetSyncptmgr_, + targetRsyncmgr_); + netAgent_.netConnectionRequest_.writeAccessSecurity(securityMechanism, + databaseName_, + publicKey); + } + + private void readServerAttributesAndKeyExchange(int securityMechanism) throws SqlException { + netAgent_.netConnectionReply_.readExchangeServerAttributes(this); + netAgent_.netConnectionReply_.readAccessSecurity(this, securityMechanism); + } + + private void writeSecurityCheckAndAccessRdb(int securityMechanism, + String user, + String password, + byte[] encryptedUserid, + byte[] encryptedPassword) throws SqlException { + netAgent_.netConnectionRequest_.writeSecurityCheck(securityMechanism, + databaseName_, + user, + password, + encryptedUserid, + encryptedPassword); + netAgent_.netConnectionRequest_.writeAccessDatabase(databaseName_, + false, + crrtkn_, + prddta_, + netAgent_.typdef_); + } + + private void cacheConnectBytes(int beginOffset, int endOffset) { + int length = endOffset - beginOffset; + cachedConnectBytes_ = new byte[length]; + netAgent_.netConnectionRequest_.finalizePreviousChainedDss(false); + System.arraycopy(netAgent_.netConnectionRequest_.bytes_, + beginOffset, + cachedConnectBytes_, + 0, + length); + netAgent_.netConnectionRequest_.setDssLengthLocation(netAgent_.netConnectionRequest_.offset_); + } + + private void readSecurityCheckAndAccessRdb() throws SqlException { + netAgent_.netConnectionReply_.readSecurityCheck(this); + netAgent_.netConnectionReply_.readAccessDatabase(this); + } + + void writeDeferredReset() throws SqlException { + if (canUseCachedConnectBytes_ && cachedConnectBytes_ != null && + (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD || + securityMechanism_ == NetConfiguration.SECMEC_USRIDONL)) { + writeDeferredResetFromCache(); + wroteConnectFromCache_ = true; + } else { + int beginOffset = netAgent_.netConnectionRequest_.offset_; + int endOffset = 0; + // NetConfiguration.SECMEC_USRIDPWD + if (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD) { + writeAllConnectCommandsChained(NetConfiguration.SECMEC_USRIDPWD, + user_, + getDeferredResetPassword()); + endOffset = netAgent_.netConnectionRequest_.offset_; + cacheConnectBytes(beginOffset, endOffset); + } + // NetConfiguration.SECMEC_USRIDONL + else if (securityMechanism_ == NetConfiguration.SECMEC_USRIDONL) { + writeAllConnectCommandsChained(NetConfiguration.SECMEC_USRIDONL, + user_, + null); //password + endOffset = netAgent_.netConnectionRequest_.offset_; + cacheConnectBytes(beginOffset, endOffset); + } + // either NetConfiguration.SECMEC_USRENCPWD or NetConfiguration.SECMEC_EUSRIDPWD + else { + initializePublicKeyForEncryption(); + // Set the resetConnectionAtFirstSql_ to false to avoid going in an + // infinite loop, since all the flow methods call beginWriteChain which then + // calls writeDeferredResetConnection where the check for resetConnectionAtFirstSql_ + // is done. By setting the resetConnectionAtFirstSql_ to false will avoid calling the + // writeDeferredReset method again. + resetConnectionAtFirstSql_ = false; + flowServerAttributesAndKeyExchange(securityMechanism_, publicKey_); + agent_.beginWriteChainOutsideUOW(); + + // Reset the resetConnectionAtFirstSql_ to true since we are done + // with the flow method. + resetConnectionAtFirstSql_ = true; + // NetConfiguration.SECMEC_USRENCPWD + if (securityMechanism_ == NetConfiguration.SECMEC_USRENCPWD) { + writeSecurityCheckAndAccessRdb(NetConfiguration.SECMEC_USRENCPWD, + user_, + null, //password + null, //encryptedUserid + encryptedPasswordForUSRENCPWD(getDeferredResetPassword())); + } + // NetConfiguration.SECMEC_EUSRIDPWD + else { + writeSecurityCheckAndAccessRdb(NetConfiguration.SECMEC_EUSRIDPWD, + null, //user + null, //password + encryptedUseridForEUSRIDPWD(), + encryptedPasswordForEUSRIDPWD(getDeferredResetPassword())); + } + } + } + } - // Reset the resetConnectionAtFirstSql_ to true since we are done - // with the flow method. - resetConnectionAtFirstSql_ = true; - // NetConfiguration.SECMEC_USRENCPWD - if (securityMechanism_ == NetConfiguration.SECMEC_USRENCPWD) { - writeSecurityCheckAndAccessRdb(NetConfiguration.SECMEC_USRENCPWD, - user_, - null, //password - null, //encryptedUserid - encryptedPasswordForUSRENCPWD (getDeferredResetPassword())); + void readDeferredReset() throws SqlException { + resetConnectionAtFirstSql_ = false; + if (wroteConnectFromCache_) { + netAgent_.netConnectionReply_.verifyDeferredReset(); + return; } - // NetConfiguration.SECMEC_EUSRIDPWD + // either NetConfiguration.SECMEC_USRIDPWD or NetConfiguration.SECMEC_USRIDONL + if (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD || + securityMechanism_ == NetConfiguration.SECMEC_USRIDONL) { + readAllConnectCommandsChained(securityMechanism_); + } + // either NetConfiguration.SECMEC_USRENCPWD or NetConfiguration.SECMEC_EUSRIDPWD else { - writeSecurityCheckAndAccessRdb(NetConfiguration.SECMEC_EUSRIDPWD, - null, //user - null, //password - encryptedUseridForEUSRIDPWD(), - encryptedPasswordForEUSRIDPWD (getDeferredResetPassword())); - } - } - } - } - - void readDeferredReset () throws SqlException - { - resetConnectionAtFirstSql_ = false; - if (wroteConnectFromCache_) { - netAgent_.netConnectionReply_.verifyDeferredReset (); - return; - } - // either NetConfiguration.SECMEC_USRIDPWD or NetConfiguration.SECMEC_USRIDONL - if (securityMechanism_ == NetConfiguration.SECMEC_USRIDPWD || - securityMechanism_ == NetConfiguration.SECMEC_USRIDONL) { - readAllConnectCommandsChained (securityMechanism_); - } - // either NetConfiguration.SECMEC_USRENCPWD or NetConfiguration.SECMEC_EUSRIDPWD - else { - // either NetConfiguration.SECMEC_USRENCPWD or NetConfiguration.SECMEC_EUSRIDPWD - readSecurityCheckAndAccessRdb (); - } - if (agent_.loggingEnabled()) agent_.logWriter_.traceConnectResetExit (this); - } - - //-------------------parse callback methods-------------------------------- - - void setServerAttributeData (String extnam, - String srvclsnm, - String srvnam, - String srvrlslv) - { - targetExtnam_ = extnam; // any of these could be null - targetSrvclsnm_ = srvclsnm; // since then can be optionally returned from the - targetSrvnam_ = srvnam; // server - targetSrvrlslv_ = srvrlslv; - } - - // secmecList is always required and will not be null. - // secchkcd has an implied severity of error. - // it will be returned if an error is detected. - // if no errors and security mechanism requires a sectkn, then - void setAccessSecurityData (int secchkcd, - int desiredSecmec, - int[] secmecList, - boolean sectknReceived, - byte[] sectkn) throws DisconnectException - { - // - if the secchkcd is not 0, then map to an exception. - if (secchkcd != CodePoint.SECCHKCD_00) { - // the implied severity code is error - netAgent_.setSvrcod (CodePoint.SVRCOD_ERROR); - agent_.accumulateReadException (mapSecchkcd (secchkcd)); - } - else { - // - verify that the secmec parameter reflects the value sent - // in the ACCSEC command. - // should we check for null list - if ((secmecList.length == 1) && - (secmecList[0] == desiredSecmec)) { - // the security mechanism returned from the server matches - // the mechanism requested by the client. - targetSecmec_ = secmecList[0]; - - if ((targetSecmec_ == NetConfiguration.SECMEC_USRENCPWD) || - (targetSecmec_ == NetConfiguration.SECMEC_EUSRIDPWD) || - (targetSecmec_ == NetConfiguration.SECMEC_EUSRIDDTA) || - (targetSecmec_ == NetConfiguration.SECMEC_EUSRPWDDTA) ){ - - // a security token is required for USRENCPWD, or EUSRIDPWD. - if (!sectknReceived) - agent_.accumulateChainBreakingReadExceptionAndThrow ( - new DisconnectException (agent_, "secktn was not returned ")); - else - { - targetPublicKey_ = sectkn; - if (encryptionManager_ != null) - encryptionManager_.resetSecurityKeys(); - } - } - } - else { - // accumulate an SqlException and don't disconnect yet - // if a SECCHK was chained after this it would receive a secchk code - // indicating the security mechanism wasn't supported and that would be a - // chain breaking exception. if no SECCHK is chained this exception - // will be surfaced by endReadChain - // agent_.accumulateChainBreakingReadExceptionAndThrow ( - // new DisconnectException (agent_,"secmec not supported ","0000", -999)); - agent_.accumulateReadException ( - new SqlException (agent_.logWriter_, "secmec not supported")); - } - } - } - - void securityCheckComplete (int svrcod, int secchkcd) - { - netAgent_.setSvrcod (svrcod); - if (secchkcd == CodePoint.SECCHKCD_00) return; - agent_.accumulateReadException (mapSecchkcd (secchkcd)); - } - - void rdbAccessed (int svrcod, - String prdid, - boolean crrtknReceived, - byte[] crrtkn) - - { - if (crrtknReceived) - crrtkn_ = crrtkn; - - netAgent_.setSvrcod (svrcod); - productID_ = prdid; - } - - - //-------------------Abstract object factories-------------------------------- - - protected org.apache.derby.client.am.Agent newAgent_ (org.apache.derby.client.am.LogWriter logWriter, int loginTimeout, String serverName, int portNumber) - throws SqlException - { - return new NetAgent (this, - (NetLogWriter) logWriter, - loginTimeout, - serverName, - portNumber); - } - - - protected Statement newStatement_ (int type, int concurrency, int holdability) throws SqlException - { - return new NetStatement (netAgent_, this, type, concurrency, holdability).statement_; - } - - protected void resetStatement_ (Statement statement, int type, int concurrency, int holdability) throws SqlException - { - ((NetStatement)statement.materialStatement_).resetNetStatement(netAgent_,this,type,concurrency,holdability); - } - - protected PreparedStatement newPositionedUpdatePreparedStatement_ (String sql, - org.apache.derby.client.am.Section section) throws SqlException - { - return new NetPreparedStatement (netAgent_, this, sql, section).preparedStatement_; - } - - protected PreparedStatement newPreparedStatement_ (String sql, int type, int concurrency, int holdability, int autoGeneratedKeys, String[] columnNames) throws SqlException - { - return new NetPreparedStatement (netAgent_, this, sql, type, concurrency, holdability, autoGeneratedKeys, columnNames).preparedStatement_; - } - - protected void resetPreparedStatement_ (PreparedStatement ps, - String sql, - int resultSetType, - int resultSetConcurrency, - int resultSetHoldability, - int autoGeneratedKeys, - String[] columnNames) throws SqlException - { - ((NetPreparedStatement)ps.materialPreparedStatement_).resetNetPreparedStatement(netAgent_, this, sql, resultSetType, resultSetConcurrency, resultSetHoldability, autoGeneratedKeys, columnNames); - } - - - protected CallableStatement newCallableStatement_ (String sql, int type, int concurrency, int holdability) throws SqlException - { - return new NetCallableStatement (netAgent_, this, sql, type, concurrency, holdability).callableStatement_; - } - - protected void resetCallableStatement_ (CallableStatement cs, - String sql, - int resultSetType, - int resultSetConcurrency, - int resultSetHoldability) throws SqlException - { - ((NetCallableStatement)cs.materialCallableStatement_).resetNetCallableStatement(netAgent_, this, sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - - protected DatabaseMetaData newDatabaseMetaData_ () - { - return new NetDatabaseMetaData (netAgent_, this); - } - - //-------------------private helper methods-------------------------------- - - private void checkDatabaseName () throws SqlException - { - // netAgent_.logWriter may not be initialized yet - if (databaseName_ == null) throw new SqlException (agent_.logWriter_, "Required property \"databaseName\" not set"); - } - - private void checkUserLength (String user) throws SqlException - { - int usridLength = user.length(); - if ((usridLength == 0) || (usridLength > NetConfiguration.USRID_MAXSIZE)) - throw new SqlException (netAgent_.logWriter_, "userid length, " + usridLength + ", is not allowed."); - } - - private void checkPasswordLength (String password) throws SqlException - { - int passwordLength = password.length(); - if ((passwordLength == 0) || (passwordLength > NetConfiguration.PASSWORD_MAXSIZE)) - throw new SqlException (netAgent_.logWriter_, "password length, " + passwordLength + ", is not allowed."); - } - - private void checkUser (String user) throws SqlException - { - if (user == null) throw new SqlException (netAgent_.logWriter_, "null userid not supported"); - checkUserLength (user); - } - - private void checkUserPassword (String user, String password) throws SqlException - { - checkUser (user); - if (password == null) throw new SqlException (netAgent_.logWriter_, "null password not supported"); - checkPasswordLength (password); - } - - - // Determine if a security mechanism is supported by - // the security manager used for the connection. - // An exception is thrown if the security mechanism is not supported - // by the secmgr. - private void checkSecmgrForSecmecSupport (int securityMechanism) throws SqlException - { - boolean secmecSupported = false; - int[] supportedSecmecs = null; - - // Point to a list (array) of supported security mechanisms. - supportedSecmecs = NetConfiguration.SECMGR_SECMECS; - - // check to see if the security mechanism is on the supported list. - for (int i = 0; (i < supportedSecmecs.length) && (!secmecSupported) ; i++) { - if (supportedSecmecs[i] == securityMechanism) - secmecSupported = true; - } - - // throw an exception if not supported (not on list). - if (!secmecSupported) - throw new SqlException (agent_.logWriter_, "Security mechananism specified by app not supported by connection"); - } - - // If secchkcd is not 0, map to SqlException - // according to the secchkcd received. - private SqlException mapSecchkcd (int secchkcd) - { - if (secchkcd == CodePoint.SECCHKCD_00) return null; - - // the net driver will not support new password at this time. - // Here is the message for -30082 (STATE "08001"): - // Attempt to establish connection failed with security - // reason {0} {1} + reason-code + reason-string. - switch (secchkcd) { - case CodePoint.SECCHKCD_01: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: security mechanism not supported"); //"08001", -30082); - case CodePoint.SECCHKCD_10: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: password missing."); - case CodePoint.SECCHKCD_12: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: userid missing."); - case CodePoint.SECCHKCD_13: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: userid invalid."); - case CodePoint.SECCHKCD_14: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: userid revoked."); - case CodePoint.SECCHKCD_15: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: new password invalid."); - case CodePoint.SECCHKCD_0A: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: local security service non-retryable error."); - case CodePoint.SECCHKCD_0B: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: SECTKN missing on ACCSEC when it is required or it is invalid"); - case CodePoint.SECCHKCD_0E: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: password expired."); - case CodePoint.SECCHKCD_0F: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: password invalid."); - default: // ERROR SVRCOD - return new SqlException ( - agent_.logWriter_, - "Connection authorization failure occurred. Reason: not specified."); - } - } - - // Construct the correlation token. - // The crrtkn has the following format. - // - // <Almost IP address>.<local port number><current time in millis> - // | | | || | - // +----+--------------+ +-----+---------++---------+--------+ - // | | | - // 8 bytes 4 bytes 6 bytes - // Total lengtho of 19 bytes. - // - // 1 char for each 1/2 byte in the IP address. - // If the first character of the <IP address> or <port number> - // starts with '0' thru '9', it will be mapped to 'G' thru 'P'. - // Reason for mapping the IP address is in order to use the crrtkn as the LUWID when using SNA in a hop site. - protected void constructCrrtkn () throws SqlException - { - byte[] localAddressBytes = null; - long time = 0; - int num = 0; - int halfByte = 0; - int i = 0; - int j = 0; - - // allocate the crrtkn array. - if (crrtkn_ == null) - crrtkn_ = new byte[19]; - else - java.util.Arrays.fill(crrtkn_, (byte)0); - - localAddressBytes = netAgent_.socket_.getLocalAddress().getAddress(); - - // IP addresses are returned in a 4 byte array. - // Obtain the character representation of each half byte. - for (i=0,j=0; i < 4; i++,j+=2) { - - // since a byte is signed in java, convert any negative - // numbers to positive before shifting. - num = localAddressBytes[i] < 0 ? localAddressBytes[i] + 256 : localAddressBytes[i]; - halfByte = (num >> 4) & 0x0f; - - // map 0 to G - // The first digit of the IP address is is replaced by - // the characters 'G' thro 'P'(in order to use the crrtkn as the LUWID when using - // SNA in a hop site). For example, 0 is mapped to G, 1 is mapped H,etc. - if (i == 0) - crrtkn_[j] = netAgent_.sourceCcsidManager_.numToSnaRequiredCrrtknChar_[halfByte]; - else - crrtkn_[j] = netAgent_.sourceCcsidManager_.numToCharRepresentation_[halfByte]; - - halfByte = (num) & 0x0f; - crrtkn_[j+1] = netAgent_.sourceCcsidManager_.numToCharRepresentation_[halfByte]; - } - - // fill the '.' in between the IP address and the port number - crrtkn_[8] = netAgent_.sourceCcsidManager_.dot_; - - // Port numbers have values which fit in 2 unsigned bytes. - // Java returns port numbers in an int so the value is not negative. - // Get the character representation by converting the - // 4 low order half bytes to the character representation. - num = netAgent_.socket_.getLocalPort(); - - halfByte = (num >> 12) & 0x0f; - crrtkn_[9] = netAgent_.sourceCcsidManager_.numToSnaRequiredCrrtknChar_[halfByte]; - halfByte = (num >> 8)& 0x0f; - crrtkn_[10] = netAgent_.sourceCcsidManager_.numToCharRepresentation_[halfByte]; - halfByte = (num >> 4)& 0x0f; - crrtkn_[11] = netAgent_.sourceCcsidManager_.numToCharRepresentation_[halfByte]; - halfByte = (num)& 0x0f; - crrtkn_[12] = netAgent_.sourceCcsidManager_.numToCharRepresentation_[halfByte]; - - // The final part of CRRTKN is a 6 byte binary number that makes the - // crrtkn unique, which is usually the time stamp/process id. - // If the new time stamp is the - // same as one of the already created ones, then recreate the time stamp. - time = System.currentTimeMillis(); - - for (i=0; i<6; i++) { - // store 6 bytes of 8 byte time into crrtkn - crrtkn_[i+13] = (byte) (time >>> (40 - (i * 8))); - } - } - - - private void constructExtnam () throws SqlException - { - extnam_ = "derbydnc" + java.lang.Thread.currentThread().getName(); - } - - private void constructPrddta () throws SqlException - { - int prddtaLen = 1; - - if (prddta_ == null) - prddta_ = new byte[NetConfiguration.PRDDTA_MAXSIZE]; - else - java.util.Arrays.fill(prddta_,(byte)0); - - for (int i = 0; i < NetConfiguration.PRDDTA_ACCT_SUFFIX_LEN_BYTE; i++) - prddta_[i] = netAgent_.sourceCcsidManager_.space_; - - prddtaLen = netAgent_.sourceCcsidManager_.convertFromUCS2 (NetConfiguration.PRDID, - prddta_, - prddtaLen, - netAgent_); - - prddtaLen = netAgent_.sourceCcsidManager_.convertFromUCS2 (NetConfiguration.PRDDTA_PLATFORM_ID, - prddta_, - prddtaLen, - netAgent_); - - int extnamTruncateLength = Utils.min (extnam_.length(), NetConfiguration.PRDDTA_APPL_ID_FIXED_LEN); - netAgent_.sourceCcsidManager_.convertFromUCS2 (extnam_.substring (0,extnamTruncateLength), - prddta_, - prddtaLen, - netAgent_); - prddtaLen += NetConfiguration.PRDDTA_APPL_ID_FIXED_LEN; - - if (user_ != null) { - int userTruncateLength = Utils.min (user_.length(), NetConfiguration.PRDDTA_USER_ID_FIXED_LEN); - netAgent_.sourceCcsidManager_.convertFromUCS2 (user_.substring (0, userTruncateLength), - prddta_, - prddtaLen, - netAgent_); - } - - prddtaLen += NetConfiguration.PRDDTA_USER_ID_FIXED_LEN; - - prddta_[NetConfiguration.PRDDTA_ACCT_SUFFIX_LEN_BYTE] = 0; - prddtaLen++; - // the length byte value does not include itself. - prddta_[NetConfiguration.PRDDTA_LEN_BYTE] = (byte) (prddtaLen - 1); - } - - private void initializePublicKeyForEncryption () throws SqlException - { - if (encryptionManager_ == null) encryptionManager_ = new org.apache.derby.client.am.EncryptionManager(agent_); - publicKey_ = encryptionManager_.obtainPublicKey(); - } - - - private byte[] encryptedPasswordForUSRENCPWD (String password) throws SqlException - { - return encryptionManager_.encryptData ( - netAgent_.sourceCcsidManager_.convertFromUCS2 (password, netAgent_), - NetConfiguration.SECMEC_USRENCPWD, - netAgent_.sourceCcsidManager_.convertFromUCS2 (user_, netAgent_), - targetPublicKey_); - } - - private byte[] encryptedUseridForEUSRIDPWD () throws SqlException - { - return encryptionManager_.encryptData ( - netAgent_.sourceCcsidManager_.convertFromUCS2 (user_, netAgent_), - NetConfiguration.SECMEC_EUSRIDPWD, - targetPublicKey_, - targetPublicKey_); - } - - private byte[] encryptedPasswordForEUSRIDPWD (String password) throws SqlException - { - return encryptionManager_.encryptData ( - netAgent_.sourceCcsidManager_.convertFromUCS2 (password, netAgent_), - NetConfiguration.SECMEC_EUSRIDPWD, - targetPublicKey_, - targetPublicKey_); - } - - // Methods to get the manager levels for Regression harness only. - public int getSQLAM() { return netAgent_.targetSqlam_; } - public int getAGENT() { return targetAgent_; } - public int getCMNTCPIP() { return targetCmntcpip_; } - public int getRDB() { return targetRdb_; } - public int getSECMGR() { return targetSecmgr_; }
[... 883 lines stripped ...]