From ab06820eb2504dfbf89db85d0a50197de9fdc875 Mon Sep 17 00:00:00 2001 From: dinesh-crest <127284636+dinesh-crest@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:54:31 +0530 Subject: [PATCH] DLP: Added samples for inspect image file (#3353) Added unit test cases for same Co-authored-by: Patti Shin --- dlp/inspectImageFile.js | 102 +++++++++++++++++++++++++ dlp/inspectImageFileListedInfoTypes.js | 101 ++++++++++++++++++++++++ dlp/system-test/inspect.test.js | 42 ++++++++++ 3 files changed, 245 insertions(+) create mode 100644 dlp/inspectImageFile.js create mode 100644 dlp/inspectImageFileListedInfoTypes.js diff --git a/dlp/inspectImageFile.js b/dlp/inspectImageFile.js new file mode 100644 index 0000000000..8e6c03c0cd --- /dev/null +++ b/dlp/inspectImageFile.js @@ -0,0 +1,102 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// sample-metadata: +// title: Inspects a image file. +// description: Inspect a image for sensitive data like Phone Number, Email. +// usage: node inspectImageFile.js.js my-project imagePath infoTypes +function main(projectId, imagePath) { + // [START dlp_inspect_image_file] + // Imports the Google Cloud Data Loss Prevention library + const DLP = require('@google-cloud/dlp'); + const mime = require('mime'); + const fs = require('fs'); + + // Instantiates a client + const dlp = new DLP.DlpServiceClient(); + + // The project ID to run the API call under + // const imagePath = './test.jpeg'; + + // InfoTypes + const infoTypes = [ + {name: 'PHONE_NUMBER'}, + {name: 'EMAIL_ADDRESS'}, + {name: 'CREDIT_CARD_NUMBER'}, + ]; + + async function inspectImageFile() { + let fileBytes = null; + let fileTypeConstant = null; + try { + // Load Image + fileTypeConstant = + ['image/jpeg', 'image/bmp', 'image/png', 'image/svg'].indexOf( + mime.getType(imagePath) + ) + 1; + fileBytes = Buffer.from(fs.readFileSync(imagePath)).toString('base64'); + } catch (error) { + console.log(error); + return; + } + + // Specify item to inspect + const item = { + byteItem: { + type: fileTypeConstant, + data: fileBytes, + }, + }; + + // Specify inspect configuration to match information with mentioned infotypes. + const inspectConfig = { + infoTypes: infoTypes, + includeQuote: true, + }; + + // Combine configurations into a request for the service. + const request = { + parent: `projects/${projectId}/locations/global`, + inspectConfig: inspectConfig, + item: item, + }; + + // Use the client to send the request. + const [response] = await dlp.inspectContent(request); + + // Print Findings + const findings = response.result.findings; + if (findings.length > 0) { + console.log(`Findings: ${findings.length}\n`); + findings.forEach(finding => { + console.log(`InfoType: ${finding.infoType.name}`); + console.log(`\tQuote: ${finding.quote}`); + console.log(`\tLikelihood: ${finding.likelihood} \n`); + }); + } else { + console.log('No findings.'); + } + } + inspectImageFile(); + // [END dlp_inspect_image_file] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/dlp/inspectImageFileListedInfoTypes.js b/dlp/inspectImageFileListedInfoTypes.js new file mode 100644 index 0000000000..4789ee0e3b --- /dev/null +++ b/dlp/inspectImageFileListedInfoTypes.js @@ -0,0 +1,101 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// sample-metadata: +// title: Inspects a image file. +// description: Inspect a image for certain built-in infoTypes. +// usage: node inspectImageFileListedInfoTypes.js my-project imagePath infoTypes +function main(projectId, imagePath) { + // [START dlp_inspect_image_listed_infotypes] + // Imports the Google Cloud Data Loss Prevention library + const DLP = require('@google-cloud/dlp'); + const mime = require('mime'); + const fs = require('fs'); + + // Instantiates a client + const dlp = new DLP.DlpServiceClient(); + + // The project ID to run the API call under + // const imagePath = './test.pdf'; + + // InfoTypes + const infoTypes = [ + {name: 'PHONE_NUMBER'}, + {name: 'EMAIL_ADDRESS'}, + {name: 'US_SOCIAL_SECURITY_NUMBER'}, + ]; + + async function inspectImageFileListedInfoTypes() { + let fileBytes = null; + let fileTypeConstant = null; + try { + // Load Image + fileTypeConstant = + ['image/jpeg', 'image/bmp', 'image/png', 'image/svg'].indexOf( + mime.getType(imagePath) + ) + 1; + fileBytes = Buffer.from(fs.readFileSync(imagePath)).toString('base64'); + } catch (error) { + console.log(error); + return; + } + // Specify item to inspect + const item = { + byteItem: { + type: fileTypeConstant, + data: fileBytes, + }, + }; + + // Specify inspect configuration to match information with mentioned infotypes. + const inspectConfig = { + infoTypes: infoTypes, + includeQuote: true, + }; + + // Combine configurations into a request for the service. + const request = { + parent: `projects/${projectId}/locations/global`, + inspectConfig: inspectConfig, + item: item, + }; + + // Use the client to send the request. + const [response] = await dlp.inspectContent(request); + + // Print Findings + const findings = response.result.findings; + if (findings.length > 0) { + console.log(`Findings: ${findings.length}\n`); + findings.forEach(finding => { + console.log(`InfoType: ${finding.infoType.name}`); + console.log(`\tQuote: ${finding.quote}`); + console.log(`\tLikelihood: ${finding.likelihood} \n`); + }); + } else { + console.log('No findings.'); + } + } + inspectImageFileListedInfoTypes(); + // [END dlp_inspect_image_listed_infotypes] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/dlp/system-test/inspect.test.js b/dlp/system-test/inspect.test.js index a7e62e2286..37aa5900df 100644 --- a/dlp/system-test/inspect.test.js +++ b/dlp/system-test/inspect.test.js @@ -906,4 +906,46 @@ describe('inspect', () => { } assert.include(output, 'INVALID_ARGUMENT'); }); + + // dlp_inspect_image_file + it('should inspect a image file for matching infoTypes', () => { + const output = execSync( + `node inspectImageFile.js ${projectId} "resources/test.png"` + ); + assert.match(output, /Findings: 2/); + assert.match(output, /InfoType: EMAIL_ADDRESS/); + assert.match(output, /InfoType: PHONE_NUMBER/); + }); + + it('should report any error while inspecting a image file', () => { + let output; + try { + output = execSync(`node inspectImageFile.js ${projectId} INVALID_PATH`); + } catch (err) { + output = err.message; + } + assert.include(output, 'INVALID_PATH'); + }); + + // dlp_inspect_image_listed_infotypes + it('should inspect a image file for matching infoTypes', () => { + const output = execSync( + `node inspectImageFileListedInfoTypes.js ${projectId} "resources/test.png"` + ); + assert.match(output, /Findings: 2/); + assert.match(output, /InfoType: EMAIL_ADDRESS/); + assert.match(output, /InfoType: PHONE_NUMBER/); + }); + + it('should report any error while inspecting a image file', () => { + let output; + try { + output = execSync( + `node inspectImageFileListedInfoTypes.js ${projectId} INVALID_PATH` + ); + } catch (err) { + output = err.message; + } + assert.include(output, 'INVALID_PATH'); + }); });