Skip to content

Commit

Permalink
@W-12971206 - [OAuth][SDK] Backport instanceUrlSuffix support to 20…
Browse files Browse the repository at this point in the history
…23.1 (#1113)

* Add instanceUrlSuffix support
* Add additional changes from configLabel MR
  • Loading branch information
ethan-pyke authored Jun 6, 2023
1 parent d2733b7 commit d736286
Show file tree
Hide file tree
Showing 8 changed files with 124 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Tableau Connector SDK Changelog
## 2023-04-04
### Changed
- Update `oauth_config.xsd` to include `instanceUrlSuffix` field and update `min-version-tableau` to be 2023.1 if present
## 2022-12-16
### Changed
- Convert database impersonation sample to Connection Dialog V2
Expand Down
7 changes: 6 additions & 1 deletion connector-packager/connector_packager/jar_jdk_packager.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,13 @@ def get_min_support_version(file_list: List[ConnectorFile], cur_min_version_tabl
elif connector_file.file_type == "oauth-config":
# Check to see if we're using oauthConfigId, which needs 2021.4+
pluginOAuthConfigRoot = ET.parse(input_dir / connector_file.file_name).getroot()

oauthConfigId = pluginOAuthConfigRoot.find('.//oauthConfigId')
if (oauthConfigId is not None and 2021.4 > float(min_version_tableau)):
instanceUrlSuffix = pluginOAuthConfigRoot.find('.//instanceUrlSuffix')
if (instanceUrlSuffix is not None and 2023.1 > float(min_version_tableau)):
min_version_tableau = "2023.1"
reasons.append("Connector uses instanceUrlSuffix field, which was added in the 2023.1 release")
elif (oauthConfigId is not None and 2021.4 > float(min_version_tableau)):
min_version_tableau = "2021.4"
reasons.append("Connector contains an oauthConfigId field, which was added in the 2021.4 release")
elif 2021.1 > float(min_version_tableau):
Expand Down
33 changes: 33 additions & 0 deletions connector-packager/tests/test_jar_packager.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,3 +326,36 @@ def test_jdk_create_jar_with_multiple_configs(self):

if dest_dir.exists():
shutil.rmtree(dest_dir)

def test_jdk_create_jar_oauth_with_instance_url_suffix(self):
files_list = [
ConnectorFile("manifest.xml", "manifest"),
ConnectorFile("connectionFields.xml", "connection-fields"),
ConnectorFile("connectionMetadata.xml", "connection-metadata"),
ConnectorFile("connectionBuilder.js", "script"),
ConnectorFile("dialect.xml", "dialect"),
ConnectorFile("connectionResolver.xml", "connection-resolver"),
ConnectorFile("connectionProperties.js", "script"),
ConnectorFile("oauth-config-with-suffix.xml", "oauth-config")]
source_dir = TEST_FOLDER / Path("oauth_connector")
dest_dir = TEST_FOLDER / Path("packaged-connector-by-jdk/")
package_name = "test_oauth.taco"

jdk_create_jar(source_dir, files_list, package_name, dest_dir)

path_to_test_file = dest_dir / Path(package_name)
self.assertTrue(os.path.isfile(path_to_test_file), "taco file doesn't exist")

# test min support tableau version is stamped
args = ["jar", "xf", package_name, MANIFEST_FILE_NAME]
p = subprocess.Popen(args, cwd=os.path.abspath(dest_dir))
self.assertEqual(p.wait(), 0, "can not extract manfifest file from taco")
path_to_extracted_manifest = dest_dir / MANIFEST_FILE_NAME
self.assertTrue(os.path.isfile(path_to_extracted_manifest), "extracted manifest file doesn't exist")

manifest = ET.parse(path_to_extracted_manifest)
self.assertEqual(manifest.getroot().get("min-version-tableau"),
VERSION_2023_1, "wrong min-version-tableau attr or doesn't exist")

if dest_dir.exists():
shutil.rmtree(dest_dir)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<pluginOAuthConfig>
<dbclass>test_oauth</dbclass>

<oauthConfigId>oauthConfigid</oauthConfigId>
<clientIdDesktop>******</clientIdDesktop>
<clientSecretDesktop>******</clientSecretDesktop>
<redirectUrisDesktop>http://localhost:55555/Callback</redirectUrisDesktop>

<authUri>/oauth2/v2.0/authorize</authUri>
<tokenUri>/oauth2/v2.0/token</tokenUri>

<instanceUrlSuffix>/oidc</instanceUrlSuffix>

<scopes>openid</scopes>
<scopes>email</scopes>
<scopes>profile</scopes>
<scopes>offline_access</scopes>

</pluginOAuthConfig>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<pluginOAuthConfig>
<dbclass>test_oauth</dbclass>

<oauthConfigId>oauthConfigid</oauthConfigId>
<clientIdDesktop>******</clientIdDesktop>
<clientSecretDesktop>******</clientSecretDesktop>
<redirectUrisDesktop>http://localhost:55555/Callback</redirectUrisDesktop>
<instanceUrlSuffix>/oidc</instanceUrlSuffix>

<authUri>/oauth2/v2.0/authorize</authUri>
<tokenUri>/oauth2/v2.0/token</tokenUri>

<scopes>openid</scopes>
<scopes>email</scopes>
<scopes>profile</scopes>
<scopes>offline_access</scopes>

</pluginOAuthConfig>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<pluginOAuthConfig>
<dbclass>test_oauth</dbclass>

<oauthConfigId>oauthConfigid</oauthConfigId>
<clientIdDesktop>******</clientIdDesktop>
<clientSecretDesktop>******</clientSecretDesktop>
<redirectUrisDesktop>http://localhost:55555/Callback</redirectUrisDesktop>

<authUri>/oauth2/v2.0/authorize</authUri>
<tokenUri>/oauth2/v2.0/token</tokenUri>

<instanceUrlSuffix>/oidc</instanceUrlSuffix>

<scopes>openid</scopes>
<scopes>email</scopes>
<scopes>profile</scopes>
<scopes>offline_access</scopes>

</pluginOAuthConfig>
22 changes: 22 additions & 0 deletions connector-packager/tests/test_xsd_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -402,3 +402,25 @@ def test_validate_multiple_oauth_config(self):
test_file = TEST_FOLDER / "multiple_oauth_config/test_manifest_files/manifest_2_config.xml"
self.assertTrue(validate_single_file(file_to_test, test_file, xml_violations_buffer, dummy_properties),
"3 OAuth Config Fields are marked as invalid")

def test_validate_instance_url_suffix(self):
test_file = TEST_FOLDER / "oauth_instance_url_suffix/valid/oauth-config.xml"
file_to_test = ConnectorFile("oauth-config.xml", "oauth-config")
xml_violations_buffer = []

self.assertTrue(validate_single_file(file_to_test, test_file, xml_violations_buffer, dummy_properties),
"Valid XML file not marked as valid")

test_file = TEST_FOLDER / "oauth_connector/oauth-config.xml"
file_to_test = ConnectorFile("oauth-config.xml", "oauth-config")
xml_violations_buffer = []

self.assertTrue(validate_single_file(file_to_test, test_file, xml_violations_buffer, dummy_properties),
"oauthConfig should be able to have no instanceUrlSuffix field")

test_file = TEST_FOLDER / "oauth_instance_url_suffix/invalid/oauth-config.xml"
file_to_test = ConnectorFile("oauth-config.xml", "oauth-config")
xml_violations_buffer = []

self.assertFalse(validate_single_file(file_to_test, test_file, xml_violations_buffer, dummy_properties),
"The instanceUrlSuffix must be located after authUri and tokenUri.")
1 change: 1 addition & 0 deletions validation/oauth_config.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<xs:element type="xs:string" name="authUri"/>
<xs:element type="xs:string" name="tokenUri"/>
<xs:element type="xs:string" name="userInfoUri" maxOccurs="1" minOccurs="0"/>
<xs:element type="xs:string" name="instanceUrlSuffix" maxOccurs="1" minOccurs="0"/>
<xs:element type="xs:string" name="instanceUrlValidationRegex" maxOccurs="1" minOccurs="0"/>
<xs:element type="xs:string" name="scopes" maxOccurs="unbounded" minOccurs="1"/>
<xs:element type="xs:string" name="requiredAuthAttrs" maxOccurs="unbounded" minOccurs="0"/>
Expand Down

0 comments on commit d736286

Please sign in to comment.