Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
0ed1b94
test!
kaye-s Feb 11, 2026
69a3118
Jacob Test
JacobLind1 Feb 11, 2026
3860278
tim
TingEnChang Feb 11, 2026
99a712e
connect openAI api to backend
TingEnChang Feb 12, 2026
3b4c170
connet frontend-backend-openai api
TingEnChang Feb 13, 2026
cfb44ee
Basic Frontend
NathanEdwards2023 Feb 15, 2026
0ae235d
database connected to enviornment
kaye-s Feb 16, 2026
5f3d3fa
database secrets preserved
kaye-s Feb 18, 2026
d85a13a
Revert "database connected to enviornment"
kaye-s Feb 18, 2026
8377edc
OKAY NOW FIXED, be sure to get .env file updated with new credentials
kaye-s Feb 18, 2026
012e418
showuser add user database functionality linked up
kaye-s Feb 18, 2026
c7beafb
password hashing
kaye-s Feb 18, 2026
a6c2e34
Moved db queries to new html file
kaye-s Feb 18, 2026
8ee5c87
Initial backend commit: barebones backend inside app folder GroupFive…
JacobLind1 Feb 18, 2026
4ad8843
Merge pull request #2 from kaye-s/AI-api
kaye-s Feb 18, 2026
d3bb239
Merge remote-tracking branch 'origin/master'
NathanEdwards2023 Feb 19, 2026
d74cf23
Frontend UI
NathanEdwards2023 Feb 19, 2026
7105115
Merge branch 'master' into frontend
kaye-s Feb 19, 2026
f4428c8
Merge pull request #3 from kaye-s/frontend
kaye-s Feb 19, 2026
81d21e1
Merge pull request #4 from kaye-s/backendtoo
kaye-s Feb 19, 2026
566263f
Merge branch 'master' into postgres
kaye-s Feb 19, 2026
0ca13c8
Merge pull request #1 from kaye-s/postgres
kaye-s Feb 19, 2026
5c156bb
Renamed API folder. Fixed urls.py and api/urls.py to pass initial tes…
JacobLind1 Feb 22, 2026
ecc43b5
api/urls.py
JacobLind1 Feb 22, 2026
80a832f
Database Integrated with Backend, Added Requirements I had forgotten.…
JacobLind1 Feb 22, 2026
71e9bd4
create the prescan function with semgrep and gitleak
TingEnChang Mar 4, 2026
2a92970
Fixed issue connecting with group database.
JacobLind1 Mar 4, 2026
80af157
create the prescan function with semgrep and gitleak
TingEnChang Mar 4, 2026
5db65b6
Simple Login and Register pages. Needs to be linked to backend
NathanEdwards2023 Mar 5, 2026
90037b5
Merge pull request #6 from kaye-s/frontend
JacobLind1 Mar 10, 2026
cf847ad
Merge pull request #7 from kaye-s/pre-scan
JacobLind1 Mar 10, 2026
c351af7
Test cases- Safe, vulnerable, mixed and edge
Sidh05 Mar 12, 2026
fd9e141
Merge branch 'master' into backendtoo
kaye-s Mar 19, 2026
771abbb
Merge pull request #5 from kaye-s/backendtoo
kaye-s Mar 19, 2026
57cde04
Refactored everything in main branch
kaye-s Mar 19, 2026
4e4dccd
merge conflicts ahaha
kaye-s Mar 19, 2026
5458ff4
merge conflicts ahaha
kaye-s Mar 19, 2026
8f0e1f1
good news merge conflicts done and project is fully django. bad news …
kaye-s Mar 19, 2026
ebd8070
Merge pull request #8 from kaye-s/MasterMerge
kaye-s Mar 19, 2026
bc332c2
Logout button
kaye-s Apr 1, 2026
1c4f415
Merge pull request #10 from kaye-s/mergeBranch
kaye-s Apr 1, 2026
6460bcc
Merge remote-tracking branch 'origin/master'
NathanEdwards2023 Apr 1, 2026
797a4e1
UX Updates from previous branch
NathanEdwards2023 Apr 1, 2026
51148ac
feat:generate report on frontend
TingEnChang Apr 2, 2026
5f9d9c6
Connected register to backend, reg and login do not point to same tab…
JacobLind1 Apr 6, 2026
7023c24
Modified login so that it refers to our user model
JacobLind1 Apr 6, 2026
8ce532d
vulnerability page added
kaye-s Apr 8, 2026
d2d721d
AI report
TingEnChang Apr 9, 2026
6387bcf
Merge pull request #11 from kaye-s/frontend-2
kaye-s Apr 10, 2026
4c99d4d
Merge branch 'master' into reg-connect
kaye-s Apr 10, 2026
39c1a02
Merge pull request #12 from kaye-s/reg-connect
kaye-s Apr 10, 2026
3d94d71
Merge branch 'master' into cwe_database_page
kaye-s Apr 10, 2026
7c51147
Merge pull request #13 from kaye-s/cwe_database_page
kaye-s Apr 10, 2026
33ce319
fixed merging errors and updated everything with the changes
kaye-s Apr 10, 2026
cbea45e
Merge pull request #14 from kaye-s/merge-main
kaye-s Apr 10, 2026
52e22de
upload file and connect to backend to generate report
TingEnChang Apr 11, 2026
80555a3
Added backend functionality/connection for dashboard recent scans
JacobLind1 Apr 21, 2026
a8ba54a
Added backend functionality/connection for dashboard recent scans
JacobLind1 Apr 22, 2026
6ef18a5
Merge branch 'store-report' into report-store-merge
JacobLind1 Apr 22, 2026
8d34a8b
Fixed references to default user package, modified codesubmission mig…
JacobLind1 Apr 22, 2026
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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ profile_default/
ipython_config.py

# pyenv
#don't add database credentials
.env
.python-version

# pipenv
Expand Down Expand Up @@ -189,3 +191,7 @@ gradle-app.setting

/.vs/
node_modules/
.env
/api/migrations/0001_initial.py
/api/migrations/0002_codesubmission_incident_id_and_more.py
/api/migrations/0003_codesubmission_report_data.py
Empty file added api/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions api/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions api/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class ScannerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'
77 changes: 77 additions & 0 deletions api/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Generated by Django 6.0.3 on 2026-03-30 20:11

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='CodeSubmission',
fields=[
('submission_id', models.AutoField(primary_key=True, serialize=False)),
('submission_name', models.CharField(blank=True, max_length=255, null=True)),
('uploaded_at', models.DateTimeField(auto_now_add=True)),
('overall_risk_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
('simplified_summary', models.TextField(blank=True, null=True)),
('detailed_summary', models.TextField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='CWE',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('cwe_id', models.CharField(max_length=50, unique=True)),
('name', models.TextField()),
('description', models.TextField(blank=True, null=True)),
('cvss_version', models.CharField(default='3.1', max_length=10)),
('average_score', models.DecimalField(decimal_places=2, max_digits=5)),
('severity', models.CharField(blank=True, max_length=20, null=True)),
('categories', models.TextField(blank=True, null=True)),
],
),
migrations.CreateModel(
name='User',
fields=[
('user_id', models.AutoField(primary_key=True, serialize=False)),
('email', models.CharField(max_length=255, unique=True)),
('password_hash', models.TextField()),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='File',
fields=[
('file_id', models.AutoField(primary_key=True, serialize=False)),
('file_name', models.CharField(max_length=255)),
('file_path', models.TextField()),
('file_type', models.CharField(blank=True, max_length=100, null=True)),
('submission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='api.codesubmission')),
],
),
migrations.CreateModel(
name='Threat',
fields=[
('threat_id', models.AutoField(primary_key=True, serialize=False)),
('title', models.CharField(max_length=255)),
('description', models.TextField(blank=True, null=True)),
('severity_level', models.CharField(choices=[('Low', 'Low'), ('Medium', 'Medium'), ('High', 'High'), ('Critical', 'Critical')], max_length=10)),
('severity_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
('recommendation', models.TextField(blank=True, null=True)),
('line_number', models.IntegerField(blank=True, null=True)),
('file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='threats', to='api.file')),
('submission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='threats', to='api.codesubmission')),
],
),
migrations.AddField(
model_name='codesubmission',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', to='api.user'),
),
]
22 changes: 22 additions & 0 deletions api/migrations/0002_alter_user_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 6.0.3 on 2026-04-06 17:52

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0001_initial'),
]

operations = [
migrations.SeparateDatabaseAndState(
database_operations=[],
state_operations=[
migrations.AlterModelTable(
name='user',
table='users',
),
],
),
]
14 changes: 14 additions & 0 deletions api/migrations/0004_merge_20260422_1651.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Generated by Django 6.0.3 on 2026-04-22 21:51

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0002_alter_user_table'),
('api', '0003_codesubmission_report_data'),
]

operations = [
]
17 changes: 17 additions & 0 deletions api/migrations/0005_alter_cwe_options.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 6.0.3 on 2026-04-22 21:51

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0004_merge_20260422_1651'),
]

operations = [
migrations.AlterModelOptions(
name='cwe',
options={'managed': False},
),
]
17 changes: 17 additions & 0 deletions api/migrations/0006_alter_cwe_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 6.0.3 on 2026-04-22 22:13

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0005_alter_cwe_options'),
]

operations = [
migrations.AlterModelTable(
name='cwe',
table='cwe',
),
]
17 changes: 17 additions & 0 deletions api/migrations/0007_alter_codesubmission_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 6.0.3 on 2026-04-22 22:22

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0006_alter_cwe_table'),
]

operations = [
migrations.AlterModelTable(
name='codesubmission',
table='code_submissions',
),
]
Empty file added api/migrations/__init__.py
Empty file.
98 changes: 98 additions & 0 deletions api/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
from django.db import models

# -------------------
# Users
# -------------------
class User(models.Model):
user_id = models.AutoField(primary_key=True)
email = models.CharField(max_length=255, unique=True)
password_hash = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
return self.email

class Meta:
db_table = "users"

# -------------------
# Code Submissions
# -------------------
class CodeSubmission(models.Model):
submission_id = models.AutoField(primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='submissions')
submission_name = models.CharField(max_length=255, null=True, blank=True)
uploaded_at = models.DateTimeField(auto_now_add=True)

overall_risk_score = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
simplified_summary = models.TextField(null=True, blank=True)
detailed_summary = models.TextField(null=True, blank=True)

scan_status = models.CharField(max_length=50, null=True, blank=True)
risk_level = models.CharField(max_length=20, null=True, blank=True)
incident_id = models.CharField(max_length=100, null=True, blank=True)
report_html_path = models.TextField(null=True, blank=True)
report_data = models.JSONField(null=True, blank=True)

def __str__(self):
return f"{self.submission_name} by {self.user.email}"

class Meta:
db_table = "code_submissions"

# -------------------
# Files
# -------------------
class File(models.Model):
file_id = models.AutoField(primary_key=True)
submission = models.ForeignKey(CodeSubmission, on_delete=models.CASCADE, related_name='files')
file_name = models.CharField(max_length=255)
file_path = models.TextField()
file_type = models.CharField(max_length=100, null=True, blank=True)

def __str__(self):
return self.file_name

# -------------------
# Threats
# -------------------
class Threat(models.Model):
SEVERITY_CHOICES = [
('Low', 'Low'),
('Medium', 'Medium'),
('High', 'High'),
('Critical', 'Critical'),
]

threat_id = models.AutoField(primary_key=True)
submission = models.ForeignKey(CodeSubmission, on_delete=models.CASCADE, related_name='threats')
file = models.ForeignKey(File, on_delete=models.SET_NULL, null=True, blank=True, related_name='threats')
title = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True)
severity_level = models.CharField(max_length=10, choices=SEVERITY_CHOICES)
severity_score = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
recommendation = models.TextField(null=True, blank=True)
line_number = models.IntegerField(null=True, blank=True)

def __str__(self):
return f"{self.title} ({self.severity_level})"

# -------------------
# CWE Reference
# -------------------
class CWE(models.Model):
cwe_id = models.CharField(max_length=50, unique=True)
name = models.TextField()
description = models.TextField(null=True, blank=True)
cvss_version = models.CharField(max_length=10, default='3.1')
average_score = models.DecimalField(max_digits=5, decimal_places=2)
severity = models.CharField(max_length=20, null=True, blank=True)
categories = models.TextField(null=True, blank=True)

class Meta:
db_table = 'cwe'
managed = False

def __str__(self):
return f"{self.cwe_id} - {self.name}"

26 changes: 26 additions & 0 deletions api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from rest_framework import serializers
from .models import CodeSubmission, File, Threat

# -------------------
# Serializer for submitting new code
# -------------------
class CodeSubmissionSerializer(serializers.ModelSerializer):
code = serializers.CharField(write_only=True) # user input code
submission_name = serializers.CharField(required=False, allow_blank=True)

class Meta:
model = CodeSubmission
fields = ['submission_name', 'code']

def create(self, validated_data):
# We'll store the "code" as a single File for simplicity
code_text = validated_data.pop('code')
submission = CodeSubmission.objects.create(**validated_data)
File.objects.create(
submission=submission,
file_name=validated_data.get('submission_name', 'unnamed.py'),
file_path='',
file_type='code',
)
# Optionally, you can attach code_text somewhere (DB or AI service)
return submission
13 changes: 13 additions & 0 deletions api/services/ai_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import os
from openai import OpenAI
from decouple import config

client = OpenAI(api_key=config("OPENAI_API_KEY"))

def ask_ai(user_text):
resp = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[{"role": "user", "content": str(user_text)}],
)

return resp.choices[0].message.content
12 changes: 12 additions & 0 deletions api/services/dummy_analysis.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
def run_dummy(code, language):

return {
"summary" : "this dummy code is better than yours",
"findings" : [
{
"severity" : "Minimal",
"description" : "Bad code",
"fix" : "Figure it Out"
}
]
}
Loading