Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions .github/workflows/build_and_push_stable.yml
Original file line number Diff line number Diff line change
@@ -1,41 +1,37 @@
name: "Build and Push Docker Image (On Push to Stable)"

on:
push:
branches:
- stable
workflow_dispatch:
# on:
# push:
# branches:
# - stable

jobs:
docker-build-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Login to DockerHub
run: |
docker login --username=${{ vars.DOCKERHUB_DULL_USER }} --password=${{ secrets.DOCKERHUB_DULL_TOKEN }}

- name: Generate timestamp
id: timestamp
run: echo "TIMESTAMP=$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV

- name: Generate short SHA
id: sha
run: echo "SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-6)" >> $GITHUB_ENV

- name: Build and tag Docker images
run: |
for TAG_PREFIX in stable unstable; do
docker build -t bramkor/pureflow:${TAG_PREFIX} .
docker tag bramkor/pureflow:${TAG_PREFIX} bramkor/pureflow:${TAG_PREFIX}-${{ env.SHORT_SHA }}
docker tag bramkor/pureflow:${TAG_PREFIX} bramkor/pureflow:${TAG_PREFIX}-${{ env.SHORT_SHA }}-${{ env.TIMESTAMP }}
done

- name: Push Docker images
run: |
run: |-
for TAG_PREFIX in stable unstable; do
docker push bramkor/pureflow:${TAG_PREFIX}
docker push bramkor/pureflow:${TAG_PREFIX}-${{ env.SHORT_SHA }}
docker push bramkor/pureflow:${TAG_PREFIX}-${{ env.SHORT_SHA }}-${{ env.TIMESTAMP }}
done
done
18 changes: 7 additions & 11 deletions .github/workflows/build_and_push_unstable.yml
Original file line number Diff line number Diff line change
@@ -1,31 +1,29 @@
name: "Build and Push Docker Image (Manual)"
on:
workflow_dispatch:
inputs:
tag_prefix:
description: 'Tag prefix to use (defaults to unstable)'
required: false
default: 'unstable'
# on:
# workflow_dispatch:
# inputs:
# tag_prefix:
# description: 'Tag prefix to use (defaults to unstable)'
# required: false
# default: 'unstable'

jobs:
docker-build-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Login to DockerHub
run: |
docker login --username=${{ vars.DOCKERHUB_DULL_USER }} --password=${{ secrets.DOCKERHUB_DULL_TOKEN }}

- name: Generate timestamp
id: timestamp
run: echo "TIMESTAMP=$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV

- name: Generate short SHA
id: sha
run: echo "SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-6)" >> $GITHUB_ENV

- name: Set tag prefix
id: set_tag_prefix
run: |
Expand All @@ -36,13 +34,11 @@ jobs:
TAG_PREFIX="${{ github.event.inputs.tag_prefix }}"
fi
echo "TAG_PREFIX=${TAG_PREFIX}" >> $GITHUB_ENV

- name: Build Docker image
run: |
docker build -t dull/pureflow:${{ env.TAG_PREFIX }} .
docker tag dull/pureflow:${{ env.TAG_PREFIX }} brdullc/pureflow:${{ env.TAG_PREFIX }}-${{ env.SHORT_SHA }}
docker tag dull/pureflow:${{ env.TAG_PREFIX }} brdullc/pureflow:${{ env.TAG_PREFIX }}-${{ env.SHORT_SHA }}-${{ env.TIMESTAMP }}

- name: Push Docker images
run: |
docker push dull/pureflow:${{ env.TAG_PREFIX }}
Expand Down
33 changes: 12 additions & 21 deletions .github/workflows/check-client.yml
Original file line number Diff line number Diff line change
@@ -1,26 +1,23 @@
name: "React Front-End CI checks"

on:
pull_request:
branches:
- '**'

push:
branches:
- stable
- unstable

paths:
- 'client/**'
- '.github/workflows/*client.yml'
workflow_dispatch:
# on:
# pull_request:
# branches:
# - '**'
# push:
# branches:
# - stable
# - unstable
# paths:
# - 'client/**'
# - '.github/workflows/*client.yml'

env:
HUSKY: 0

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
runs-on: ubuntu-latest
Expand All @@ -30,23 +27,17 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Disable prepare script (husky)
run: npm pkg delete scripts.prepare

- name: Install dependencies
run: npm ci --prefix=client --no-audit

- name: Check format
run: npm run format --prefix=client

- name: Lint
run: npm run lint --prefix=client

- name: Build
run: npm run build --prefix=client
38 changes: 14 additions & 24 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
name: "Nest Back-End CI checks"

on:
pull_request:
branches:
- '**'

push:
branches:
- stable
- unstable

paths:
- '*'
- 'src/**'
- 'test/**'
- '.github/workflows/check.yml'
workflow_dispatch:
# on:
# pull_request:
# branches:
# - '**'
# push:
# branches:
# - stable
# - unstable
# paths:
# - '*'
# - 'src/**'
# - 'test/**'
# - '.github/workflows/check.yml'

env:
HUSKY: 0

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
runs-on: ubuntu-latest
Expand All @@ -32,26 +29,19 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}

- name: Disable prepare script (husky)
run: npm pkg delete scripts.prepare

- name: Install dependencies
run: npm ci --no-audit

- name: Check format
run: npm run format

- name: Lint
run: npm run lint

- name: Build
run: npm run build

- name: Test
run: npm run test
44 changes: 24 additions & 20 deletions src/app.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ export class AppController {
async renderTemplate(@Body() raw): Promise<string> {
if (typeof raw === 'string' || Buffer.isBuffer(raw)) {
const text = raw.toString().trim();
const res = dotT.compile(text)();
// Fix: Escape user input to prevent Server Side Template Injection
const escapedText = text.replace(/\{\{.*?\}\}/g, '');
const res = dotT.compile(escapedText)();
this.logger.debug(`Rendered template: ${res}`);
return res;
}
Expand All @@ -87,6 +89,15 @@ export class AppController {
})
@Redirect()
async redirect(@Query('url') url: string) {
const allowedDomains = ['example.com', 'another-example.com'];
try {
const urlObj = new URL(url);
if (!allowedDomains.includes(urlObj.hostname)) {
throw new HttpException('Invalid redirect URL', HttpStatus.BAD_REQUEST);
}
} catch (error) {
throw new HttpException('Invalid URL format', HttpStatus.BAD_REQUEST);
}
return { url };
}

Expand Down Expand Up @@ -179,25 +190,18 @@ export class AppController {
type: Object
})
getSecrets(): Record<string, string> {
// Fetch secrets from environment variables instead of hardcoding
const secrets = {
codeclimate:
'CODECLIMATE_REPO_TOKEN=62864c476ade6ab9d10d0ce0901ae2c211924852a28c5f960ae5165c1fdfec73',
facebook:
'EAACEdEose0cBAHyDF5HI5o2auPWv3lPP3zNYuWWpjMrSaIhtSvX73lsLOcas5k8GhC5HgOXnbF3rXRTczOpsbNb54CQL8LcQEMhZAWAJzI0AzmL23hZByFAia5avB6Q4Xv4u2QVoAdH0mcJhYTFRpyJKIAyDKUEBzz0GgZDZD',
google_b64: 'QUl6YhT6QXlEQnbTr2dSdEI1W7yL2mFCX3c4PPP5NlpkWE65NkZV',
google_oauth:
'188968487735-c7hh7k87juef6vv84697sinju2bet7gn.apps.googleusercontent.com',
google_oauth_token:
'ya29.a0TgU6SMDItdQQ9J7j3FVgJuByTTevl0FThTEkBs4pA4-9tFREyf2cfcL-_JU6Trg1O0NWwQKie4uGTrs35kmKlxohWgcAl8cg9DTxRx-UXFS-S1VYPLVtQLGYyNTfGp054Ad3ej73-FIHz3RZY43lcKSorbZEY4BI',
heroku:
'herokudev.staging.endosome.975138 pid=48751 request_id=0e9a8698-a4d2-4925-a1a5-113234af5f60',
hockey_app: 'HockeySDK: 203d3af93f4a218bfb528de08ae5d30ff65e1cf',
outlook:
'https://outlook.office.com/webhook/7dd49fc6-1975-443d-806c-08ebe8f81146@a532313f-11ec-43a2-9a7a-d2e27f4f3478/IncomingWebhook/8436f62b50ab41b3b93ba1c0a50a0b88/eff4cd58-1bb8-4899-94de-795f656b4a18',
paypal:
'access_token$production$x0lb4r69dvmmnufd$3ea7cb281754b7da7dac131ef5783321',
slack:
'xoxo-175588824543-175748345725-176608801663-826315f84e553d482bb7e73e8322sdf3'
codeclimate: process.env.CODECLIMATE_REPO_TOKEN || '',
facebook: process.env.FACEBOOK_TOKEN || '',
google_b64: process.env.GOOGLE_B64 || '',
google_oauth: process.env.GOOGLE_OAUTH || '',
google_oauth_token: process.env.GOOGLE_OAUTH_TOKEN || '',
heroku: process.env.HEROKU_TOKEN || '',
hockey_app: process.env.HOCKEY_APP_TOKEN || '',
outlook: process.env.OUTLOOK_WEBHOOK || '',
paypal: process.env.PAYPAL_ACCESS_TOKEN || '',
slack: process.env.SLACK_TOKEN || ''
};
return secrets;
}
Expand Down Expand Up @@ -294,4 +298,4 @@ export class AppController {

return JSON.stringify(jsonObj);
}
}
}
7 changes: 4 additions & 3 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ import { ChatModule } from './chat/chat.module';
HttpClientModule,
GraphQLModule.forRoot<MercuriusDriverConfig>({
driver: MercuriusDriver,
graphiql: true,
autoSchemaFile: true
graphiql: false, // Disable GraphiQL to prevent introspection
autoSchemaFile: true,
introspection: false // Disable introspection to secure the schema
}),
PartnersModule,
EmailModule,
Expand All @@ -55,4 +56,4 @@ export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(TraceMiddleware).forRoutes('(.*)');
}
}
}
15 changes: 13 additions & 2 deletions src/chat/chat.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,23 @@ export class ChatController {
})
async query(@Body() messages: ChatMessage[]): Promise<string> {
try {
return await this.chatService.query(messages);
// Validate and sanitize input messages
const sanitizedMessages = messages.map(message => ({
role: message.role,
content: this.sanitizeInput(message.content)
}));

return await this.chatService.query(sanitizedMessages);
} catch (err) {
throw new HttpException(
`Chat API response error: ${err}`,
HttpStatus.INTERNAL_SERVER_ERROR
);
}
}
}

private sanitizeInput(input: string): string {
// Basic sanitization logic to prevent prompt injection
return input.replace(/[^\w\s.,!?]/g, '');
}
}
2 changes: 1 addition & 1 deletion src/file/cloud.providers.metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,4 +268,4 @@ export class CloudProvidersMetaData {
return data;
}
}
}
}
15 changes: 10 additions & 5 deletions src/file/file.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,16 @@ export class FileController {
@Query('type') contentType: string,
@Res({ passthrough: true }) res: FastifyReply
) {
const file: Stream = await this.fileService.getFile(path);
const type = this.getContentType(contentType);
res.type(type);
try {
const file: Stream = await this.fileService.getFile(path);
const type = this.getContentType(contentType);
res.type(type);

return file;
return file;
} catch (err) {
this.logger.error(err.message);
res.status(HttpStatus.INTERNAL_SERVER_ERROR).send({ error: 'An error occurred while processing your request.' });
}
}

@Get('/google')
Expand Down Expand Up @@ -325,4 +330,4 @@ export class FileController {
res.status(HttpStatus.NOT_FOUND);
}
}
}
}
Loading