Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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: 18 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "Password Manager Codespace",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/Buffer-7.0/Team 87 - PassVault/password-manager",
"postCreateCommand": "bash '/workspaces/Buffer-7.0/Team 87 - PassVault/.devcontainer/install-mysql-client.sh' || true",
"postStartCommand": "bash '/workspaces/Buffer-7.0/Team 87 - PassVault/.devcontainer/start-app.sh' --background || true",
"forwardPorts": [8080, 3306],
"portsAttributes": {
"8080": {
"label": "Password Manager App",
"onAutoForward": "openBrowserOnce"
},
"3306": {
"label": "MySQL"
}
}
}
31 changes: 31 additions & 0 deletions .devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: "3.8"

services:
app:
image: mcr.microsoft.com/devcontainers/java:1-21-bookworm
volumes:
- ..:/workspaces/Buffer-7.0:cached
working_dir: "/workspaces/Buffer-7.0/Team 87 - PassVault/password-manager"
command: sleep infinity
depends_on:
- mysql
environment:
DB_HOST: mysql
DB_PORT: 3306
DB_NAME: projectdb
DB_USER: root
DB_PASSWORD: rootpassword

mysql:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: projectdb
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:
7 changes: 0 additions & 7 deletions README.md

This file was deleted.

18 changes: 18 additions & 0 deletions Team 87 - PassVault/.devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "Password Manager Codespace",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/Buffer-7.0/Team 87 - PassVault/password-manager",
"postCreateCommand": "bash ../.devcontainer/install-mysql-client.sh || true",
"postStartCommand": "bash ../.devcontainer/start-app.sh --background || true",
"forwardPorts": [8080, 3306],
"portsAttributes": {
"8080": {
"label": "Password Manager App",
"onAutoForward": "openBrowserOnce"
},
"3306": {
"label": "MySQL"
}
}
}
31 changes: 31 additions & 0 deletions Team 87 - PassVault/.devcontainer/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
version: "3.8"

services:
app:
image: mcr.microsoft.com/devcontainers/java:1-21-bookworm
volumes:
- ../..:/workspaces/Buffer-7.0:cached
working_dir: "/workspaces/Buffer-7.0/Team 87 - PassVault/password-manager"
command: sleep infinity
depends_on:
- mysql
environment:
DB_HOST: mysql
DB_PORT: 3306
DB_NAME: projectdb
DB_USER: root
DB_PASSWORD: rootpassword

mysql:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: projectdb
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:
13 changes: 13 additions & 0 deletions Team 87 - PassVault/.devcontainer/install-mysql-client.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -euo pipefail

if command -v mysql >/dev/null 2>&1 && command -v mysqladmin >/dev/null 2>&1; then
exit 0
fi

sudo apt-get update
sudo apt-get install -y mariadb-client

if [ -x /usr/bin/mariadb ]; then
sudo ln -sf /usr/bin/mariadb /usr/local/bin/mysql
fi
143 changes: 143 additions & 0 deletions Team 87 - PassVault/.devcontainer/start-app.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
#!/usr/bin/env bash

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
APP_DIR="$(cd "${SCRIPT_DIR}/../password-manager" && pwd)"
PID_FILE="/tmp/password-manager.pid"
LOG_FILE="/tmp/password-manager.log"
STAMP_FILE="/tmp/password-manager.sha"

ensure_mysql_client() {
bash "${SCRIPT_DIR}/install-mysql-client.sh"
}

wait_for_mysql() {
local host="${DB_HOST:-mysql}"
local port="${DB_PORT:-3306}"
local user="${DB_USER:-root}"
local password="${DB_PASSWORD:-rootpassword}"
local attempt

for attempt in $(seq 1 30); do
if mysqladmin ping --host="${host}" --port="${port}" --user="${user}" --password="${password}" --silent >/dev/null 2>&1; then
return
fi

sleep 2
done

echo "MySQL did not become ready in time." >&2
exit 1
}

app_is_running() {
if [ -f "${PID_FILE}" ]; then
local pid
pid="$(cat "${PID_FILE}")"
if [ -n "${pid}" ] && kill -0 "${pid}" >/dev/null 2>&1; then
return 0
fi
rm -f "${PID_FILE}"
fi

if pgrep -f "java .* Main" >/dev/null 2>&1; then
return 0
fi

return 1
}

current_app_stamp() {
(
cd "${APP_DIR}"
find . -maxdepth 2 \( -name "*.java" -o -path "./web/*" -o -name "run.sh" \) -type f -print0 |
sort -z |
xargs -0 sha256sum |
sha256sum |
awk '{print $1}'
)
}

stop_app() {
if [ -f "${PID_FILE}" ]; then
local pid
pid="$(cat "${PID_FILE}")"
if [ -n "${pid}" ] && kill -0 "${pid}" >/dev/null 2>&1; then
kill "${pid}" >/dev/null 2>&1 || true
fi
rm -f "${PID_FILE}"
fi

pkill -f "java .* Main" >/dev/null 2>&1 || true
}

compile_app() {
(
cd "${APP_DIR}"
javac -cp ".:lib/mysql-connector-j-9.6.0.jar" *.java
)
}

launch_app() {
(
cd "${APP_DIR}"
nohup java -cp ".:lib/mysql-connector-j-9.6.0.jar" Main >"${LOG_FILE}" 2>&1 &
echo $! > "${PID_FILE}"
)
}

wait_for_app() {
local attempt

for attempt in $(seq 1 30); do
if (echo > /dev/tcp/127.0.0.1/8080) >/dev/null 2>&1; then
return
fi
sleep 1
done

echo "Password Manager did not start successfully." >&2
if [ -f "${LOG_FILE}" ]; then
echo "Last application log lines:" >&2
tail -n 20 "${LOG_FILE}" >&2
fi
exit 1
}

main() {
ensure_mysql_client
local stamp
stamp="$(current_app_stamp)"

if [ "${1:-}" = "--prepare-only" ]; then
exit 0
fi

if app_is_running; then
if [ -f "${STAMP_FILE}" ] && [ "$(cat "${STAMP_FILE}")" = "${stamp}" ]; then
echo "Password Manager is already running at http://localhost:8080"
exit 0
fi

echo "Password Manager code changed; restarting app."
stop_app
fi

wait_for_mysql
compile_app
launch_app

if [ "${1:-}" = "--background" ]; then
echo "${stamp}" > "${STAMP_FILE}"
echo "Password Manager startup requested in background. Check /tmp/password-manager.log if needed."
exit 0
fi

wait_for_app
echo "${stamp}" > "${STAMP_FILE}"

echo "Password Manager is running at http://localhost:8080"
}

main "$@"
67 changes: 67 additions & 0 deletions Team 87 - PassVault/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<h1>PassVault</h1>

<h3><i>Smart Security for the Modern Web</i></h3>

<b>Team: ColdBlooded</b>

<br><br>

<h2> Project Overview</h2>

<p>
PassVault is a <b>secure password manager web application</b> that allows users to safely store, manage, and analyze passwords.
<br><br>
It also includes <b>phishing detection</b> and <b>password strength evaluation</b> to enhance cybersecurity.
</p>

<br>

<h2> Key Features</h2>

<ul>
<li><b>Secure Signup/Login</b> using PBKDF2 (with salting)</li>
<li><b>Password Strength Checker</b> (Weak / Medium / Strong)</li>
<li><b>Password Generator</b> with customizable options</li>
<li><b>Encrypted Password Storage</b> using AES</li>
<li><b>Weak Password Detection</b> across accounts</li>
<li><b>Login Alert System</b> (time + location tracking)</li>
<li><b>Phishing Website Detection</b> using URL analysis</li>
</ul>

<br>

<h2> DSA Concepts Used</h2>

<ul>
<li><b>Hashing</b> → Secure user authentication</li>
<li><b>Linked List</b> → Managing dynamic user data</li>
<li><b>Trees</b> → URL structure parsing in phishing detection</li>
<li><b>Strings / Arrays</b> → Password analysis and generation</li>
</ul>

<br>

<h2> Tech Stack</h2>

<ul>
<li><b>Frontend:</b> HTML and CSS</li>
<li><b>Backend:</b> JAVA</li>
<li><b>Database:</b> MySQL</li>
</ul>

<br>

<h2> How It Works</h2>

<ol>
<li>User signs up and logs in</li>
<li>Dashboard provides security tools</li>
<li>Passwords are stored securely in encrypted form</li>
<li>System analyzes passwords and detects threats</li>
</ol>

<a href="https://drive.google.com/file/d/1JYYOkgVRyiUReVGZSlNxdmlYMM6Znyt4/view?usp=sharing">Video Demo Link</a>

<br>

<br>
11 changes: 11 additions & 0 deletions Team 87 - PassVault/password-manager/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Compiled Java files
*.class

# Old storage files (no longer used)
users.txt
passwords.txt
temp.txt

# OS files
.DS_Store
Thumbs.db
46 changes: 46 additions & 0 deletions Team 87 - PassVault/password-manager/AddPasswordHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;

public class AddPasswordHandler implements HttpHandler {

public void handle(HttpExchange exchange) throws IOException {
try {
if (!exchange.getRequestMethod().equalsIgnoreCase("POST")) {
exchange.sendResponseHeaders(405, -1);
return;
}

String session = SessionManager.extractSessionId(
exchange.getRequestHeaders().getFirst("Cookie")
);
String email = SessionManager.getUser(session);
String vaultKey = SessionManager.getVaultKey(session);

if (email == null || vaultKey == null) {
exchange.getResponseHeaders().add("Location", "/");
exchange.sendResponseHeaders(302, -1);
return;
}

Map<String, String> form = RequestUtil.parseFormBody(exchange);
String website = form.getOrDefault("website", "");
String username = form.getOrDefault("username", "");
String password = form.getOrDefault("password", "");

PasswordManager.savePassword(email, website, username, password, vaultKey);

exchange.getResponseHeaders().add("Location", "/vault");
exchange.sendResponseHeaders(302, -1);
} catch (Exception e) {
e.printStackTrace();
String res = "Save failed";
exchange.sendResponseHeaders(500, res.length());
exchange.getResponseBody().write(res.getBytes(StandardCharsets.UTF_8));
} finally {
exchange.close();
}
}
}
Loading