-
Notifications
You must be signed in to change notification settings - Fork 32
Audit log support #806
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Audit log support #806
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
61c8438
Send audit log event to audit service when deployment is success
sandeep-paliwal 1970d2f
remove test endpoint
sandeep-paliwal 042344e
Minor code fixes and unit tests
sandeep-paliwal 1c1f7e3
Update service endpoints
sandeep-paliwal c06cb0a
adding deploy and undeploy activity event
06de916
adding deploy and undeploy activity event
5853d73
resetting accidental changes
827ee96
added deploy undeploy for actions and web assets
4fbe335
Merge branch 'master' into audit-log-support
shazron 6973575
final changes
51750d5
added more tests
dde2758
added lint
44ecf8e
added lint
adac824
fixed failing test cases
69fb6ce
100% code coverage added
19d61a1
Merge branch 'master' of github.com:adobe/aio-cli-plugin-app into aud…
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
/* | ||
Copyright 2024 Adobe. All rights reserved. | ||
This file is licensed to you 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 REPRESENTATIONS | ||
OF ANY KIND, either express or implied. See the License for the specific language | ||
governing permissions and limitations under the License. | ||
*/ | ||
const fetch = require('node-fetch') | ||
const fs = require('fs') | ||
const path = require('path') | ||
const chalk = require('chalk') | ||
|
||
const OPERATIONS = { | ||
AB_APP_DEPLOY: 'ab_app_deploy', | ||
AB_APP_UNDEPLOY: 'ab_app_undeploy', | ||
AB_APP_TEST: 'ab_app_test', // todo : remove after testing | ||
AB_APP_ASSETS_DEPLOYED: 'ab_app_assets_deployed', | ||
AB_APP_ASSETS_UNDEPLOYED: 'ab_app_assets_undeployed' | ||
} | ||
|
||
const AUDIT_SERVICE_ENPOINTS = { | ||
stage: 'https://adp-auditlog-service-stage.adobeioruntime.net/api/v1/web/audit-log-api/event-post', | ||
prod: 'https://adp-auditlog-service-prod.adobeioruntime.net/api/v1/web/audit-log-api/event-post' | ||
} | ||
|
||
/** | ||
* Send audit log events to audit service | ||
* @param {string} accessToken valid access token | ||
* @param {object} logEvent logEvent details | ||
* @param {string} env valid env stage|prod | ||
*/ | ||
async function sendAuditLogs (accessToken, logEvent, env = 'prod') { | ||
const url = AUDIT_SERVICE_ENPOINTS[env] | ||
const payload = { | ||
event: logEvent | ||
} | ||
const options = { | ||
method: 'POST', | ||
headers: { | ||
Authorization: 'Bearer ' + accessToken, | ||
'Content-type': 'application/json' | ||
}, | ||
body: JSON.stringify(payload) | ||
} | ||
const response = await fetch(url, options) | ||
if (response.status !== 200) { | ||
const err = await response.text() | ||
throw new Error('Failed to send audit log - ' + response.status + ' ' + err) | ||
} | ||
} | ||
|
||
/** | ||
* | ||
* @param {object} flags cli flags | ||
* @param {object} project details | ||
* @param {string} event log name | ||
* @returns {object} logEvent | ||
*/ | ||
function getAuditLogEvent (flags, project, event) { | ||
let logEvent, logStrMsg | ||
if (project && project.org && project.workspace) { | ||
if (event === 'AB_APP_DEPLOY') { | ||
logStrMsg = `Starting deployment for the App Builder application in workspace ${project.workspace.name}` | ||
} else if (event === 'AB_APP_UNDEPLOY') { | ||
logStrMsg = `Starting undeployment for the App Builder application in workspace ${project.workspace.name}` | ||
} else if (event === 'AB_APP_ASSETS_UNDEPLOYED') { | ||
logStrMsg = `All static assets for the App Builder application in workspace: ${project.workspace.name} were successfully undeployed from the CDN` | ||
} else if (event === 'AB_APP_ASSETS_DEPLOYED') { | ||
logStrMsg = `All static assets for the App Builder application in workspace: ${project.workspace.name} were successfully deployed to the CDN.\n Files deployed - ` | ||
} | ||
|
||
logEvent = { | ||
orgId: project.org.id, | ||
projectId: project.id, | ||
workspaceId: project.workspace.id, | ||
workspaceName: project.workspace.name, | ||
operation: event in OPERATIONS ? OPERATIONS[event] : OPERATIONS.AB_APP_TEST, | ||
timestamp: new Date().valueOf(), | ||
data: { | ||
cliCommandFlags: flags, | ||
opDetailsStr: logStrMsg | ||
} | ||
} | ||
} | ||
return logEvent | ||
} | ||
|
||
/** | ||
* | ||
* @param {string} directory | path to assets directory | ||
* @returns {Array} log | array of log messages | ||
*/ | ||
function getFilesCountWithExtension (directory) { | ||
const log = [] | ||
|
||
if (!fs.existsSync(directory)) { | ||
this.log(chalk.red(chalk.bold(`Error: Directory ${directory} does not exist.`))) | ||
return log | ||
} | ||
|
||
const files = fs.readdirSync(directory) | ||
|
||
if (files.length === 0) { | ||
this.log(chalk.red(chalk.bold(`Error: No files found in directory ${directory}.`))) | ||
return log | ||
} | ||
|
||
const fileTypeCounts = {} | ||
|
||
files.forEach(file => { | ||
const ext = path.extname(file).toLowerCase() || 'no extension' | ||
if (fileTypeCounts[ext]) { | ||
fileTypeCounts[ext]++ | ||
} else { | ||
fileTypeCounts[ext] = 1 | ||
} | ||
}) | ||
|
||
Object.keys(fileTypeCounts).forEach(ext => { | ||
const count = fileTypeCounts[ext] | ||
let description | ||
|
||
if (ext === '.js') description = 'Javascript file(s)' | ||
else if (ext === '.css') description = 'CSS file(s)' | ||
else if (ext === '.html') description = 'HTML page(s)' | ||
else if (['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp'].includes(ext)) description = 'image(s)' | ||
else if (ext === 'no extension') description = 'file(s) without extension' | ||
else description = `${ext} file(s)` | ||
|
||
log.push(`${count} ${description}\n`) | ||
}) | ||
|
||
return log | ||
} | ||
|
||
module.exports = { | ||
sendAuditLogs, | ||
getAuditLogEvent, | ||
AUDIT_SERVICE_ENPOINTS, | ||
getFilesCountWithExtension | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This could be null, what do you do if your not passed 'prod' or 'stage'
You should just default to prod ...