Merge branch 'main' into PAM-69

This commit is contained in:
x032205
2025-12-10 18:43:25 -05:00
2 changed files with 27 additions and 21 deletions

View File

@@ -71,23 +71,29 @@ export const pamFolderDALFactory = (db: TDbClient) => {
const findByPath = async (projectId: string, path: string, tx?: Knex) => {
try {
const dbInstance = tx || db.replicaNode();
const folders = await dbInstance(TableName.PamFolder)
.where(`${TableName.PamFolder}.projectId`, projectId)
.select(selectAllTableCols(TableName.PamFolder));
const pathSegments = path.split("/").filter(Boolean);
if (pathSegments.length === 0) {
return undefined;
}
const foldersByParentId = new Map<string | null, typeof folders>();
for (const folder of folders) {
const children = foldersByParentId.get(folder.parentId ?? null) ?? [];
children.push(folder);
foldersByParentId.set(folder.parentId ?? null, children);
}
let parentId: string | null = null;
let currentFolder: Awaited<ReturnType<typeof orm.findOne>> | undefined;
let currentFolder: (typeof folders)[0] | undefined;
for await (const segment of pathSegments) {
const query = dbInstance(TableName.PamFolder)
.where(`${TableName.PamFolder}.projectId`, projectId)
.where(`${TableName.PamFolder}.name`, segment);
if (parentId) {
void query.where(`${TableName.PamFolder}.parentId`, parentId);
} else {
void query.whereNull(`${TableName.PamFolder}.parentId`);
}
currentFolder = await query.first();
for (const segment of pathSegments) {
const childFolders: typeof folders = foldersByParentId.get(parentId) || [];
currentFolder = childFolders.find((folder) => folder.name === segment);
if (!currentFolder) {
return undefined;

View File

@@ -28,26 +28,26 @@ export const PamSessionLogsSection = ({ session }: Props) => {
const hasLogs = session.logs.length > 0;
return (
<div className="border-mineshaft-600 bg-mineshaft-900 flex h-full w-full flex-col gap-4 rounded-lg border p-4">
<div className="border-mineshaft-400 flex items-center border-b pb-4">
<h3 className="text-mineshaft-100 text-lg font-medium">Session Logs</h3>
<div className="flex h-full w-full flex-col gap-4 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="flex items-center border-b border-mineshaft-400 pb-4">
<h3 className="text-lg font-medium text-mineshaft-100">Session Logs</h3>
</div>
{isDatabaseSession && hasLogs && <CommandLogView logs={session.logs as TPamCommandLog[]} />}
{isSSHSession && hasLogs && <TerminalEventView events={session.logs as TTerminalEvent[]} />}
{isHttpSession && hasLogs && <HttpEventView events={session.logs as THttpEvent[]} />}
{isAwsIamSession && (
<div className="text-bunker-300 flex grow items-center justify-center">
<div className="flex grow items-center justify-center text-bunker-300">
<div className="text-center">
<div className="mb-2">AWS Console session activity is logged in AWS CloudTrail</div>
<div className="text-bunker-400 text-xs">
<div className="text-xs text-bunker-400">
View detailed activity logs for this session in your AWS CloudTrail console.
<br />
<a
href="https://console.aws.amazon.com/cloudtrail"
target="_blank"
rel="noopener noreferrer"
className="text-primary-400 hover:text-primary-300 mt-2 inline-flex items-center gap-1"
className="mt-2 inline-flex items-center gap-1 text-primary-400 hover:text-primary-300"
>
Open AWS CloudTrail
<FontAwesomeIcon icon={faUpRightFromSquare} className="size-3" />
@@ -57,10 +57,10 @@ export const PamSessionLogsSection = ({ session }: Props) => {
</div>
)}
{!hasLogs && !isAwsIamSession && (
<div className="text-bunker-300 flex grow items-center justify-center">
<div className="flex grow items-center justify-center text-bunker-300">
<div className="text-center">
<div className="mb-2">Session logs are not yet available</div>
<div className="text-bunker-400 text-xs">
<div className="text-xs text-bunker-400">
Logs will be uploaded after the session duration has elapsed.
<br />
If logs do not appear after some time, please contact your Gateway administrators.