Skip to content
Merged
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
8 changes: 4 additions & 4 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
# =============================================

# === App ===
APP_DOMAIN=humanshield.example.com
APP_DOMAIN=sentrymail.example.com
# DE: Worauf Caddy hoert (Default: localhost). Moegliche Werte:
# - Echte Domain (z. B. "humanshield.example.com") -> automatisches Let's Encrypt.
# - Echte Domain (z. B. "sentrymail.example.com") -> automatisches Let's Encrypt.
# - ":80" -> Catch-all, reines HTTP, matcht jeden Host. Sinnvoll, wenn ein vorgelagerter
# Reverse Proxy (Netbird, Cloudflare, ...) TLS zum Client terminiert und uns per HTTP
# mit Host=IP anspricht. TLS_DIRECTIVE leer lassen.
# EN: What Caddy listens on (default: localhost). Possible values:
# - A real domain (e.g. "humanshield.example.com") -> automatic Let's Encrypt.
# - A real domain (e.g. "sentrymail.example.com") -> automatic Let's Encrypt.
# - ":80" -> catch-all, plain HTTP, matches any host. Useful when an upstream reverse
# proxy (Netbird, Cloudflare, ...) terminates TLS to the client and reaches us over
# HTTP with Host=IP. Leave TLS_DIRECTIVE empty.
# CADDY_SITE_ADDRESS=humanshield.example.com
# CADDY_SITE_ADDRESS=sentrymail.example.com
#
# DE: Nur bei einer Domain als CADDY_SITE_ADDRESS relevant: erzwingt Caddys interne CA
# (selbstsigniert) statt eines echten Let's-Encrypt-Zertifikats - fuer Domains, die
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Instead, please follow our responsible disclosure process:
- Fix assessment: 7-14 days
- Coordinated disclosure: Based on severity

**Thank you for helping keep HumanShield secure!**
**Thank you for helping keep SentryMail secure!**

---

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ If applicable, describe potential security implications.
## Environment
- OS: [e.g., Linux, Windows]
- Browser/Version: [if applicable]
- HumanShield Version: [e.g., 1.0.0]
- SentryMail Version: [e.g., 1.0.0]

## Screenshots
[If applicable]
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ contact_links:
url: mailto:security@sentrymail.de
about: Report security vulnerabilities via email (NOT GitHub Issues)
- name: Commercial Support
url: https://humanshield-awareness.de/support
url: https://sentrymail.de/support
about: Enterprise support and consulting
- name: BSI Compliance Question
url: https://github.com/securebits-cyber/SentryMail/discussions/categories/compliance
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/config_question.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: Configuration Question
about: Ask about HumanShield configuration, deployment, or compliance setup
about: Ask about SentryMail configuration, deployment, or compliance setup
title: '[CONFIG] '
labels: question
assignees: ''
Expand All @@ -11,7 +11,7 @@ What are you trying to configure or set up?

## Current Setup
- **Deployment type:** [e.g., Docker, Kubernetes, VPS]
- **HumanShield version:** [e.g., 1.0.0]
- **SentryMail version:** [e.g., 1.0.0]
- **Environment:** [e.g., Linux Ubuntu 22.04]
- **Database:** [e.g., PostgreSQL, SQLite]

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/docs_improvement.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: Documentation Improvement
about: Suggest improvements to HumanShield documentation
about: Suggest improvements to SentryMail documentation
title: '[DOCS] '
labels: documentation
assignees: ''
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: Feature Request
about: Suggest an enhancement or new feature for HumanShield
about: Suggest an enhancement or new feature for SentryMail
title: '[FEATURE] '
labels: enhancement
---
Expand All @@ -13,7 +13,7 @@ Describe the solution you'd like.

## Target Audience
- [ ] End Users (Security Awareness Participants)
- [ ] Administrators (HumanShield Platform Users)
- [ ] Administrators (SentryMail Platform Users)
- [ ] Integrators (API/Custom Implementations)
- [ ] Security Teams (Reporting/Analytics)
- [ ] All of the above
Expand Down
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/integration_request.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ assignees: ''
---

## Integration Request
What system or API would you like to integrate with HumanShield?
What system or API would you like to integrate with SentryMail?

## System/Service Details
- **Name:** [e.g., Slack, Microsoft Teams, Jira]
Expand All @@ -18,7 +18,7 @@ What system or API would you like to integrate with HumanShield?
Describe the integration scenario:

## Expected Benefits
How would this integration improve HumanShield?
How would this integration improve SentryMail?

## Scope
- [ ] Notifications/Alerts
Expand Down
8 changes: 4 additions & 4 deletions backend/.env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# =============================================
# HumanShield.APP Backend – Beispiel-Konfiguration / Example configuration
# SentryMail Backend – Beispiel-Konfiguration / Example configuration
# DE: Nur fuer Standalone-Betrieb des Backends ausserhalb von Docker Compose
# (z. B. lokales `uvicorn app.main:app --reload` im backend/-Ordner).
# Im Docker-Compose-Stack kommt die Konfiguration aus der .env im Repo-Root.
Expand Down Expand Up @@ -37,8 +37,8 @@ INITIAL_ADMIN_PASSWORD=change-me
# === OIDC (optional, Zweitmethode / second method - beliebiger Provider / any provider: Authentik, Keycloak, Entra ID, Okta, ...) ===
# DE: Leer lassen/entfernen, um OIDC/SSO komplett zu deaktivieren.
# EN: Leave empty/remove to disable OIDC/SSO entirely.
OIDC_ISSUER=https://idp.example.com/application/o/humanshield/
OIDC_CLIENT_ID=humanshield
OIDC_ISSUER=https://idp.example.com/application/o/sentrymail/
OIDC_CLIENT_ID=sentrymail
OIDC_CLIENT_SECRET=change-me
OIDC_REDIRECT_URI=http://localhost:8000/auth/callback

Expand All @@ -48,7 +48,7 @@ SMTP_PORT=587
SMTP_USERNAME=noreply@example.com
SMTP_PASSWORD=change-me
SMTP_FROM_EMAIL=noreply@example.com
SMTP_FROM_NAME=HumanShield-Awareness
SMTP_FROM_NAME=SentryMail
SMTP_TLS_MODE=starttls
SMTP_VERIFY_SSL=true
SMTP_BATCH_DELAY=2
2 changes: 1 addition & 1 deletion backend/app/addon_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
hier nichts. Das Feature-Gate selbst liegt in den Add-on-Routern; dieser Loader
entscheidet nur, ob ein Paket ueberhaupt vorhanden ist.

Siehe docs/lizenz-addon-architektur.md (Abschnitt 6).
Siehe docs/license-addon-architektur.md (Abschnitt 6).
"""
import logging
from importlib.metadata import entry_points
Expand Down
2 changes: 1 addition & 1 deletion backend/app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def _secret_key_min_length(cls, v: str) -> str:
# Lizenzierung / Add-ons (Online-Aktivierung). Leer = reiner Open-Core-Betrieb ohne Add-ons.
LICENSE_SERVER_URL: str = ""
LICENSE_KEY: str = "" # optionaler .env-Seed; kann auch im Dashboard gepflegt werden
LICENSE_PRODUCT: str = "humanshield.app"
LICENSE_PRODUCT: str = "sentrymail"
LICENSE_REFRESH_INTERVAL_HOURS: int = 24


Expand Down
2 changes: 1 addition & 1 deletion backend/app/services/license.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
enthaltenen Features aktiv - auch wenn der Server zwischenzeitlich nicht
erreichbar ist. Ohne Lizenz laeuft der Core als reiner Open-Core (keine Add-ons).

Siehe docs/lizenz-addon-architektur.md.
Siehe docs/license-addon-architektur.md.
"""
from __future__ import annotations

Expand Down
26 changes: 13 additions & 13 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
services:
postgres:
image: postgres:18-alpine
container_name: humanshield-db
container_name: sentrymail-db
environment:
POSTGRES_DB: ${POSTGRES_DB:-phishaware}
POSTGRES_USER: ${POSTGRES_USER:-phishaware}
Expand All @@ -14,18 +14,18 @@ services:
timeout: 5s
retries: 5
networks:
- humanshield
- sentrymail

redis:
image: redis:8-alpine
container_name: humanshield-cache
container_name: sentrymail-cache
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- humanshield
- sentrymail

# Anhang-Pruefung fuer gemeldete Mails (Enterprise). Bewusst hinter einem
# Profil und damit standardmaessig AUS: clamd haelt die Signaturdatenbank
Expand All @@ -42,7 +42,7 @@ services:
# Signaturdatenbank ist schlimmer als keine, weil sie Sicherheit vortaeuscht.
clamav:
image: clamav/clamav:stable
container_name: humanshield-clamav
container_name: sentrymail-clamav
profiles:
- scanning
restart: unless-stopped
Expand All @@ -57,13 +57,13 @@ services:
volumes:
- clamav_data:/var/lib/clamav
networks:
- humanshield
- sentrymail

backend:
build:
context: ./backend
dockerfile: Dockerfile
container_name: humanshield-api
container_name: sentrymail-api
env_file:
- .env
depends_on:
Expand All @@ -77,7 +77,7 @@ services:
# Container-Schicht und waeren nach jedem Rebuild weg.
- backend_data:/app/data
networks:
- humanshield
- sentrymail

# Gebautes Frontend, statisch ausgeliefert. Der Port wird bewusst nicht auf
# den Host veroeffentlicht - erreichbar ist das Frontend nur ueber Caddy.
Expand All @@ -91,15 +91,15 @@ services:
VITE_API_URL: ${VITE_API_URL:-/api}
VITE_WIKI_URL: ${VITE_WIKI_URL:-}
VITE_SUPPORT_EMAIL: ${VITE_SUPPORT_EMAIL:-}
container_name: humanshield-web
container_name: sentrymail-web
depends_on:
- backend
networks:
- humanshield
- sentrymail

caddy:
image: caddy:2-alpine
container_name: humanshield-proxy
container_name: sentrymail-proxy
# FRONTEND_BIND_ADDRESS begrenzt, auf welcher Netzwerkschnittstelle das
# Dashboard ueberhaupt antwortet. Ohne Angabe hoert es auf allen - bei einer
# Maschine mit oeffentlicher IP heisst das: offen im Internet.
Expand All @@ -118,7 +118,7 @@ services:
- backend
- frontend
networks:
- humanshield
- sentrymail

volumes:
postgres_data:
Expand All @@ -130,5 +130,5 @@ volumes:
clamav_data:

networks:
humanshield:
sentrymail:
driver: bridge
2 changes: 1 addition & 1 deletion frontend/.env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# =============================================
# HumanShield.APP Frontend – Beispiel-Konfiguration / Example configuration
# SentryMail Frontend – Beispiel-Konfiguration / Example configuration
# DE: Nur relevant fuer lokale Entwicklung ausserhalb von Docker Compose
# (docker-compose.yml setzt VITE_API_URL bereits ueber die Root-.env).
# Kopieren nach "frontend/.env" - niemals mit echten Werten committen.
Expand Down
4 changes: 2 additions & 2 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "humanshield-frontend",
"name": "sentrymail-frontend",
"version": "0.1.0",
"type": "module",
"scripts": {
Expand Down
11 changes: 9 additions & 2 deletions frontend/src/hooks/useTheme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ import { useCallback, useEffect, useState } from 'react'

type Theme = 'light' | 'dark'

const STORAGE_KEY = 'phishaware-theme'
const STORAGE_KEY = 'sentrymail-theme'

// Bis 0.47.0 lag die Auswahl unter dem Namen einer aufgegebenen Marke. Sie wird
// einmalig noch von dort gelesen, damit die Umbenennung niemandem sein Theme
// zurueckwirft - der Effekt unten schreibt sofort unter dem neuen Schluessel und
// raeumt den alten weg. Diese Konstante darf ein spaeteres Release entfernen.
const LEGACY_STORAGE_KEY = 'phishaware-theme'

function getInitialTheme(): Theme {
const stored = localStorage.getItem(STORAGE_KEY)
const stored = localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY)
if (stored === 'light' || stored === 'dark') return stored
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
Expand All @@ -20,6 +26,7 @@ export function useTheme() {
useEffect(() => {
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem(STORAGE_KEY, theme)
localStorage.removeItem(LEGACY_STORAGE_KEY)
}, [theme])

const toggleTheme = useCallback(() => {
Expand Down
2 changes: 1 addition & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ printf '\n'
printf '%s%s%s\n' "$BOLD" "$(msg '7) Lizenz / Add-ons (optional)' '7) License / add-ons (optional)')" "$RESET"
printf ' %s\n' "$(msg 'Leer lassen = reiner Open-Core-Betrieb ohne kostenpflichtige Add-ons.' 'Leave empty = pure Open Core without paid add-ons.')"
if yesno 'Business-/Enterprise-Lizenz hinterlegen?' 'Configure a Business/Enterprise license?' n; then
ask LICENSE_SERVER_URL 'Lizenzserver-URL' 'License server URL' 'https://license.humanshield-awareness.de' >/dev/null
ask LICENSE_SERVER_URL 'Lizenzserver-URL' 'License server URL' 'https://license.sentrymail.de' >/dev/null
ask LICENSE_KEY 'Lizenzschluessel' 'License key' '' >/dev/null
else
printf ' %s\n' "$(msg 'Ohne Lizenz (Open Core).' 'No license (Open Core).')"
Expand Down
10 changes: 10 additions & 0 deletions update.sh
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,17 @@ printf '\n'
printf '%s%s%s\n' "$BOLD" "$(msg '4) Stack neu bauen und starten' '4) Rebuild and restart the stack')" "$RESET"
printf ' %s\n' "$(msg 'DB-Migrationen laufen automatisch beim Backend-Start.' 'DB migrations run automatically on backend start.')"
if yesno 'Jetzt "docker compose up -d --build" ausfuehren?' 'Run "docker compose up -d --build" now?' y; then
# Containernamen vor dem Update merken. Sie tragen seit dem Rebranding das
# Praefix "sentrymail-" statt "humanshield-"; compose ordnet Container ueber
# Projekt- und Service-Label zu, erstellt sie also regulaer neu. Die Volumes
# heissen unveraendert (postgres_data, backend_data, ...) und bleiben damit
# samt Daten erhalten - allein das alte Netz bleibt ungenutzt zurueck.
ALT_NETZ="$(docker network ls --format '{{.Name}}' 2>/dev/null | grep -E '_humanshield$' || true)"
( cd "$SCRIPT_DIR" && docker compose up -d --build )
if [ -n "$ALT_NETZ" ]; then
printf ' %s!%s %s\n' "$YELLOW" "$RESET" "$(msg "Die Container heissen jetzt sentrymail-*. Das alte Netz $ALT_NETZ wird nicht mehr benutzt und kann entfernt werden:" "Containers are now named sentrymail-*. The old network $ALT_NETZ is unused and can be removed:")"
printf ' %sdocker network rm %s%s\n' "$BOLD" "$ALT_NETZ" "$RESET"
fi
else
printf ' %s\n' "$(msg 'Uebersprungen. Spaeter:' 'Skipped. Later:')"
printf ' %sdocker compose up -d --build%s\n' "$BOLD" "$RESET"
Expand Down