Skip to content

Commit

Permalink
Merge pull request data-integrations#515 from cloudsufi/enableSSLConn…
Browse files Browse the repository at this point in the history
…ections

Enable TLS Support (DTS - Specific)
  • Loading branch information
Vipinofficial11 authored Oct 21, 2024
2 parents a83eaac + e9dd995 commit f0347b9
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static class OracleActionConfig extends DBSpecificQueryConfig {

@Override
public String getConnectionString() {
return OracleConstants.getConnectionString(this.connectionType, host, port, database);
return OracleConstants.getConnectionString(this.connectionType, host, port, database, null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ protected String getConnectionString(@Nullable String database) {
return config.getConnectionString();
}
return OracleConstants.getConnectionString(config.getConnectionType(),
config.getHost(), config.getPort(), database);
config.getHost(), config.getPort(), database, config.getSSlMode());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ public OracleConnectorConfig(String host, int port, String user, String password

public OracleConnectorConfig(String host, int port, String user, String password, String jdbcPluginName,
String connectionArguments, String connectionType, String database) {
this(host, port, user, password, jdbcPluginName, connectionArguments, connectionType, database, null);
this(host, port, user, password, jdbcPluginName, connectionArguments, connectionType, database, null, null);
}

public OracleConnectorConfig(String host, int port, String user, String password, String jdbcPluginName,
String connectionArguments, String connectionType, String database,
String role) {
String role, Boolean useSSL) {

this.host = host;
this.port = port;
Expand All @@ -59,11 +59,12 @@ public OracleConnectorConfig(String host, int port, String user, String password
this.connectionType = connectionType;
this.database = database;
this.role = role;
this.useSSL = useSSL;
}

@Override
public String getConnectionString() {
return OracleConstants.getConnectionString(connectionType, host, getPort(), database);
return OracleConstants.getConnectionString(connectionType, host, getPort(), database, useSSL);
}

@Name(OracleConstants.CONNECTION_TYPE)
Expand All @@ -86,6 +87,11 @@ public String getConnectionString() {
@Nullable
private String transactionIsolationLevel;

@Name(OracleConstants.USE_SSL)
@Description("Turns on SSL encryption. Connection will fail if SSL is not available")
@Nullable
public Boolean useSSL;

@Override
protected int getDefaultPort() {
return 1521;
Expand All @@ -103,6 +109,11 @@ public String getDatabase() {
return database;
}

public Boolean getSSlMode() {
// return false if useSSL is null, otherwise return its value
return useSSL != null && useSSL;
}

@Override
public Properties getConnectionArgumentsProperties() {
Properties prop = super.getConnectionArgumentsProperties();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,35 +29,103 @@ private OracleConstants() {
public static final String PLUGIN_NAME = "Oracle";
public static final String ORACLE_CONNECTION_STRING_SID_FORMAT = "jdbc:oracle:thin:@%s:%s:%s";
public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT = "jdbc:oracle:thin:@//%s:%s/%s";
// Connection formats to accept protocol (e.g., jdbc:oracle:thin:@<protocol>://<host>:<port>/<SID>)
public static final String ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL = "jdbc:oracle:thin:@%s:%s:%s/%s";
public static final String ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL =
"jdbc:oracle:thin:@%s://%s:%s/%s";
public static final String ORACLE_CONNECTION_STRING_TNS_FORMAT = "jdbc:oracle:thin:@%s";
public static final String DEFAULT_BATCH_VALUE = "defaultBatchValue";
public static final String DEFAULT_ROW_PREFETCH = "defaultRowPrefetch";
public static final String SERVICE_CONNECTION_TYPE = "service";
public static final String CONNECTION_TYPE = "connectionType";
public static final String ROLE = "role";
public static final String NAME_DATABASE = "database";
public static final String TNS_CONNECTION_TYPE = "TNS";
public static final String TNS_CONNECTION_TYPE = "tns";
public static final String TRANSACTION_ISOLATION_LEVEL = "transactionIsolationLevel";
public static final String USE_SSL = "useSSL";

/**
* Returns the Connection String for the given ConnectionType.
* Constructs the Oracle connection string based on the provided connection type, host, port, and database.
* If SSL is enabled, the connection protocol will be "tcps" instead of "tcp".
*
* @param connectionType TNS/Service/SID
* @param host Host name of the oracle server
* @param port Port of the oracle server
* @param database Database to connect to
* @return Connection String based on the given ConnectionType
* @param useSSL Whether SSL/TLS is required(YES/NO)
* @return Connection String based on the given parameters and connection type.
*/
public static String getConnectionString(String connectionType,
@Nullable String host,
@Nullable int port,
String database) {
if (OracleConstants.TNS_CONNECTION_TYPE.equalsIgnoreCase(connectionType)) {
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database);
String database,
@Nullable Boolean useSSL) {
// Use protocol as "tcps" when SSL is requested or else use "tcp".
String connectionProtocol;
boolean isSSLEnabled = false;
if (useSSL != null && useSSL) {
connectionProtocol = "tcps";
isSSLEnabled = true;
} else {
connectionProtocol = "tcp";
}
if (OracleConstants.SERVICE_CONNECTION_TYPE.equalsIgnoreCase(connectionType)) {
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT,
host, port, database);

switch (connectionType.toLowerCase()) {
case OracleConstants.TNS_CONNECTION_TYPE:
// TNS connection doesn't require protocol
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_TNS_FORMAT, database);
case OracleConstants.SERVICE_CONNECTION_TYPE:
// Create connection string for SERVICE type.
return getConnectionStringWithService(host, port, database, connectionProtocol, isSSLEnabled);
default:
// Default to SID format if no matching case is found.
return getConnectionStringWithSID(host, port, database, connectionProtocol, isSSLEnabled);
}
}

/**
* Constructs the connection string for a SERVICE connection type.
*
* @param host Host name of the Oracle server.
* @param port Port of the Oracle server.
* @param database Database name to connect to.
* @param connectionProtocol Protocol to use for the connection ("tcp" or "tcps").
* @param isSSLEnabled Indicates if SSL is enabled.
* @return Formatted connection string for a SERVICE connection.
*/
private static String getConnectionStringWithService(@Nullable String host,
@Nullable int port,
String database,
String connectionProtocol,
boolean isSSLEnabled) {
// Choose the appropriate format based on whether SSL is enabled.
if (isSSLEnabled) {
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT_WITH_PROTOCOL,
connectionProtocol, host, port, database);
}
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SERVICE_NAME_FORMAT,
host, port, database);
}

/**
* Constructs the connection string for a SID connection type.
*
* @param host Host name of the Oracle server.
* @param port Port of the Oracle server.
* @param database Database name to connect to.
* @param connectionProtocol Protocol to use for the connection ("tcp" or "tcps").
* @param isSSLEnabled Indicates if SSL is enabled.
* @return Formatted connection string for a SID connection.
*/
private static String getConnectionStringWithSID(@Nullable String host,
@Nullable int port,
String database,
String connectionProtocol,
boolean isSSLEnabled) {
// Choose the appropriate format based on whether SSL is enabled.
if (isSSLEnabled) {
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT_WITH_PROTOCOL,
connectionProtocol, host, port, database);
}
return String.format(OracleConstants.ORACLE_CONNECTION_STRING_SID_FORMAT,
host, port, database);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static class OracleQueryActionConfig extends DBSpecificQueryActionConfig

@Override
public String getConnectionString() {
return OracleConstants.getConnectionString(this.connectionType, host, port, database);
return OracleConstants.getConnectionString(this.connectionType, host, port, database, null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ public OracleSourceConfig(String host, int port, String user, String password, S
String connectionArguments, String connectionType, String database, String role,
int defaultBatchValue, int defaultRowPrefetch,
String importQuery, Integer numSplits, int fetchSize,
String boundingQuery, String splitBy) {
String boundingQuery, String splitBy, Boolean useSSL) {
this.connection = new OracleConnectorConfig(host, port, user, password, jdbcPluginName, connectionArguments,
connectionType, database, role);
connectionType, database, role, useSSL);
this.defaultBatchValue = defaultBatchValue;
this.defaultRowPrefetch = defaultRowPrefetch;
this.fetchSize = fetchSize;
Expand All @@ -132,7 +132,7 @@ public OracleSourceConfig(String host, int port, String user, String password, S
@Override
public String getConnectionString() {
return OracleConstants.getConnectionString(connection.getConnectionType(), connection.getHost(),
connection.getPort(), connection.getDatabase());
connection.getPort(), connection.getDatabase(), connection.getSSlMode());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ public class OracleFailedConnectionTest extends DBSpecificFailedConnectionTest {
public void test() throws ClassNotFoundException, IOException {

OracleConnector connector = new OracleConnector(
new OracleConnectorConfig("localhost", 1521, "username", "password", "jdbc", "", "database"));
new OracleConnectorConfig("localhost", 1521, "username", "password", "jdbc", "",
"SID", "database"));

super.test(JDBC_DRIVER_CLASS_NAME, connector, "Failed to create connection to database via connection string:" +
" jdbc:oracle:thin:@localhost:1521:database and arguments: " +
Expand Down
20 changes: 20 additions & 0 deletions oracle-plugin/widgets/Oracle-batchsink.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,26 @@
"default": "TRANSACTION_SERIALIZABLE"
}
},
{
"widget-type": "hidden",
"label": "TLS Encryption",
"name": "useSSL",
"description": "Enable TLS encryption (true/false)",
"widget-attributes": {
"layout": "inline",
"default": "false",
"options": [
{
"id": "true",
"label": "true"
},
{
"id": "false",
"label": "false"
}
]
}
},
{
"name": "connectionType",
"label": "Connection Type",
Expand Down
20 changes: 20 additions & 0 deletions oracle-plugin/widgets/Oracle-batchsource.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,26 @@
"default": "TRANSACTION_SERIALIZABLE"
}
},
{
"widget-type": "hidden",
"label": "TLS Encryption",
"name": "useSSL",
"description": "Enable TLS encryption (true/false)",
"widget-attributes": {
"layout": "inline",
"default": "false",
"options": [
{
"id": "true",
"label": "true"
},
{
"id": "false",
"label": "false"
}
]
}
},
{
"name": "connectionType",
"label": "Connection Type",
Expand Down
20 changes: 20 additions & 0 deletions oracle-plugin/widgets/Oracle-connector.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,26 @@
],
"default": "TRANSACTION_SERIALIZABLE"
}
},
{
"widget-type": "hidden",
"label": "TLS Encryption",
"name": "useSSL",
"description": "Enable TLS encryption (true/false)",
"widget-attributes": {
"layout": "inline",
"default": "false",
"options": [
{
"id": "true",
"label": "true"
},
{
"id": "false",
"label": "false"
}
]
}
}
]
},
Expand Down

0 comments on commit f0347b9

Please sign in to comment.