Skip to content

Commit 06fe66c

Browse files
HCK-16062: SQLServer enctyption (#194)
* fix: updated column encryption resolving * chore: take `dbVersion` from `schemaData` * fix: provide `dbVersion` value in alterScript * chore: failsafe approach when hydrating schema without modelData
1 parent 87761e7 commit 06fe66c

11 files changed

Lines changed: 92 additions & 35 deletions

File tree

forward_engineering/ddlProvider.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,33 +208,42 @@ const ddlProvider = (baseProvider, options, app) => {
208208
},
209209

210210
convertColumnDefinition(columnDefinition) {
211+
const { name, persisted, computed, computedExpression, dbVersion } = columnDefinition;
212+
211213
const type = hasType(columnDefinition.type)
212214
? _.toUpper(columnDefinition.type)
213215
: getTableName(columnDefinition.type, columnDefinition.schemaName);
216+
214217
const notNull = columnDefinition.nullable ? '' : ' NOT NULL';
218+
215219
const primaryKey = columnDefinition.primaryKey
216220
? ' ' + createPKConstraint(templates, terminator, true)(columnDefinition.primaryKeyOptions).statement
217221
: '';
222+
218223
const defaultValue = getDefaultValue(columnDefinition.defaultConstraint, type);
224+
219225
const sparse = columnDefinition.sparse ? ' SPARSE' : '';
226+
220227
const maskedWithFunction = columnDefinition.maskedWithFunction
221228
? ` MASKED WITH (FUNCTION='${columnDefinition.maskedWithFunction}')`
222229
: '';
230+
223231
const identityContainer = columnDefinition.identity && { identity: getIdentity(columnDefinition.identity) };
232+
224233
const encryptedWith = _.isEmpty(columnDefinition.encryption)
225234
? ''
226-
: getEncryptedWith(columnDefinition.encryption[0]);
235+
: getEncryptedWith({ encryption: columnDefinition.encryption[0], dbVersion });
236+
227237
const unique = columnDefinition.unique
228238
? ' ' + createUKConstraint(templates, terminator, true)(columnDefinition.uniqueKeyOptions).statement
229239
: '';
240+
230241
const temporalTableTime = getTempTableTime(
231242
columnDefinition.isTempTableStartTimeColumn,
232243
columnDefinition.isTempTableEndTimeColumn,
233244
columnDefinition.isHidden,
234245
);
235246

236-
const { name, persisted, computed, computedExpression } = columnDefinition;
237-
238247
const statement =
239248
computed && computedExpression
240249
? this.createComputedColumn({
@@ -529,6 +538,7 @@ const ddlProvider = (baseProvider, options, app) => {
529538
increment: Number(_.get(jsonSchema, 'identity.identityIncrement', 0)),
530539
},
531540
}),
541+
dbVersion: schemaData.dbVersion,
532542
};
533543
},
534544

@@ -557,14 +567,15 @@ const ddlProvider = (baseProvider, options, app) => {
557567
};
558568
},
559569

560-
hydrateSchema(containerData, { procedures } = {}) {
570+
hydrateSchema(containerData, { procedures, modelData = [] } = {}) {
561571
return {
562572
schemaName: containerData.name,
563573
databaseName: containerData.databaseName,
564574
ifNotExist: containerData.ifNotExist,
565575
comment: containerData.role?.description ?? containerData.description,
566576
isActivated: containerData.isActivated,
567577
procedures: hydrateProcedures(procedures),
578+
dbVersion: modelData[0]?.dbVersion,
568579
};
569580
},
570581

forward_engineering/helpers/alterScriptHelpers/alterContainerHelper.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const alterContainerHelper = (app, options) => {
1111
udfs: containerData.role?.UDFs,
1212
procedures: containerData.role?.Procedures,
1313
useDb: false,
14+
modelData: [{ dbVersion: options.dbVersion }],
1415
});
1516

1617
return AlterScriptDto.getInstance([_.trim(ddlProvider.createSchema(schemaData))], true, false);

forward_engineering/helpers/alterScriptHelpers/alterEntityHelper.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const alterEntityHelper = (app, options) => {
1414
const { getRenameColumnScriptsDto } = require('./columnHelpers/renameColumnHelpers')(ddlProvider);
1515
const { getDefaultValueChangeDto } = require('./columnHelpers/defaultValueColumnHelper')(ddlProvider);
1616
const { getChangedComputedColumnsScriptsDto } = require('./columnHelpers/alterComputedColumnHelper')(ddlProvider);
17-
const { getChangeTypeScriptsDto } = require('./columnHelpers/alterTypeHelper')(ddlProvider);
17+
const { getChangeTypeScriptsDto } = require('./columnHelpers/alterTypeHelper')(ddlProvider, options);
1818
const { getModifyCheckConstraintScriptDtos } = require('./entityHelpers/checkConstraintHelper');
1919
const { getModifyPkConstraintsScriptDtos } = require('./entityHelpers/primaryKeyHelper');
2020
const { getModifyNonNullColumnsScriptDtos } = require('./columnHelpers/notNullConstraintsHelper');
@@ -28,7 +28,7 @@ const alterEntityHelper = (app, options) => {
2828
const getAddCollectionScriptDto = (collection, inlineDeltaRelationships) => {
2929
//done but need clean up
3030
const schemaName = collection.compMod.keyspaceName;
31-
const schemaData = { schemaName };
31+
const schemaData = { schemaName, dbVersion: options.dbVersion };
3232
const jsonSchema = { ...collection, ...collection?.role };
3333
const tableName = getEntityName(jsonSchema);
3434
const idToNameHashTable = generateIdToNameHashTable(jsonSchema);
@@ -116,7 +116,7 @@ const alterEntityHelper = (app, options) => {
116116
const getModifyCollectionScriptDto = collection => {
117117
const jsonSchema = { ...collection, ...collection?.role };
118118
const schemaName = collection.compMod?.keyspaceName;
119-
const schemaData = { schemaName };
119+
const schemaData = { schemaName, dbVersion: options.dbVersion };
120120
const idToNameHashTable = generateIdToNameHashTable(jsonSchema);
121121
const idToActivatedHashTable = generateIdToActivatedHashTable(jsonSchema);
122122
const modifyCheckConstraintScriptDtos = getModifyCheckConstraintScriptDtos(ddlProvider)(collection);
@@ -160,7 +160,7 @@ const alterEntityHelper = (app, options) => {
160160
const tableName = collectionSchema?.code || collectionSchema?.collectionName || collectionSchema?.name;
161161
const schemaName = collectionSchema.compMod?.keyspaceName;
162162
const fullName = getTableName(tableName, schemaName);
163-
const schemaData = { schemaName };
163+
const schemaData = { schemaName, dbVersion: options.dbVersion };
164164

165165
return _.toPairs(collection.properties)
166166
.filter(([name, jsonSchema]) => !jsonSchema.compMod)
@@ -221,13 +221,15 @@ const alterEntityHelper = (app, options) => {
221221
collection,
222222
collectionSchema,
223223
schemaName,
224+
options.dbVersion,
224225
);
225226
const modifiedDefaultValues = getDefaultValueChangeDto(collection, fullName);
226227
const changedComputedScriptsDtos = getChangedComputedColumnsScriptsDto({
227228
collection,
228229
fullName,
229230
collectionSchema,
230231
schemaName,
232+
dbVersion: options.dbVersion,
231233
});
232234

233235
return [

forward_engineering/helpers/alterScriptHelpers/alterScriptBuilder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const parseDataForEntityLevelScript = data => {
7575
const getEntityLevelAlterScriptDtos =
7676
(data, app) =>
7777
({ jsonSchema }) => {
78-
return getAlterScriptDtos(jsonSchema, app, data.options);
78+
return getAlterScriptDtos(jsonSchema, app, { ...data.options, dbVersion: data.modelData[0]?.dbVersion });
7979
};
8080

8181
/**

forward_engineering/helpers/alterScriptHelpers/alterUdtHelper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const alterUdtHelper = (app, options) => {
1616
const schemaNames = getSchemaNames(jsonSchema);
1717

1818
return Object.keys(schemaNames).map(schemaName => {
19-
const schemaData = { schemaName };
19+
const schemaData = { schemaName, dbVersion: options.dbVersion };
2020

2121
const udt = createColumnDefinitionBySchema({
2222
name: jsonSchema.code || jsonSchema.name,

forward_engineering/helpers/alterScriptHelpers/alterViewHelper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const alterViewHelper = (app, options) => {
1414
const viewSchema = { ...view, ...view.role };
1515
const idToNameHashTable = generateRefToNameHashTable(viewSchema);
1616
const idToActivatedHashTable = generateRefToActivatedHashTable(viewSchema);
17-
const schemaData = { schemaName: viewSchema.compMod.keyspaceName };
17+
const schemaData = { schemaName: viewSchema.compMod.keyspaceName, dbVersion: options.dbVersion };
1818

1919
const viewData = {
2020
name: viewSchema.code || viewSchema.name,
@@ -45,7 +45,7 @@ const alterViewHelper = (app, options) => {
4545
const viewSchema = { ...view, ...view.role };
4646
const idToNameHashTable = generateIdToNameHashTable(viewSchema);
4747
const idToActivatedHashTable = generateIdToActivatedHashTable(viewSchema);
48-
const schemaData = { schemaName: viewSchema.compMod.keyspaceName };
48+
const schemaData = { schemaName: viewSchema.compMod.keyspaceName, dbVersion: options.dbVersion };
4949
const viewData = {
5050
name: viewSchema.code || viewSchema.name,
5151
keys: getKeys(viewSchema, viewSchema.compMod?.collectionData?.collectionRefsDefinitionsMap ?? {}),

forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterComputedColumnHelper.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ const alterComputedColumnHelper = ddlProvider => {
3333
schemaName,
3434
toAddNotNull,
3535
toRemoveNotNull,
36+
dbVersion,
3637
}) => {
37-
const schemaData = { schemaName };
38+
const schemaData = { schemaName, dbVersion };
3839
const columnDefinition = createColumnDefinitionBySchema({
3940
name: columnName,
4041
jsonSchema,
@@ -65,7 +66,7 @@ const alterComputedColumnHelper = ddlProvider => {
6566
return sqlScripts;
6667
};
6768

68-
const getChangedComputedColumnsScriptsDto = ({ collection, fullName, collectionSchema, schemaName }) => {
69+
const getChangedComputedColumnsScriptsDto = ({ collection, fullName, collectionSchema, schemaName, dbVersion }) => {
6970
return _.toPairs(collection.properties)
7071
.reduce((result, [columnName, jsonSchema]) => {
7172
const oldJsonSchema = _.omit(collection.role?.properties?.[columnName], ['compMod']);
@@ -90,6 +91,7 @@ const alterComputedColumnHelper = ddlProvider => {
9091
schemaName,
9192
toAddNotNull,
9293
toRemoveNotNull,
94+
dbVersion,
9395
}),
9496
);
9597

forward_engineering/helpers/alterScriptHelpers/columnHelpers/alterTypeHelper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ const { AlterScriptDto } = require('../types/AlterScriptDto');
33
const { checkFieldPropertiesChanged } = require('../common');
44
const { createColumnDefinitionBySchema } = require('./createColumnDefinition');
55

6-
const alterTypeHelper = ddlProvider => {
6+
const alterTypeHelper = (ddlProvider, options) => {
77
const getChangeTypeScriptsDto = (collectionProperties, fullName, collectionSchema, schemaName) => {
8-
const schemaData = { schemaName };
8+
const schemaData = { schemaName, dbVersion: options.dbVersion };
99

1010
return _.toPairs(collectionProperties)
1111
.filter(([name, jsonSchema]) => checkFieldPropertiesChanged(jsonSchema.compMod, ['type', 'mode']))

forward_engineering/helpers/alterScriptHelpers/columnHelpers/notNullConstraintsHelper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ const { createColumnDefinitionBySchema } = require('./createColumnDefinition');
66
/**
77
* @return {(collection: Collection) => AlterScriptDto[]}
88
* */
9-
const getModifyNonNullColumnsScriptDtos = ddlProvider => (collection, collectionSchema, schemaName) => {
9+
const getModifyNonNullColumnsScriptDtos = ddlProvider => (collection, collectionSchema, schemaName, dbVersion) => {
1010
const fullTableName = getFullTableName(collection);
11-
const schemaData = { schemaName };
11+
const schemaData = { schemaName, dbVersion };
1212

1313
const currentRequiredColumnNames = collection.required || [];
1414
const previousRequiredColumnNames = collection.role.required || [];

forward_engineering/helpers/columnDefinitionHelper.js

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,33 @@ const addClustered = (statement, columnDefinition) => {
9696
return statement + ' CLUSTERED';
9797
};
9898

99-
const getEncryptedWith = encryption => {
100-
return (
101-
' ENCRYPTED WITH (\n' +
102-
'\t\tCOLUMN_ENCRYPTION_KEY=' +
103-
encryption.key +
104-
',\n' +
105-
'\t\tENCRYPTION_TYPE=' +
106-
encryption.type +
107-
',\n' +
108-
"\t\tALGORITHM='" +
109-
encryption.algorithm +
110-
"'\n" +
111-
'\t)'
112-
);
99+
const getEncryptedWith = ({ encryption, dbVersion }) => {
100+
const { key, type, algorithm } = encryption;
101+
102+
if (!key || !type) {
103+
return '';
104+
}
105+
106+
// must be in sync with ENCRYPTION_ALGORITHM dependency of fieldLevelConfig
107+
const noAlgorithmDbVersions = ['2008', '2012', '2014'];
108+
const hasAlgorithm = !noAlgorithmDbVersions.includes(dbVersion);
109+
110+
if (hasAlgorithm && !algorithm) {
111+
return '';
112+
}
113+
114+
const blockIndentation = '\n\t\t';
115+
116+
let script = ` ENCRYPTED WITH (`;
117+
118+
script += `${blockIndentation}COLUMN_ENCRYPTION_KEY=${key}`;
119+
script += `,${blockIndentation}ENCRYPTION_TYPE=${type}`;
120+
121+
if (hasAlgorithm) {
122+
script += `,${blockIndentation}ALGORITHM='${algorithm}'`;
123+
}
124+
125+
return `${script}\n\t)`;
113126
};
114127

115128
const getColumnsComments = (tableName, terminator, columnDefinitions) => {

0 commit comments

Comments
 (0)