Skip to content
This repository was archived by the owner on Oct 20, 2023. It is now read-only.

Commit 5440f9b

Browse files
committed
Release 0.9.4
1 parent 4cc3c1c commit 5440f9b

File tree

8 files changed

+219
-202
lines changed

8 files changed

+219
-202
lines changed

Dockerfile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ FROM node:18-bullseye as redeye-builder
33
WORKDIR /app
44
COPY ./ ./
55
ENV CYPRESS_INSTALL_BINARY=0
6-
RUN npm install -g pkg
7-
RUN yarn add rimraf
6+
RUN npm install -g pkg rimraf
87
RUN yarn install --immutable --inline-builds
98
RUN yarn moon run server:build client:build
10-
RUN yarn node scripts/create-release.mjs
9+
RUN bash create-release.sh
1110
RUN tar -zcvf release.tar.gz ./release/
1211
RUN mkdir outputs
1312
RUN cp release.tar.gz outputs/release.tar.gz

applications/client/src/store/campaign/presentation.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { CampaignViews } from '@redeye/client/types';
2-
import type { UUID } from '@redeye/client/types/uuid';
32
import { computed } from 'mobx';
43
import { ExtendedModel, model, modelAction } from 'mobx-keystone';
54
import type { PresentationCommandGroupModel, PresentationItemModel } from '../graphql';

applications/client/src/views/Campaigns/Upload/NewCampaignDialog.tsx

Lines changed: 35 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import type { OptionProps } from '@blueprintjs/core';
22
import { Divider, FormGroup, HTMLSelect } from '@blueprintjs/core';
33
import { css } from '@emotion/react';
4-
import { DialogEx, ErrorFallback } from '@redeye/client/components';
4+
import { DialogEx, ErrorFallback, createState } from '@redeye/client/components';
55
import { RedEyeDbUploadForm } from '@redeye/client/views';
66
import { CoreTokens, ExternalLink, Header, Txt } from '@redeye/ui-styles';
77
import { observer } from 'mobx-react-lite';
88
import type { ComponentProps } from 'react';
9-
import { useMemo, useState } from 'react';
109
import { ErrorBoundary } from 'react-error-boundary';
1110
import type { ParserInfoModel } from '../../../store';
1211
import { useStore } from '../../../store';
@@ -21,41 +20,38 @@ const SOURCE_UNSET = '';
2120

2221
export const NewCampaignDialog = observer<NewCampaignDialogProps>(({ ...props }) => {
2322
const store = useStore();
24-
const [currentUploadOptionValue, setCurrentUploadOptionValue] = useState(SOURCE_UNSET);
23+
const state = createState({
24+
currentUploadOptionValue: SOURCE_UNSET as string,
25+
get uploadOptions() {
26+
const options: (OptionProps & {
27+
parserInfo?: ParserInfoModel;
28+
})[] = [
29+
{
30+
label: 'Select Source',
31+
value: SOURCE_UNSET,
32+
disabled: true,
33+
},
34+
];
2535

26-
const uploadOptions = useMemo(() => {
27-
const options: (OptionProps & {
28-
parserInfo?: ParserInfoModel;
29-
})[] = [
30-
{
31-
label: 'Select Source',
32-
value: SOURCE_UNSET,
33-
disabled: true,
34-
},
35-
];
36-
37-
options.push(
38-
...Array.from(store.graphqlStore.parserInfos.values())
39-
.sort((a) => (a.name.includes('Cobalt') ? -1 : 1))
40-
.map((parserInfo) => ({
36+
options.push(
37+
...Array.from(store.graphqlStore.parserInfos.values(), (parserInfo) => ({
4138
label: parserInfo?.uploadForm?.tabTitle,
4239
value: parserInfo.id,
4340
parserInfo,
44-
}))
45-
);
46-
47-
options.push({
48-
label: '.redeye file',
49-
value: 'redeye-file',
50-
});
41+
})).sort((a) => (a.parserInfo.name.toLowerCase().includes('cobalt') ? -1 : 1))
42+
);
5143

52-
return options;
53-
}, [store.graphqlStore.parserInfos.values()]);
44+
options.push({
45+
label: '.redeye file',
46+
value: 'redeye-file',
47+
});
5448

55-
const selectedUploadOption = useMemo(
56-
() => uploadOptions.find((option) => option.value === currentUploadOptionValue),
57-
[uploadOptions, currentUploadOptionValue]
58-
);
49+
return options;
50+
},
51+
get selectedUploadOption() {
52+
return this.uploadOptions.find((option) => option.value === this.currentUploadOptionValue);
53+
},
54+
});
5955

6056
return (
6157
<DialogEx
@@ -73,24 +69,24 @@ export const NewCampaignDialog = observer<NewCampaignDialogProps>(({ ...props })
7369
<FormGroup css={{ padding: '1rem 1.5rem 1.5rem 1.5rem', margin: 0 }} label="Source">
7470
<HTMLSelect
7571
cy-test="create-new-camp" // <- was {`create-new-camp-${parserInfo.id}`}
76-
value={currentUploadOptionValue}
77-
css={!currentUploadOptionValue && htmlSelectPlaceholderStyle}
78-
options={uploadOptions}
79-
onChange={(e) => setCurrentUploadOptionValue(e.target.value)}
72+
value={state.currentUploadOptionValue}
73+
css={!state.currentUploadOptionValue && htmlSelectPlaceholderStyle}
74+
options={state.uploadOptions}
75+
onChange={(e) => state.update('currentUploadOptionValue', e.target.value)}
8076
fill
8177
large
8278
/>
8379
</FormGroup>
8480
<Divider css={{ margin: '0 1.5rem' }} />
85-
{currentUploadOptionValue === SOURCE_UNSET ? (
81+
{state.currentUploadOptionValue === SOURCE_UNSET ? (
8682
<div css={{ padding: '1.5rem' }}>
8783
<Txt italic muted>
8884
Select an import source to continue
8985
</Txt>
9086
</div>
91-
) : selectedUploadOption?.parserInfo == null ? (
87+
) : state.selectedUploadOption?.parserInfo == null ? (
9288
<RedEyeDbUploadForm onClose={props.onClose} />
93-
) : !selectedUploadOption?.parserInfo?.uploadForm?.enabledInBlueTeam && store.appMeta.blueTeam ? (
89+
) : !state.selectedUploadOption?.parserInfo?.uploadForm?.enabledInBlueTeam && store.appMeta.blueTeam ? (
9490
<div css={{ padding: '1.5rem' }}>
9591
<Txt cy-test="bt-warning" running>
9692
This upload source is not available in BlueTeam mode.
@@ -101,7 +97,7 @@ export const NewCampaignDialog = observer<NewCampaignDialogProps>(({ ...props })
10197
</Txt>
10298
</div>
10399
) : (
104-
<ParserUploadForm parserInfo={selectedUploadOption?.parserInfo} onClose={props.onClose} />
100+
<ParserUploadForm parserInfo={state.selectedUploadOption?.parserInfo} onClose={props.onClose} />
105101
)}
106102
</div>
107103
</ErrorBoundary>

applications/server/src/store/presentation-resolvers.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { EntityManager } from '@mikro-orm/core';
22
import { Arg, Authorized, Ctx, Field, InputType, ObjectType, Query, Resolver, registerEnumType } from 'type-graphql';
3-
import { CommandGroup, Link, Server, Tag } from '@redeye/models';
3+
import { CommandGroup, GenerationType, Link, Server, Tag } from '@redeye/models';
44
import { beaconHidden } from './utils/hidden-entities-helper';
55
import { connectToProjectEmOrFail } from './utils/project-db';
66
import type { GraphQLContext } from '../types';
@@ -304,7 +304,10 @@ export class PresentationResolvers {
304304
// procedural comments
305305
const proceduralComments = await em.find(
306306
CommandGroup,
307-
{ annotations: { generation: 'PROCEDURAL' }, ...(!hidden ? { commands: { ...beaconHidden(hidden) } } : {}) },
307+
{
308+
annotations: { generation: GenerationType.PROCEDURAL },
309+
...(!hidden ? { commands: { ...beaconHidden(hidden) } } : {}),
310+
},
308311
{
309312
populate: ['commands', 'annotations'],
310313
orderBy,
@@ -336,7 +339,10 @@ export class PresentationResolvers {
336339
let commandsByUser: PresentationItem[] = [];
337340
const manualComments = await em.find(
338341
CommandGroup,
339-
{ annotations: { generation: 'MANUAL' }, ...(!hidden ? { commands: { ...beaconHidden(hidden) } } : {}) },
342+
{
343+
annotations: { generation: GenerationType.MANUAL },
344+
...(!hidden ? { commands: { ...beaconHidden(hidden) } } : {}),
345+
},
340346
{
341347
populate: ['commands', 'annotations'],
342348
orderBy,

create-release.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
platforms=(mac linux windows)
2+
parsers=(sliver brute-ratel cobalt-strike)
3+
4+
for platform in "${platforms[@]}"; do
5+
echo "Creating server release for $platform"
6+
pkg applications/server/package.json -t node18-$platform-x64 -o release/RedEye-$platform/RedEye
7+
for parser in "${parsers[@]}"; do
8+
echo "Creating $parser release for $platform"
9+
pkg parsers/$parser-parser/package.json -t node18-$platform-x64 -o release/RedEye-$platform/parsers/$parser-parser
10+
done
11+
done
12+

package.json

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "redeye",
33
"productName": "RedEye",
4-
"version": "0.9.3",
4+
"version": "0.9.4",
55
"private": true,
66
"workspaces": [
77
"applications/**",
@@ -35,10 +35,10 @@
3535
"cy:open": "yarn moon run @redeye/e2e:open-cy",
3636
"cy:open-blue": "yarn moon run @redeye/e2e:open-cy-blue",
3737
"start:blue": "SERVER_BLUE_TEAM=true yarn run start:dev",
38-
"release:all": "yarn moon run server:release-all && yarn moon run cobalt-strike-parser:release-all && yarn moon run brute-ratel-parser:release-all",
39-
"release:mac": "yarn moon run server:release-mac && yarn moon run cobalt-strike-parser:release-mac && yarn moon run brute-ratel-parser:release-mac",
40-
"release:linux": "yarn moon run server:release-linux && yarn moon run cobalt-strike-parser:release-linux && yarn moon run brute-ratel-parser:release-linux",
41-
"release:windows": "yarn moon run server:release-windows && yarn moon run cobalt-strike-parser:release-windows && yarn moon run brute-ratel-parser:release-windows"
38+
"release:all": "yarn node ./scripts/create-release.mjs",
39+
"release:mac": "yarn node ./scripts/create-release.mjs --os mac",
40+
"release:linux": "yarn node ./scripts/create-release.mjs --os linux",
41+
"release:windows": "yarn node ./scripts/create-release.mjs --os windows"
4242
},
4343
"dependencies": {
4444
"@apollo/server": "^4.7.0",
@@ -49,8 +49,8 @@
4949
"@emotion/react": "^11.4.0",
5050
"@emotion/styled": "^11.3.0",
5151
"@fontsource/redacted-script": "^4.5.13",
52-
"@mikro-orm/better-sqlite": "5.6.16",
53-
"@mikro-orm/core": "5.6.16",
52+
"@mikro-orm/better-sqlite": "5.8.4",
53+
"@mikro-orm/core": "5.8.4",
5454
"@openfonts/ibm-plex-mono_all": "^1.44.2",
5555
"@openfonts/ibm-plex-sans_all": "^1.44.2",
5656
"@tanstack/react-query": "^4.1.3",
@@ -109,9 +109,9 @@
109109
"@babel/plugin-proposal-decorators": "^7.20.13",
110110
"@changesets/cli": "^2.22.0",
111111
"@emotion/babel-plugin": "^11.10.0",
112-
"@mikro-orm/entity-generator": "5.6.16",
113-
"@mikro-orm/migrations": "5.6.16",
114-
"@mikro-orm/seeder": "5.6.16",
112+
"@mikro-orm/entity-generator": "5.8.4",
113+
"@mikro-orm/migrations": "5.8.4",
114+
"@mikro-orm/seeder": "5.8.4",
115115
"@moonrepo/cli": "1.9.2",
116116
"@testing-library/jest-dom": "^4.2.4",
117117
"@testing-library/react": "^9.5.0",
@@ -212,7 +212,13 @@
212212
"vite-plugin-dts": "^2.3.0",
213213
"vite-tsconfig-paths": "^4.2.0"
214214
},
215+
"overrides": {
216+
"pkg": {
217+
"pkg-fetch": "^3.5.2"
218+
}
219+
},
215220
"resolutions": {
221+
"pkg-fetch": "^3.5.2",
216222
"@moonrepo/core-linux-arm64-gnu": "1.9.2",
217223
"@moonrepo/core-linux-arm64-musl": "1.9.2",
218224
"@moonrepo/core-linux-x64-gnu": "1.9.2",

scripts/create-release.mjs

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,57 @@
1-
import { resolve, join } from 'node:path';
1+
import { resolve } from 'node:path';
22
import { readdir } from 'node:fs/promises';
3-
import childProc from 'node:child_process';
43
import { fileURLToPath } from 'node:url';
5-
import { promisify } from 'node:util';
4+
import { parseArgs } from 'node:util';
5+
import {exec as pkgExec} from 'pkg'
66

7-
const exec = promisify(childProc.exec);
7+
const {
8+
values: {
9+
/** @type {string} */
10+
nodeVersion,
11+
/** @type {['all'] | ('mac' | 'linux' | 'windows' | 'mac-arm')[]} */
12+
os
13+
},
14+
} = parseArgs({
15+
options: {
16+
nodeVersion: {
17+
type: "string",
18+
short: "n",
19+
default: "18.15.0",
20+
},
21+
os: {
22+
type: "string",
23+
multiple: true,
24+
default: ["all"],
25+
short: "o",
26+
},
27+
},
28+
});
829

9-
const NODE_VER = 'node18';
30+
31+
const NODE_VER = nodeVersion;
1032
const __dirname = fileURLToPath(new URL('.', import.meta.url));
1133

1234
const rootDir = resolve(__dirname, '..');
1335
const releaseDir = resolve(rootDir, 'release');
1436

1537

1638
const OS_ARCH = {
17-
mac: 'macos-x64',
18-
linux: 'linux-x64',
19-
windows: 'win-x64',
20-
'mac-arm': 'macos-arm64',
39+
mac: {
40+
platform: 'macos',
41+
arch: 'x64',
42+
},
43+
linux: {
44+
platform: 'linux',
45+
arch: 'x64',
46+
},
47+
windows: {
48+
platform: 'windows',
49+
arch: 'x64',
50+
},
51+
// 'mac-arm': {
52+
// platform: 'macos',
53+
// arch: 'arm64',
54+
// },
2155
};
2256

2357
const PARSERS = [];
@@ -30,11 +64,16 @@ const PROJECTS = [
3064
{ path: 'applications/server/package.json', out: 'RedEye' },
3165
...PARSERS.map((parser) => ({ path: `parsers/${parser}`, out: `parsers/${parser}` })),
3266
];
33-
67+
const isAllOS = os.includes('all');
3468
for (const [OS, PKG_KEY] of Object.entries(OS_ARCH)) {
69+
if (!isAllOS && !os.includes(OS)) {
70+
continue;
71+
}
72+
console.log('Building for: ', OS)
3573
for (const project of PROJECTS) {
36-
await exec(
37-
`yarn pkg ${project.path} -t ${NODE_VER}-${PKG_KEY} -o ${resolve(releaseDir, `RedEye-${OS}`, project.out)}`
74+
console.log('\tBuilding: ', project.path)
75+
await pkgExec(
76+
[project.path, '-t', `node${NODE_VER}-${PKG_KEY.platform}-${PKG_KEY.arch}`, '-o', resolve(releaseDir, `RedEye-${OS}`, project.out)]
3877
);
3978
}
4079
}

0 commit comments

Comments
 (0)