php-sqlsrv/test/functional/sqlsrv/sqlsrv_ae_azure_key_vault_keywords.phpt

198 lines
7.7 KiB
Plaintext
Raw Normal View History

2018-05-06 02:08:01 +02:00
--TEST--
2018-05-18 21:24:37 +02:00
Test connection keywords for Azure Key Vault for Always Encrypted.
2018-05-06 02:08:01 +02:00
--SKIPIF--
2018-12-08 00:03:48 +01:00
<?php require('skipif_azure.inc');
require('skipif_versions_old.inc'); ?>
2018-05-06 02:08:01 +02:00
--FILE--
<?php
require_once('sqlsrv_ae_azure_key_vault_common.php');
2018-05-06 02:08:01 +02:00
// This test only applies to Azure Key Vault, or to no encryption at all
if ($keystore != 'none' and $keystore != 'akv') {
echo "Done.\n";
exit();
}
2018-05-06 02:08:01 +02:00
// We will test the direct product (set of all possible combinations) of the following
$columnEncryption = ['enabled', 'disabled', 'notvalid', ''];
$keyStoreAuthentication = ['KeyVaultPassword', 'KeyVaultClientSecret', 'KeyVaultNothing', ''];
2018-05-09 01:16:27 +02:00
$keyStorePrincipalId = [$AKVPrincipalName, $AKVClientID, 'notaname', ''];
2018-05-06 02:08:01 +02:00
$keyStoreSecret = [$AKVPassword, $AKVSecret, 'notasecret', ''];
function checkErrors($errors, ...$codes)
2018-05-18 21:24:37 +02:00
{
$codeFound = false;
2018-05-18 23:05:18 +02:00
2018-05-18 21:24:37 +02:00
foreach ($codes as $code) {
if ($code[0]==$errors[0][0] and $code[1]==$errors[0][1]) {
$codeFound = true;
2018-05-18 21:24:37 +02:00
}
}
2018-05-18 23:05:18 +02:00
2018-05-18 21:24:37 +02:00
if ($codeFound == false) {
echo "Error: ";
print_r($errors);
echo "\nExpected: ";
print_r($codes);
echo "\n";
fatalError("Error code not found.\n");
2018-05-06 02:08:01 +02:00
}
}
2018-05-25 23:42:32 +02:00
// The array of data types corresponding to $small_values in values.php.
// SHORT_STRSIZE is defined in values.php as well.
$dataTypes = array("char(".SHORT_STRSIZE.")", "varchar(".SHORT_STRSIZE.")", "nvarchar(".SHORT_STRSIZE.")",
2018-05-06 02:08:01 +02:00
"decimal", "float", "real", "bigint", "int", "bit"
);
2018-05-09 01:16:27 +02:00
$tableName = "akv_comparison_table";
2019-12-03 22:28:29 +01:00
// First determine if the server is AE v2 enabled
$isEnclaveEnabled = false;
$connectionOptions = array("CharacterSet"=>"UTF-8",
"database"=>$databaseName,
"uid"=>$uid,
"pwd"=>$pwd,
"ConnectionPooling"=>0);
$conn = sqlsrv_connect($server, $connectionOptions);
if (!$conn) {
fatalError("Initial connection failed\n");
} else {
$query = "SELECT [name], [value], [value_in_use] FROM sys.configurations WHERE [name] = 'column encryption enclave type';";
$stmt = sqlsrv_query($conn, $query);
$info = sqlsrv_fetch_array($stmt);
5.8.0 RTW dev to master (#1087) * Fixed the potential error reported by Prefast code analysis * Use SQLSRV_ASSERT for checking NULL ptrs * For these AKV tests check env despite not AE connected * Added the driver option to run functional tests * Fixed connection pooling tests for more than one ODBC drivers * added driver option to pdo isPooled.php * Removed win32 ifdefs re connection resiliency (#802) * Set the driver argument for getDSN to null by default (#798) * Added the driver argument to getDSN * Dropped the driver argument but set to null as default * Removed the AE condition in locale support * Modified the AE condition for locale support * Changed int to SQLLEN to avoid infinite loop (#806) * Version 5.3.0 (#803) * Version 5.3.0 * Fixed the wrong replacements * Added comments block to m4 files * Use dnl for comments * Modified AE fetch phptypes test to insert only one row at a time and loop through php types (#801) * Modified AE fetch phptypes test to insert only one row at a time and loop through php types * Fixed formatting * Streamlined two very similar large column name tests (#807) * Streamlined two very similar large column name tests * Changed the EOL * Updates to change log and readme (#811) * Updates to change log and readme * Dropped support for Ubuntu 17 * Modified as per review comments * Fixed connection resiliency tests for Unix, updated AppVeyor for ODBC 17.2 * Fixed expected output * Fixed output and skipifs * Fixed skipifs and output * Fixed driver name * Updated installation instructions and sample script (#813) * Updated instructions and sample test for 5.3.0 RTW * Fixed sample code to adhere to php coding standard * Fixed cases and spaces * Modified NOTE for UB 18.04 based on review comments * Added 'exit' * Modified change log and readme based on review to PR 811 * Applied review comments * build output to debug appveyor failure * removed debug output * Streamlined two very similar large column name tests (#815) * Streamlined two very similar large column name tests * Added random number of test table names to avoid operand clash issues * Replaced to with for based on review * Changelog updated * changelog updated, test skipif changed to run on unix platforms * Fixed skipif typo * Fixed typo in skipif for pdo * Fixed some output for Travis * Moved error checking inside pdo connres tests * Added links back to changelog * Fixed output for sqlsrv connres tests * Fixed output * Fixed output again * Fixed skipifs for connres * Tweaked per review comments * Changes made to source and tests to support PHP 7.3 (#822) * Changes made to support php 7.3 * Correct use of the smart pointer * Fixed the tests for 7.3 * Some clean up for array_init() * Fixed formattings and clean up * One more fix * Initialising strings with nulls * Removed some spaces * Made array index spacing consistent * Fix for compilation problem * Fix for compilation problem again * Before freeing stmt in destructor check if dbh driver data is NULL (#829) * Issue 434 - set dbh driver data to NULL as well in destructor * Reverted the last change but instead check if dbh driver_data is already freed * Modified the comment * Added driver to the skipif conditions (#831) * Used git clone instead to download source from a branch of a tag (#832) * Modified the error handling to make it more flexible (#833) * Made error handling more flexible * Fixed a minor issue with a test * Enabled Spectre Mitigations (#836) * Incorporated changes in PR 634 to pdo_sqlsrv (#834) * Incorporated changes in PR 634 to pdo_sqlsrv * Reverted the changes because the array is for internal use only * Modified README re user's suggestion (#841) * Modified README re user's suggestion * Moved the if condition to the end as per review * Adding supporting for Azure AD access token (#837) * Adding supporting for Azure AD access token * Added more comments for the AD access token skipif files * Save the pointer to access token struct until after connecting * Clear the access token data before freeing the memory * Added a reference as per review * Feature request - new PDO_STMT_OPTION_FETCHES_DATETIME_TYPE flag for pdo_sqlsrv to return datetime as objects (#842) * Feature request - issue 648 * Fixed constructor for field_cache and added another test * Added tests for FETCH_BOUND * Added a new test for output param * Modified output param test to set attributes differently * Removed a useless helped function in a test * Combined two new tests into one as per review * Uncommented dropTable * Feature request - add ReturnDatesAsStrings option to statement level for sqlsrv (#844) * Added ReturnDatesAsStrings option to the statement level * Added new tests for ReturnDatesAsStrings at statement level * Added more datetime types as per review * Updated version 5.4.0-preview (#846) * Updated version 5.4.0-preview * Replaced 5.3 with 5.4 * Fixed sqlsrv datetime tests to connect with ColumnEncryption variables (#849) * Change log for 5.4.0-preview (#850) * Updated change log for 5.4.0-preview * Updated 5.4.0 preview to add two new feature requests * Modified change log as per review * Modified the wordings * Updated readme, changelog, and install instructions * Clear AKV data after setting the connection attribute or when exception is thrown (#854) * Dev (#820) * Fixed the potential error reported by Prefast code analysis * Use SQLSRV_ASSERT for checking NULL ptrs * For these AKV tests check env despite not AE connected * Added the driver option to run functional tests * Fixed connection pooling tests for more than one ODBC drivers * added driver option to pdo isPooled.php * Removed win32 ifdefs re connection resiliency (#802) * Set the driver argument for getDSN to null by default (#798) * Added the driver argument to getDSN * Dropped the driver argument but set to null as default * Removed the AE condition in locale support * Modified the AE condition for locale support * Changed int to SQLLEN to avoid infinite loop (#806) * Version 5.3.0 (#803) * Version 5.3.0 * Fixed the wrong replacements * Added comments block to m4 files * Use dnl for comments * Modified AE fetch phptypes test to insert only one row at a time and loop through php types (#801) * Modified AE fetch phptypes test to insert only one row at a time and loop through php types * Fixed formatting * Streamlined two very similar large column name tests (#807) * Streamlined two very similar large column name tests * Changed the EOL * Updates to change log and readme (#811) * Updates to change log and readme * Dropped support for Ubuntu 17 * Modified as per review comments * Fixed connection resiliency tests for Unix, updated AppVeyor for ODBC 17.2 * Fixed expected output * Fixed output and skipifs * Fixed skipifs and output * Fixed driver name * Updated installation instructions and sample script (#813) * Updated instructions and sample test for 5.3.0 RTW * Fixed sample code to adhere to php coding standard * Fixed cases and spaces * Modified NOTE for UB 18.04 based on review comments * Added 'exit' * Modified change log and readme based on review to PR 811 * Applied review comments * build output to debug appveyor failure * removed debug output * Streamlined two very similar large column name tests (#815) * Streamlined two very similar large column name tests * Added random number of test table names to avoid operand clash issues * Replaced to with for based on review * Changelog updated * changelog updated, test skipif changed to run on unix platforms * Fixed skipif typo * Fixed typo in skipif for pdo * Fixed some output for Travis * Moved error checking inside pdo connres tests * Added links back to changelog * Fixed output for sqlsrv connres tests * Fixed output * Fixed output again * Clear AKV data after connection or when exception is thrown * Modified tests too to skip some AKV tests without real credentials * Used assignment operator also free the existing memory * Change readme links to https * Change readme links to https Merging this commit to dev * Save meta data for the fetched result set (#855) * Save meta data on fetched result sets * Fixed a compilation error * Optimized some more -- metadata should be available when fetching * Skip conversion for strings of numeric values, integers, floats, decimals etc * Set encoding char for numeric data * Apply review * Added Mojave to macOS instructions (#862) Added Mojave to macOS instructions * Fixed the broken links of Appveyor status badge (#863) * Feature request 415 for sqlsrv (#861) * Modified how to send stream data using SQLPutData and SQLParamData (#865) * Updated instructions to include Ubuntu 18.10 (#869) * Feature request 415 for pdo_sqlsrv (#873) * Skipped some tests when running against Azure (#874) * Modified config files to add the compiler flag, /Qspectre (#878) * Merge the commit from master re survey image link (#880) * Fixed the flaws of decimal tests and added more debugging (#879) * Changed sample code to adhere to PSR standard (#887) * Decimal places for money types only (#886) * Version update for 5.5.0-preview (#889) * Fixed the error in the pdo decimal test (#890) * Removed warning messages while compiling extensions (#892) * Improve performance of Unicode conversions (#891) * Update sqlsrv_statement_format_money_scales.phpt Do not encrypt money / smallmoney fields in the test table * Change log 5.5.0-preview (#895) * updated docs for php 7.3 * Fixed broken links * Added back Ubuntu 18.10 ODBC instruction * Drop tests related to fake passwords (#905) * Initialize output param buffer when allocating extra space (#907) * Enable compiling extensions statically into PHP (#904) * Dropped dbname variable and set QUOTED_IDENTIFIER to ON (#911) * Skipped the non-applicables tests against Azure Data Warehouse (#913) * Support for Managed Identity for Azure resources (#875) * Changed version 5.6.0 (#918) * Initialize hasLoss before passing into Convert function (#919) * Added new tests for setting client buffer size related to issue 228 (#920) * Fixed load order issue in sqlsrv * Added source indexing for symbols (#922) * Modified linux and mac instructions for 5.6.0 RTW (#926) * Change log 5.6.0 (#921) * add Language option on connect * Updated AppVeyor to download ODBC driver 17.3 (#941) * Issue 937 - fixed ASSERT and added new tests (#940) * Changed travis to pull mcr.microsoft.com/mssql/server:2017-latest instead (#943) * Modified money tests to test the accuracies of floats (#944) * Fixed the returned values for PDOStatement::getColumnMeta (#946) * Onboarding to Azure Pipelines (#949) * Fixed the error in Issue 570 (#952) * Added a new status badge on readme (#953) * Added new tests for issue 569 (#951) * Fix issue 955 - errors building sqlsrv alone (#956) * Modified test_largeData for Linux CI (#954) * Issue 937 - fixed ASSERT and added new tests (#940) (cherry picked from commit 12d01c918966f5ff908adb25d5586944949b88be) * Fixed the returned values for PDOStatement::getColumnMeta (#946) (cherry picked from commit 7309fb90b18cd93940f28c6928f152404accb675) * Fix issue 955 - errors building sqlsrv alone (#956) (cherry picked from commit 15f61bd0b4e095978cddb2de9671f3d324fc17c3) * 5.6.1 hotfix * Updated change log * Tests modified for language option for SQL Azure (#963) * Update azure-pipelines.yml for Azure Pipelines [skip ci] (#964) * Added more checks for error conditions (#965) * Removed forward cursor condition * Added row and column count checks * Revert "Update azure-pipelines.yml for Azure Pipelines [skip ci] (#964)" (#969) This reverts commit 7d389e0cffa6840a95ea720673380f9ae0b2b477. * Add new pdo_sqlsrv tests for utf8 encoding errors (#966) * Modified to check if qualified for AE connections (#967) * Fixed test and error message * Minor fixes * Test fixes * Addressed review comments * Fixed test failure * Made Azure AD tests more robust (#973) * Addressed review comments * Issue 970: use quotes for variables (#971) * Added batch query test * Fixed 32 bit test failure * Addressed review comments * Formatting changes * Used different skipif conditions for these two tests that require AE connections (#977) * Simplified insert logic * Modified get column meta method to reference saved metadata (#978) * Revert "Used different skipif conditions for these two tests that require AE connections (#977)" (#980) This reverts commit ee3c85afa863eaff81512ad6399de572ffb943d9. * Fixed failing tests (#981) * Data Classification sensitivity metadata retrieval (#979) * Added more pdo tests to verify different error conditions (#984) * Fixed memory issues with data classification (#985) * Added connection string flag * Removed unix skipif * Fixed test output * Fixed pdo test * Changed flag name * Fixed test output * Updated links and versions (#987) (#988) * Fixed test output (again) * Fixed test output (again) * Fixed test output (again) * Replaced expected test output altogether * Fixed locale issue * Corrected formatting * Replaced EXPECTF with EXPECT * Fixed two failing tests (#991) * Redesigned some tests based on recent test results (#992) * Modified pipelines to connect using sqlcmd inside of the container instead (#995) * Added batch query * Added batch query test for pdo (#997) * Added a new test and modify a non LOB sqlsrv test (#1000) * Two index zval functions are macros in php 7.4 (#1001) * Replaced uint with size_t (#1004) * Check compiler version for php 74 (#1005) * Fixed tests that failed in php 7.4 (#1006) * Improve data caching with datetime objects (#1008) * Fixed for issues found by Semmle (#1011) * Removed unneeded constants * Fixed sqlsrv_free_stmt argument info * Fixed brace escape to avoid buffer overflow * Fixed brace escape and added test * Debugging test failure on Bamboo * Removed debugging output * Debugging test failure on Bamboo * Removed debugging output * Added more test cases * Changed range check to use strchr * Added pdo test * Fixed test and formatting * Addressed various issues with PHP 7.4 beta1 (#1015) * Updated dockerfile to use UB 18.04 and PHP 73 (#1016) * Added survey results (#1017) * Updated ODBC driver 17.4 (#1019) * Modified output.py to take a new argument and travis yml to use include for coveralls (#1020) * Used constants in memory stress tests for easier configuration (#1022) * Removed KSP related scripts and files (#1030) * Updated version to 5.7.0 preview (#1029) * Change log for 5.7.0 (#1028) * Modified how drivers handle query timeout settings (#1037) * Feature request: support extended string types (#1043) * Added the required file to ansi tests (#1047) * Always Encrypted v2 support (#1045) * Change to support ae-v2 * Add support for AE V2 * Added some descriptions and comments * Fixed PDO pattern matching * Updated key generation scripts * Fixed key script * Fixed char/nchar results, fixed formatting issues * Addressed review comments * Updated key scripts * Debugging aev2 keyword failure * Debugging aev2 keyword failure * Debugging aev2 keyword failure * Debugging aev2 keyword failure * Added skipif to ae v2 keyword test * Addressed review comments * Fixed braces and camel caps * Updated test descriptions * Added detail to test descriptions * Tiny change * Modified pdo tests to work with column encryption (#1051) * Saved php types with metadata when fetching (#1049) * Updated survey charts for Nov 2019 (#1057) * Updated all CIs (#1058) * Change log 5.7.1 preview (#1060) * Fix AKV keyword test for AE v2 behaviour (#1061) * Master (#936) 5.6.0 RTW * 5.6.1 hotfix (#959) * Updated links and versions (#987) * Fixed AKV keyword tests for AE v2 * Added comment * Free proc cache before starting test * Fixed comment * Update linux mac instructions for php 7.4 (#1062) * Updated appveyor yml to build 7.3 and 7.4 (#1065) * Fixes suggested by Semmle (#1068) * Fixes suggested by Semmle * Updated azure-pipelines * Added configurable options for setting locales (#1069) #1063 * Fixed the skipif wordings and styles (#1070) * Modified locale tests to work in both linux and mac (#1074) * Include sql_variant type for buffered queries (#1080) * Updated versions and year (#1082) * Change log for version 5.8.0 (#1083) * 5.8.0 rtw docs (#1086) * updated install instructions and changelog * removed md extensions * Addressed review comments * added path * Fixed link Co-authored-by: Jenny Tam <v-yitam@microsoft.com> Co-authored-by: Gert de Pagter <BackEndTea@users.noreply.github.com> Co-authored-by: Jannes Jeising <jannes@jeising.net> Co-authored-by: Guillaume Degoulet <34232764+gdegoulet@users.noreply.github.com>
2020-01-31 23:02:45 +01:00
if (!empty($info) and $info['value'] == 1 and $info['value_in_use'] == 1) {
2019-12-03 22:28:29 +01:00
$isEnclaveEnabled = true;
}
sqlsrv_query($conn, "DBCC FREEPROCCACHE");
}
unset($conn);
2018-05-09 01:16:27 +02:00
// Test every combination of the keywords above.
2018-05-18 21:24:37 +02:00
// Leave out good credentials to ensure that caching does not influence the
2018-05-09 01:16:27 +02:00
// results. The cache timeout can only be changed with SQLSetConnectAttr, so
// we can't run a PHP test without caching, and if we started with good
// credentials then subsequent calls with bad credentials can work, which
// would muddle the results of this test. Good credentials are tested in a
// separate test.
2018-05-18 23:05:18 +02:00
for ($i = 0; $i < sizeof($columnEncryption); ++$i) {
for ($j = 0; $j < sizeof($keyStoreAuthentication); ++$j) {
for ($k = 0; $k < sizeof($keyStorePrincipalId); ++$k) {
for ($m = 0; $m < sizeof($keyStoreSecret); ++$m) {
2018-05-18 21:24:37 +02:00
$connectionOptions = array("CharacterSet"=>"UTF-8",
"database"=>$databaseName,
"uid"=>$uid,
2018-05-06 02:08:01 +02:00
"pwd"=>$pwd,
"ConnectionPooling"=>0);
2018-05-18 23:05:18 +02:00
2018-05-18 21:24:37 +02:00
if (!empty($columnEncryption[$i])) {
2018-05-06 02:08:01 +02:00
$connectionOptions['ColumnEncryption'] = $columnEncryption[$i];
2018-05-18 21:24:37 +02:00
}
if (!empty($keyStoreAuthentication[$j])) {
2018-05-06 02:08:01 +02:00
$connectionOptions['KeyStoreAuthentication'] = $keyStoreAuthentication[$j];
2018-05-18 21:24:37 +02:00
}
if (!empty($keyStorePrincipalId[$k])) {
$connectionOptions['KeyStorePrincipalId'] = $keyStorePrincipalId[$k];
}
if (!empty($keyStoreSecret[$m])) {
2018-05-06 02:08:01 +02:00
$connectionOptions['KeyStoreSecret'] = $keyStoreSecret[$m];
2018-05-18 21:24:37 +02:00
}
2018-05-06 02:08:01 +02:00
// Valid credentials getting skipped
2018-05-18 23:05:18 +02:00
if (($i == 0 and $j == 0 and $k == 0 and $m == 0) or
($i == 0 and $j == 1 and $k == 1 and $m == 1)) {
2018-05-06 02:08:01 +02:00
continue;
}
// Connect to the AE-enabled database
// Failure is expected when the keyword combination is wrong
$conn = sqlsrv_connect($server, $connectionOptions);
2018-05-18 21:24:37 +02:00
if (!$conn) {
2018-05-06 02:08:01 +02:00
$errors = sqlsrv_errors();
2018-05-18 23:05:18 +02:00
2018-05-18 21:24:37 +02:00
checkErrors(
$errors,
array('08001','0'),
array('08001','-1'), // SSL error on some Linuxes
2018-05-18 21:24:37 +02:00
array('IMSSP','-110'),
array('IMSSP','-111'),
array('IMSSP','-112'),
2019-12-03 22:28:29 +01:00
array('IMSSP','-113'),
array('CE400','0')
2018-05-18 21:24:37 +02:00
);
} else {
2018-05-06 02:08:01 +02:00
$columns = array();
$insertQuery = "";
// Generate the INSERT query
2018-05-18 23:05:18 +02:00
formulateSetupQuery($tableName, $dataTypes, $columns, $insertQuery);
2018-05-06 02:08:01 +02:00
$stmt = AE\createTable($conn, $tableName, $columns);
if (!$stmt) {
fatalError("Failed to create table $tableName.\n");
}
// Duplicate all values for insertion - one is encrypted, one is not
$testValues = array();
2018-05-18 23:05:18 +02:00
for ($n = 0; $n < sizeof($small_values); ++$n) {
2018-05-06 02:08:01 +02:00
$testValues[] = $small_values[$n];
$testValues[] = $small_values[$n];
}
// Prepare the INSERT query
// This is never expected to fail
$stmt = sqlsrv_prepare($conn, $insertQuery, $testValues);
if ($stmt == false) {
print_r(sqlsrv_errors());
fatalError("sqlsrv_prepare failed.\n");
}
// Execute the INSERT query
// This is where we expect failure if the credentials are incorrect
if (sqlsrv_execute($stmt) == false) {
$errors = sqlsrv_errors();
2018-05-18 23:05:18 +02:00
2018-05-30 01:22:26 +02:00
if (!AE\isDataEncrypted()) {
2018-05-18 21:24:37 +02:00
checkErrors(
$errors,
array('CE258', '0'),
array('CE275', '0')
);
} else {
checkErrors(
$errors,
array('CE258', '0'),
array('CE275', '0'),
array('22018', '206')
);
}
2018-05-18 23:05:18 +02:00
2018-05-06 02:08:01 +02:00
sqlsrv_free_stmt($stmt);
2018-05-18 21:24:37 +02:00
} else {
2018-05-10 00:21:40 +02:00
// The INSERT query succeeded with bad credentials, which
2019-12-03 22:28:29 +01:00
// should only happen when 1. encryption is not enabled or
// 2. when ColumnEncryption is set to something other than
// enabled or disabled (i.e. $i == 2), and the server is
// not enclave-enabled
if (!(!AE\isDataEncrypted() or ($i == 2 and !$isEnclaveEnabled))) {
2018-05-18 21:24:37 +02:00
fatalError("Successful insertion with bad credentials\n");
}
2018-05-06 02:08:01 +02:00
}
2018-05-18 23:05:18 +02:00
2018-05-26 00:19:20 +02:00
// Drop the table and close the connection
dropTable($conn, $tableName);
2018-05-06 02:08:01 +02:00
sqlsrv_close($conn);
}
}
}
}
}
2018-05-09 01:16:27 +02:00
echo "Done.\n";
2018-05-06 02:08:01 +02:00
?>
--EXPECT--
2018-05-09 01:16:27 +02:00
Done.