From a7cae3aa0fce4c45d0f1f6410eb0249f8cc16307 Mon Sep 17 00:00:00 2001 From: CarterPerez-dev Date: Thu, 29 Jan 2026 02:41:15 -0500 Subject: [PATCH] Phase 1.1: Organize PROJECTS by difficulty level - Create beginner/, intermediate/, advanced/ folders in PROJECTS/ - Move all existing projects to appropriate difficulty folders - Update all README.md links to reflect new structure - Update contributor links - Fix pyrightconfig.json trailing comma Projects organized: Beginner (6): simple-port-scanner, keylogger, caesar-cipher, dns-lookup, metadata-scrubber-tool, simple-vulnerability-scanner Intermediate (2): api-security-scanner, docker-security-audit Advanced (4): api-rate-limiter, encrypted-p2p-chat, bug-bounty-platform, Aenebris --- PROJECTS/{ => advanced}/Aenebris/.gitignore | 0 PROJECTS/{ => advanced}/Aenebris/.style.yapf | 0 PROJECTS/{ => advanced}/Aenebris/CHANGELOG.md | 0 PROJECTS/{ => advanced}/Aenebris/LICENSE | 0 PROJECTS/{ => advanced}/Aenebris/Makefile | 0 PROJECTS/{ => advanced}/Aenebris/README.md | 0 PROJECTS/{ => advanced}/Aenebris/Setup.hs | 0 PROJECTS/{ => advanced}/Aenebris/WHITEPAPER | 2 +- .../{ => advanced}/Aenebris/aenebris.cabal | 0 PROJECTS/{ => advanced}/Aenebris/app/Main.hs | 0 .../proxy-haskell-research/config-design.md | 162 +++++++++--------- .../proxy-haskell-research/ddos-mitigation.md | 34 ++-- .../proxy-haskell-research/deployment.md | 104 +++++------ .../haskell-networking.md | 108 ++++++------ .../proxy-haskell-research/http2-http3.md | 8 +- .../proxy-haskell-research/load-balancing.md | 120 ++++++------- .../ml-bot-detection.md | 0 .../performance-optimization.md | 72 ++++---- .../proxy-haskell-research/rate-limiting.md | 6 +- .../docs/proxy-haskell-research/tls-ssl.md | 50 +++--- .../docs/proxy-haskell-research/waf-design.md | 0 .../Aenebris/examples/TEST_TLS.md | 0 .../Aenebris/examples/config-advanced.yaml | 0 .../Aenebris/examples/config-https.yaml | 0 .../examples/config-loadbalancing.yaml | 0 .../Aenebris/examples/config-sni.yaml | 0 .../Aenebris/examples/config.yaml | 0 .../Aenebris/examples/generate-test-certs.sh | 0 .../Aenebris/examples/start_backends.sh | 0 .../Aenebris/examples/test_backend.py | 0 .../Aenebris/examples/test_backend_multi.py | 0 .../examples/websockets/config_ws_sse.yaml | 0 .../examples/websockets/sse_server.py | 0 .../examples/websockets/test_client.py | 0 .../examples/websockets/ws_echo_server.py | 0 .../proxy-haskell-research/config-design.md | 162 +++++++++--------- .../proxy-haskell-research/ddos-mitigation.md | 34 ++-- .../proxy-haskell-research/deployment.md | 104 +++++------ .../haskell-networking.md | 108 ++++++------ .../proxy-haskell-research/http2-http3.md | 8 +- .../proxy-haskell-research/load-balancing.md | 120 ++++++------- .../ml-bot-detection.md | 0 .../performance-optimization.md | 72 ++++---- .../proxy-haskell-research/rate-limiting.md | 6 +- .../streaming-websockets.md | 12 +- .../refer/proxy-haskell-research/tls-ssl.md | 50 +++--- .../proxy-haskell-research/waf-design.md | 0 .../Aenebris/src/Aenebris/Backend.hs | 0 .../Aenebris/src/Aenebris/Config.hs | 0 .../Aenebris/src/Aenebris/Connection.hs | 0 .../Aenebris/src/Aenebris/HealthCheck.hs | 0 .../Aenebris/src/Aenebris/LoadBalancer.hs | 0 .../src/Aenebris/Middleware/Redirect.hs | 0 .../src/Aenebris/Middleware/Security.hs | 0 .../Aenebris/src/Aenebris/Proxy.hs | 0 .../Aenebris/src/Aenebris/TLS.hs | 0 .../Aenebris/src/Aenebris/Tunnel.hs | 0 PROJECTS/{ => advanced}/Aenebris/stack.yaml | 0 .../{ => advanced}/Aenebris/stack.yaml.lock | 0 .../api-rate-limiter/.style.yapf | 0 .../{ => advanced}/api-rate-limiter/README.md | 0 .../api-rate-limiter/examples/app.py | 0 .../examples/docker-compose.yml | 0 .../api-rate-limiter/learn/algorithms.md | 0 .../api-rate-limiter/learn/architecture.md | 0 .../api-rate-limiter/learn/security.md | 0 .../api-rate-limiter/pyproject.toml | 5 +- .../src/fastapi_420/__init__.py | 0 .../src/fastapi_420/algorithms/__init__.py | 0 .../src/fastapi_420/algorithms/base.py | 0 .../fastapi_420/algorithms/fixed_window.py | 0 .../fastapi_420/algorithms/sliding_window.py | 0 .../fastapi_420/algorithms/token_bucket.py | 0 .../src/fastapi_420/config.py | 0 .../src/fastapi_420/defense/__init__.py | 0 .../fastapi_420/defense/circuit_breaker.py | 0 .../src/fastapi_420/defense/layers.py | 0 .../src/fastapi_420/dependencies.py | 0 .../src/fastapi_420/exceptions.py | 0 .../fastapi_420/fingerprinting/__init__.py | 0 .../src/fastapi_420/fingerprinting/auth.py | 0 .../fastapi_420/fingerprinting/composite.py | 0 .../src/fastapi_420/fingerprinting/headers.py | 0 .../src/fastapi_420/fingerprinting/ip.py | 0 .../src/fastapi_420/limiter.py | 0 .../src/fastapi_420/middleware.py | 0 .../api-rate-limiter/src/fastapi_420/py.typed | 0 .../src/fastapi_420/storage/__init__.py | 0 .../fastapi_420/storage/lua/fixed_window.lua | 0 .../storage/lua/sliding_window.lua | 0 .../fastapi_420/storage/lua/token_bucket.lua | 0 .../src/fastapi_420/storage/memory.py | 0 .../src/fastapi_420/storage/redis_backend.py | 0 .../api-rate-limiter/src/fastapi_420/types.py | 0 .../api-rate-limiter/tests/__init__.py | 0 .../api-rate-limiter/tests/conftest.py | 0 .../api-rate-limiter/tests/test_algorithms.py | 0 .../tests/test_fingerprinting.py | 0 .../tests/test_integration.py | 0 .../api-rate-limiter/tests/test_limiter.py | 0 .../api-rate-limiter/tests/test_storage.py | 0 .../api-rate-limiter/tests/test_types.py | 0 .../{ => advanced}/api-rate-limiter/uv.lock | 0 .../bug-bounty-platform/.env.example | 0 .../bug-bounty-platform/.gitignore | 1 - .../.pre-commit-config.yaml | 0 .../bug-bounty-platform/LICENSE | 0 .../bug-bounty-platform/README.md | 0 .../bug-bounty-platform/backend/.dockerignore | 0 .../bug-bounty-platform/backend/.style.yapf | 0 .../bug-bounty-platform/backend/alembic.ini | 0 .../backend/alembic/env.py | 0 .../backend/alembic/script.py.mako | 0 .../versions/20251224_033104_initial.py | 2 +- .../20260106_010122_add_bug_bounty_models.py | 0 .../backend/app/__main__.py | 0 .../backend/app/admin/__init__.py | 0 .../backend/app/admin/dependencies.py | 0 .../backend/app/admin/py.typed | 0 .../backend/app/admin/repository.py | 0 .../backend/app/admin/routes.py | 0 .../backend/app/admin/schemas.py | 0 .../backend/app/admin/service.py | 0 .../backend/app/auth/RefreshToken.py | 0 .../backend/app/auth/__init__.py | 0 .../backend/app/auth/dependencies.py | 0 .../backend/app/auth/py.typed | 0 .../backend/app/auth/repository.py | 0 .../backend/app/auth/routes.py | 0 .../backend/app/auth/schemas.py | 0 .../backend/app/auth/service.py | 0 .../bug-bounty-platform/backend/app/config.py | 0 .../backend/app/core/Base.py | 0 .../backend/app/core/__init__.py | 0 .../backend/app/core/base_repository.py | 0 .../backend/app/core/base_schema.py | 0 .../backend/app/core/common_schemas.py | 0 .../backend/app/core/constants.py | 0 .../backend/app/core/database.py | 0 .../backend/app/core/dependencies.py | 0 .../backend/app/core/enums.py | 0 .../backend/app/core/error_schemas.py | 0 .../backend/app/core/exceptions.py | 0 .../backend/app/core/health_routes.py | 0 .../backend/app/core/logging.py | 0 .../backend/app/core/py.typed | 0 .../backend/app/core/rate_limit.py | 0 .../backend/app/core/responses.py | 0 .../backend/app/core/security.py | 0 .../backend/app/factory.py | 0 .../backend/app/middleware/__init__.py | 0 .../backend/app/middleware/correlation.py | 0 .../backend/app/middleware/py.typed | 0 .../backend/app/program/Asset.py | 0 .../backend/app/program/Program.py | 0 .../backend/app/program/RewardTier.py | 0 .../backend/app/program/__init__.py | 0 .../backend/app/program/dependencies.py | 0 .../backend/app/program/repository.py | 0 .../backend/app/program/routes.py | 0 .../backend/app/program/schemas.py | 0 .../backend/app/program/service.py | 0 .../bug-bounty-platform/backend/app/py.typed | 0 .../backend/app/report/Attachment.py | 0 .../backend/app/report/Comment.py | 0 .../backend/app/report/Report.py | 0 .../backend/app/report/__init__.py | 0 .../backend/app/report/dependencies.py | 0 .../backend/app/report/repository.py | 0 .../backend/app/report/routes.py | 0 .../backend/app/report/schemas.py | 0 .../backend/app/report/service.py | 0 .../backend/app/user/User.py | 0 .../backend/app/user/__init__.py | 0 .../backend/app/user/dependencies.py | 0 .../backend/app/user/py.typed | 0 .../backend/app/user/repository.py | 0 .../backend/app/user/routes.py | 0 .../backend/app/user/schemas.py | 0 .../backend/app/user/service.py | 0 .../bug-bounty-platform/backend/conftest.py | 0 .../backend/pyproject.toml | 4 +- .../backend/tests/__init__.py | 0 .../backend/tests/integration/__init__.py | 0 .../backend/tests/integration/test_admin.py | 0 .../backend/tests/integration/test_auth.py | 0 .../backend/tests/integration/test_health.py | 0 .../backend/tests/integration/test_users.py | 0 .../backend/tests/unit/__init__.py | 0 .../bug-bounty-platform/backend/uv.lock | 0 .../bug-bounty-platform/compose.yml | 0 .../bug-bounty-platform/dev.compose.yml | 0 .../frontend/.dockerignore | 0 .../bug-bounty-platform/frontend/.gitignore | 0 .../frontend/.stylelintignore | 0 .../bug-bounty-platform/frontend/biome.json | 0 .../bug-bounty-platform/frontend/index.html | 2 +- .../bug-bounty-platform/frontend/package.json | 0 .../frontend/pnpm-lock.yaml | 0 .../public/assets/android-chrome-192x192.png | Bin .../public/assets/android-chrome-512x512.png | Bin .../public/assets/apple-touch-icon.png | Bin .../frontend/public/assets/favicon-16x16.png | Bin .../frontend/public/assets/favicon-32x32.png | Bin .../frontend/public/assets/favicon.ico | Bin .../frontend/public/assets}/site.webmanifest | 0 .../bug-bounty-platform/frontend/src/App.tsx | 0 .../frontend/src/api/hooks/index.ts | 0 .../frontend/src/api/hooks/useAdmin.ts | 0 .../frontend/src/api/hooks/useAuth.ts | 0 .../frontend/src/api/hooks/usePrograms.ts | 0 .../frontend/src/api/hooks/useReports.ts | 0 .../frontend/src/api/hooks/useUsers.ts | 0 .../frontend/src/api/index.ts | 0 .../frontend/src/api/types/admin.types.ts | 0 .../frontend/src/api/types/auth.types.ts | 0 .../frontend/src/api/types/index.ts | 0 .../frontend/src/api/types/program.types.ts | 0 .../frontend/src/api/types/report.types.ts | 0 .../frontend/src/api/types/user.types.ts | 0 .../frontend/src/config.ts | 0 .../frontend/src/core/api/api.config.ts | 0 .../frontend/src/core/api/errors.ts | 0 .../frontend/src/core/api/index.ts | 0 .../frontend/src/core/api/query.config.ts | 0 .../frontend/src/core/app/protected-route.tsx | 0 .../frontend/src/core/app/routers.tsx | 0 .../frontend/src/core/app/shell.module.scss | 4 +- .../frontend/src/core/app/shell.tsx | 0 .../frontend/src/core/app/toast.module.scss | 0 .../frontend/src/core/lib/auth.form.store.ts | 0 .../frontend/src/core/lib/auth.store.ts | 0 .../frontend/src/core/lib/index.ts | 0 .../src/core/lib/program.form.store.ts | 0 .../src/core/lib/settings.form.store.ts | 0 .../frontend/src/core/lib/shell.ui.store.ts | 0 .../bug-bounty-platform/frontend/src/main.tsx | 0 .../src/routes/admin/admin.module.scss | 0 .../frontend/src/routes/admin/index.tsx | 0 .../src/routes/admin/programs/index.tsx | 0 .../admin/programs/programs.module.scss | 0 .../src/routes/admin/reports/index.tsx | 0 .../routes/admin/reports/reports.module.scss | 0 .../frontend/src/routes/admin/stats/index.tsx | 0 .../src/routes/admin/stats/stats.module.scss | 0 .../routes/company/inbox/inbox.module.scss | 0 .../src/routes/company/inbox/index.tsx | 0 .../company/programs/[id]/edit.module.scss | 0 .../src/routes/company/programs/[id]/edit.tsx | 0 .../src/routes/company/programs/index.tsx | 0 .../routes/company/programs/new.module.scss | 0 .../src/routes/company/programs/new.tsx | 0 .../company/programs/programs.module.scss | 0 .../src/routes/company/reports/[id].tsx | 0 .../routes/company/reports/triage.module.scss | 0 .../routes/dashboard/dashboard.module.scss | 0 .../frontend/src/routes/dashboard/index.tsx | 0 .../frontend/src/routes/landing/index.tsx | 0 .../src/routes/landing/landing.module.scss | 0 .../frontend/src/routes/login/index.tsx | 0 .../src/routes/login/login.module.scss | 0 .../routes/programs/[slug]/detail.module.scss | 0 .../src/routes/programs/[slug]/index.tsx | 0 .../routes/programs/[slug]/submit.module.scss | 0 .../src/routes/programs/[slug]/submit.tsx | 0 .../frontend/src/routes/programs/index.tsx | 0 .../src/routes/programs/programs.module.scss | 0 .../frontend/src/routes/register/index.tsx | 0 .../src/routes/register/register.module.scss | 0 .../routes/reports/[id]/detail.module.scss | 0 .../src/routes/reports/[id]/index.tsx | 0 .../frontend/src/routes/reports/index.tsx | 0 .../src/routes/reports/reports.module.scss | 0 .../frontend/src/routes/settings/index.tsx | 0 .../src/routes/settings/settings.module.scss | 0 .../frontend/src/styles.scss | 0 .../frontend/src/styles/_fonts.scss | 0 .../frontend/src/styles/_index.scss | 0 .../frontend/src/styles/_mixins.scss | 0 .../frontend/src/styles/_reset.scss | 0 .../frontend/src/styles/_tokens.scss | 0 .../frontend/stylelint.config.js | 0 .../frontend/tsconfig.app.json | 0 .../frontend/tsconfig.json | 0 .../frontend/tsconfig.node.json | 0 .../frontend/vite.config.ts | 0 .../infra/docker/fastapi.dev | 0 .../infra/docker/fastapi.prod | 0 .../infra/docker/frontend-builder.prod | 0 .../bug-bounty-platform/infra/docker/vite.dev | 0 .../bug-bounty-platform/infra/nginx/dev.nginx | 0 .../infra/nginx/nginx.conf | 0 .../infra/nginx/nginx.prod.conf | 0 .../infra/nginx/prod.nginx | 0 .../bug-bounty-platform/justfile | 0 .../bug-bounty-platform/learn/ARCHITECTURE.md | 0 .../bug-bounty-platform/learn/DATABASE.md | 0 .../learn/GETTING-STARTED.md | 0 .../bug-bounty-platform/learn/PATTERNS.md | 0 .../bug-bounty-platform/learn/SECURITY.md | 0 .../encrypted-p2p-chat/.env.example | 0 .../encrypted-p2p-chat/.gitignore | 0 .../encrypted-p2p-chat/README.md | 0 .../encrypted-p2p-chat/backend/.dockerignore | 0 .../encrypted-p2p-chat/backend}/.style.yapf | 0 .../encrypted-p2p-chat/backend/alembic.ini | 0 .../encrypted-p2p-chat/backend/alembic/README | 0 .../encrypted-p2p-chat/backend/alembic/env.py | 0 .../backend/alembic/script.py.mako | 0 .../backend/app/__init__.py | 0 .../backend/app/api/__init__.py | 0 .../backend/app/api/auth.py | 0 .../backend/app/api/encryption.py | 0 .../backend/app/api/rooms.py | 8 +- .../backend/app/api/websocket.py | 4 +- .../encrypted-p2p-chat/backend/app/config.py | 0 .../backend/app/core/__init__.py | 0 .../backend/app/core/encryption/__init__.py | 0 .../app/core/encryption/double_ratchet.py | 0 .../app/core/encryption/x3dh_manager.py | 0 .../backend/app/core/enums.py | 0 .../backend/app/core/exception_handlers.py | 0 .../backend/app/core/exceptions.py | 0 .../backend/app/core/passkey/__init__.py | 0 .../app/core/passkey/passkey_manager.py | 0 .../backend/app/core/redis_manager.py | 0 .../backend/app/core/surreal_manager.py | 0 .../backend/app/core/websocket_manager.py | 0 .../encrypted-p2p-chat/backend/app/factory.py | 2 +- .../encrypted-p2p-chat/backend/app/main.py | 0 .../backend/app/models/Base.py | 0 .../backend/app/models/Credential.py | 0 .../backend/app/models/IdentityKey.py | 0 .../backend/app/models/OneTimePrekey.py | 0 .../backend/app/models/RatchetState.py | 0 .../backend/app/models/SignedPrekey.py | 0 .../backend/app/models/SkippedMessageKey.py | 0 .../backend/app/models/User.py | 0 .../backend/app/models/__init__.py | 0 .../backend/app/schemas/__init__.py | 0 .../backend/app/schemas/auth.py | 0 .../backend/app/schemas/common.py | 0 .../backend/app/schemas/rooms.py | 0 .../backend/app/schemas/surreal.py | 0 .../backend/app/schemas/websocket.py | 0 .../backend/app/services/__init__.py | 0 .../backend/app/services/auth_service.py | 0 .../backend/app/services/message_service.py | 0 .../backend/app/services/prekey_service.py | 2 +- .../backend/app/services/presence_service.py | 0 .../backend/app/services/websocket_service.py | 2 +- .../encrypted-p2p-chat/backend/pyproject.toml | 32 ++-- .../backend/tests/__init__.py | 0 .../backend/tests/conftest.py | 0 .../backend/tests/test_auth_service.py | 0 .../backend/tests/test_encryption.py | 0 .../backend/tests/test_message_service.py | 0 .../backend/tests/test_x3dh.py | 0 .../encrypted-p2p-chat/backend/uv.lock | 0 .../encrypted-p2p-chat/compose.yml | 0 .../conf/docker/dev/fastapi.docker | 0 .../conf/docker/dev/vite.docker | 0 .../conf/docker/prod/fastapi.docker | 0 .../conf/docker/prod/vite.docker | 0 .../encrypted-p2p-chat/conf/nginx/dev.nginx | 0 .../encrypted-p2p-chat/conf/nginx/http.conf | 0 .../encrypted-p2p-chat/conf/nginx/prod.nginx | 0 .../encrypted-p2p-chat/dev.compose.yml | 0 .../encrypted-p2p-chat/frontend/.gitignore | 1 - .../frontend/.prettierignore | 0 .../encrypted-p2p-chat/frontend/.prettierrc | 0 .../encrypted-p2p-chat/frontend/README.md | 0 .../frontend/eslint.config.js | 0 .../encrypted-p2p-chat/frontend/index.html | 0 .../frontend/package-lock.json | 0 .../encrypted-p2p-chat/frontend/package.json | 0 .../encrypted-p2p-chat/frontend/src/App.tsx | 0 .../frontend/src/components/Auth/AuthCard.tsx | 0 .../frontend/src/components/Auth/AuthForm.tsx | 0 .../src/components/Auth/PasskeyButton.tsx | 0 .../frontend/src/components/Auth/index.ts | 0 .../src/components/Chat/ChatHeader.tsx | 0 .../src/components/Chat/ChatInput.tsx | 0 .../src/components/Chat/ConversationItem.tsx | 0 .../src/components/Chat/ConversationList.tsx | 0 .../src/components/Chat/EncryptionBadge.tsx | 0 .../src/components/Chat/MessageBubble.tsx | 0 .../src/components/Chat/MessageList.tsx | 0 .../src/components/Chat/NewConversation.tsx | 0 .../src/components/Chat/OnlineStatus.tsx | 0 .../src/components/Chat/TypingIndicator.tsx | 0 .../src/components/Chat/UserSearch.tsx | 0 .../frontend/src/components/Chat/index.ts | 0 .../src/components/Layout/AppShell.tsx | 0 .../frontend/src/components/Layout/Header.tsx | 0 .../src/components/Layout/ProtectedRoute.tsx | 0 .../src/components/Layout/Sidebar.tsx | 0 .../frontend/src/components/Layout/index.ts | 0 .../frontend/src/components/UI/Avatar.tsx | 0 .../frontend/src/components/UI/Badge.tsx | 0 .../frontend/src/components/UI/Button.tsx | 0 .../frontend/src/components/UI/Dropdown.tsx | 0 .../frontend/src/components/UI/IconButton.tsx | 0 .../frontend/src/components/UI/Input.tsx | 0 .../frontend/src/components/UI/Modal.tsx | 0 .../frontend/src/components/UI/Skeleton.tsx | 0 .../frontend/src/components/UI/Spinner.tsx | 0 .../frontend/src/components/UI/TextArea.tsx | 0 .../frontend/src/components/UI/Toast.tsx | 0 .../frontend/src/components/UI/Tooltip.tsx | 0 .../frontend/src/components/UI/index.ts | 0 .../encrypted-p2p-chat/frontend/src/config.ts | 0 .../frontend/src/crypto/crypto-service.ts | 0 .../frontend/src/crypto/double-ratchet.ts | 0 .../frontend/src/crypto/index.ts | 0 .../frontend/src/crypto/key-store.ts | 0 .../frontend/src/crypto/message-store.ts | 0 .../frontend/src/crypto/primitives.ts | 0 .../frontend/src/crypto/x3dh.ts | 0 .../encrypted-p2p-chat/frontend/src/index.css | 0 .../encrypted-p2p-chat/frontend/src/index.tsx | 0 .../frontend/src/pages/Chat.tsx | 0 .../frontend/src/pages/Home.tsx | 0 .../frontend/src/pages/Login.tsx | 0 .../frontend/src/pages/NotFound.tsx | 0 .../frontend/src/pages/Register.tsx | 0 .../frontend/src/services/auth.service.ts | 0 .../frontend/src/services/index.ts | 0 .../frontend/src/services/room.service.ts | 0 .../frontend/src/stores/auth.store.ts | 0 .../frontend/src/stores/index.ts | 0 .../frontend/src/stores/messages.store.ts | 0 .../frontend/src/stores/presence.store.ts | 0 .../frontend/src/stores/rooms.store.ts | 0 .../frontend/src/stores/session.store.ts | 0 .../frontend/src/stores/settings.store.ts | 0 .../frontend/src/stores/typing.store.ts | 0 .../frontend/src/stores/ui.store.ts | 0 .../frontend/src/types/api.ts | 0 .../frontend/src/types/auth.ts | 0 .../frontend/src/types/chat.ts | 0 .../frontend/src/types/components.ts | 0 .../frontend/src/types/encryption.ts | 0 .../frontend/src/types/guards.ts | 0 .../frontend/src/types/index.ts | 0 .../frontend/src/types/websocket.ts | 0 .../frontend/src/vite-env.d.ts | 0 .../frontend/src/websocket/index.ts | 0 .../src/websocket/message-handlers.ts | 0 .../src/websocket/websocket-manager.ts | 0 .../encrypted-p2p-chat/frontend/tsconfig.json | 0 .../frontend/vite.config.ts | 0 .../encrypted-p2p-chat/justfile | 0 .../{ => beginner}/caesar-cipher/.gitignore | 0 .../caesar-cipher}/.style.yapf | 0 .../{ => beginner}/caesar-cipher/Justfile | 0 .../caesar-cipher/pyproject.toml | 0 .../src/caesar_cipher/__init__.py | 2 - .../src/caesar_cipher/analyzer.py | 0 .../caesar-cipher/src/caesar_cipher/cipher.py | 0 .../src/caesar_cipher/constants.py | 0 .../caesar-cipher/src/caesar_cipher/main.py | 0 .../caesar-cipher/src/caesar_cipher/utils.py | 0 .../caesar-cipher/tests/__init__.py | 0 .../caesar-cipher/tests/test_analyzer.py | 0 .../caesar-cipher/tests/test_cipher.py | 0 .../caesar-cipher/tests/test_cli.py | 0 PROJECTS/{ => beginner}/caesar-cipher/uv.lock | 0 .../dns-lookup}/.style.yapf | 0 PROJECTS/{ => beginner}/dns-lookup/README.md | 0 .../dns-lookup/dnslookup/__init__.py | 0 .../dns-lookup/dnslookup/__main__.py | 0 .../dns-lookup/dnslookup/cli.py | 0 .../dns-lookup/dnslookup/output.py | 0 .../dns-lookup/dnslookup/resolver.py | 0 .../dns-lookup/dnslookup/whois_lookup.py | 0 PROJECTS/{ => beginner}/dns-lookup/justfile | 0 .../{ => beginner}/dns-lookup/pyproject.toml | 0 .../dns-lookup/tests/__init__.py | 0 .../dns-lookup/tests/test_resolver.py | 0 PROJECTS/{ => beginner}/dns-lookup/uv.lock | 0 .../keylogger}/.style.yapf | 0 PROJECTS/{ => beginner}/keylogger/README.md | 0 PROJECTS/{ => beginner}/keylogger/justfile | 0 .../{ => beginner}/keylogger/keylogger.py | 0 .../{ => beginner}/keylogger/pyproject.toml | 0 .../keylogger/test_keylogger.py | 0 .../.github/workflows/publish.yml | 2 +- .../.github/workflows/test.yml | 2 +- .../metadata-scrubber-tool/.gitignore | 2 - .../metadata-scrubber-tool/.python-version | 0 .../metadata-scrubber-tool/.style.yapf | 0 .../metadata-scrubber-tool/.yapfignore | 2 +- .../metadata-scrubber-tool/LICENSE | 0 .../metadata-scrubber-tool/README.md | 2 +- .../metadata-scrubber-tool/docker-compose.yml | 0 .../docs/best-practices.md | 0 .../docs/metadata-risks.md | 0 .../metadata-scrubber-tool/pyproject.toml | 1 - .../metadata-scrubber-tool/pyrightconfig.json | 2 +- .../metadata-scrubber-tool/requirements.txt | Bin 984 -> 985 bytes .../scripts/generate_png_tests.py | 0 .../metadata-scrubber-tool/src/__init__.py | 0 .../src/commands/__init__.py | 0 .../src/commands/read.py | 0 .../src/commands/scrub.py | 0 .../src/commands/verify.py | 0 .../src/core/__init__.py | 0 .../src/core/jpeg_metadata.py | 0 .../src/core/png_metadata.py | 0 .../metadata-scrubber-tool/src/main.py | 0 .../src/services/__init__.py | 0 .../src/services/batch_processor.py | 0 .../src/services/excel_handler.py | 0 .../src/services/image_handler.py | 0 .../src/services/metadata_factory.py | 0 .../src/services/metadata_handler.py | 0 .../src/services/pdf_handler.py | 0 .../src/services/powerpoint_handler.py | 0 .../src/services/report_generator.py | 0 .../src/services/worddoc_handler.py | 0 .../src/utils/__init__.py | 0 .../src/utils/display.py | 0 .../src/utils/exceptions.py | 0 .../src/utils/formatter.py | 0 .../src/utils/get_target_files.py | 0 .../src/utils/logger.py | 0 .../metadata-scrubber-tool/tests/__init__.py | 0 .../assets/test_docx/file-sample_1MB.docx | Bin .../assets/test_docx/file-sample_500kB.docx | Bin .../assets/test_images/generated_test_03.png | Bin .../assets/test_images/generated_test_04.png | Bin .../assets/test_images/generated_test_05.png | Bin .../tests/assets/test_images/test_canon.jpg | Bin .../tests/assets/test_images/test_fuji.jpg | Bin .../assets/test_pdfs/file-example_PDF_1MB.pdf | Bin .../tests/assets/test_pdfs/sample.pdf | Bin .../tests/assets/test_pptx/Extlst-test.pptx | Bin .../tests/assets/test_pptx/sample3.pptx | Bin .../test_xlsx/file_example_XLSX_1000.xlsx | Bin .../test_xlsx/file_example_XLSX_5000.xlsx | Bin .../metadata-scrubber-tool/tests/conftest.py | 0 .../tests/e2e/__init__.py | 0 .../tests/e2e/test_main.py | 0 .../tests/e2e/test_read_command.py | 0 .../tests/e2e/test_scrub_command.py | 0 .../tests/e2e/test_verify_command.py | 0 .../tests/integration/__init__.py | 0 .../integration/test_metadata_factory.py | 0 .../tests/unit/__init__.py | 0 .../tests/unit/test_excel_handler.py | 0 .../tests/unit/test_image_handler.py | 0 .../tests/unit/test_pdf_handler.py | 0 .../tests/unit/test_powerpoint_handler.py | 0 .../tests/unit/test_worddoc_handler.py | 0 .../typings/piexif/__init__.pyi | 0 .../typings/piexif/_common.pyi | 0 .../typings/piexif/_dump.pyi | 0 .../typings/piexif/_exceptions.pyi | 0 .../typings/piexif/_exif.pyi | 0 .../typings/piexif/_insert.pyi | 0 .../typings/piexif/_load.pyi | 0 .../typings/piexif/_remove.pyi | 0 .../typings/piexif/_transplant.pyi | 0 .../typings/piexif/_webp.pyi | 0 .../typings/piexif/helper.pyi | 0 .../metadata-scrubber-tool/uv.lock | 0 .../simple-port-scanner/CMakeLists.txt | 0 .../simple-port-scanner/README.md | 1 - .../simple-port-scanner/main.cpp | 0 .../simple-port-scanner/src/PortScanner.cpp | 2 +- .../simple-port-scanner/src/PortScanner.hpp | 0 .../simple-vulnerability-scanner/.gitignore | 0 .../.golangci.yml | 0 .../simple-vulnerability-scanner/Justfile | 0 .../simple-vulnerability-scanner/README.md | 14 +- .../cmd/angela/main.go | 0 .../simple-vulnerability-scanner/go.mod | 0 .../simple-vulnerability-scanner/go.sum | 0 .../internal/cli/output.go | 0 .../internal/cli/update.go | 0 .../internal/config/config.go | 0 .../internal/osv/client.go | 0 .../internal/osv/client_test.go | 0 .../internal/pypi/cache.go | 0 .../internal/pypi/cache_test.go | 0 .../internal/pypi/client.go | 0 .../internal/pypi/client_test.go | 0 .../internal/pypi/version.go | 0 .../internal/pypi/version_test.go | 0 .../internal/pyproject/parser.go | 0 .../internal/pyproject/parser_test.go | 0 .../internal/pyproject/writer.go | 0 .../internal/pyproject/writer_test.go | 0 .../internal/requirements/parser.go | 0 .../internal/requirements/parser_test.go | 0 .../internal/requirements/writer.go | 0 .../internal/requirements/writer_test.go | 0 .../internal/ui/banner.go | 0 .../internal/ui/color.go | 0 .../internal/ui/spinner.go | 0 .../internal/ui/symbol.go | 0 .../learn/GO-CONCURRENCY-PATTERNS.md | 0 .../learn/PEP440-VERSION-PARSING.md | 0 .../learn/TOML-COMMENT-PRESERVATION.md | 0 .../pkg/types/types.go | 0 .../testdata/pyproject.toml | 0 .../testdata/requirements.txt | 0 .../api-security-scanner/.env.example | 0 .../api-security-scanner/.gitignore | 0 .../.pre-commit-config.yaml | 0 .../api-security-scanner/backend}/.style.yapf | 0 .../api-security-scanner/backend/__init__.py | 0 .../api-security-scanner/backend/backend.just | 0 .../api-security-scanner/backend/config.py | 0 .../backend/core/__init__.py | 0 .../backend/core/database.py | 0 .../backend/core/dependencies.py | 0 .../backend/core/enums.py | 0 .../backend/core/security.py | 0 .../api-security-scanner/backend/factory.py | 0 .../api-security-scanner/backend/main.py | 0 .../backend/models/Base.py | 0 .../backend/models/Scan.py | 0 .../backend/models/TestResult.py | 0 .../backend/models/User.py | 0 .../backend/models/__init__.py | 0 .../backend/pyproject.toml | 0 .../backend/repositories/__init__.py | 0 .../backend/repositories/scan_repository.py | 0 .../repositories/test_result_repository.py | 0 .../backend/repositories/user_repository.py | 0 .../backend/routes/__init__.py | 0 .../backend/routes/auth.py | 0 .../backend/routes/scans.py | 0 .../backend/scanners/__init__.py | 0 .../backend/scanners/auth_scanner.py | 0 .../backend/scanners/base_scanner.py | 0 .../backend/scanners/idor_scanner.py | 0 .../backend/scanners/payloads.py | 0 .../backend/scanners/rate_limit_scanner.py | 0 .../backend/scanners/sqli_scanner.py | 0 .../backend/schemas/__init__.py | 0 .../backend/schemas/scan_schemas.py | 0 .../backend/schemas/test_result_schemas.py | 0 .../backend/schemas/user_schemas.py | 0 .../backend/services/__init__.py | 0 .../backend/services/auth_service.py | 0 .../backend/services/scan_service.py | 0 .../api-security-scanner/compose.yml | 0 .../conf/docker/dev/fastapi.docker | 0 .../conf/docker/dev/vite.docker | 0 .../conf/docker/prod/fastapi.docker | 0 .../conf/docker/prod/vite.docker | 0 .../api-security-scanner/conf/nginx/dev.nginx | 0 .../api-security-scanner/conf/nginx/http.conf | 0 .../conf/nginx/prod.nginx | 0 .../api-security-scanner/dev.compose.yml | 0 .../api-security-scanner/frontend/.gitignore | 0 .../frontend/.prettierignore | 0 .../frontend/.prettierrc.json | 0 .../frontend/.stylelintrc.json | 0 .../frontend/eslint.config.js | 0 .../api-security-scanner/frontend/index.html | 0 .../frontend/package-lock.json | 0 .../frontend/package.json | 0 .../public/android-chrome-192x192.png | Bin .../public/android-chrome-512x512.png | Bin .../frontend/public/apple-touch-icon.png | Bin .../frontend/public/favicon-16x16.png | Bin .../frontend/public/favicon-32x32.png | Bin .../frontend/public/favicon.ico | Bin .../frontend/public}/site.webmanifest | 2 +- .../api-security-scanner/frontend/src/App.tsx | 0 .../frontend/src/components/auth/AuthForm.css | 0 .../src/components/auth/LoginForm.tsx | 0 .../src/components/auth/RegisterForm.tsx | 0 .../frontend/src/components/common/Button.css | 0 .../frontend/src/components/common/Button.tsx | 0 .../frontend/src/components/common/Input.css | 0 .../frontend/src/components/common/Input.tsx | 0 .../src/components/common/LoadingOverlay.css | 0 .../src/components/common/LoadingOverlay.tsx | 0 .../src/components/common/ProtectedRoute.tsx | 0 .../src/components/scan/NewScanForm.tsx | 0 .../frontend/src/components/scan/ScanForm.css | 0 .../src/components/scan/ScansList.css | 0 .../src/components/scan/ScansList.tsx | 0 .../src/components/scan/TestResultCard.css | 0 .../src/components/scan/TestResultCard.tsx | 0 .../frontend/src/config/constants.ts | 0 .../frontend/src/hooks/useAuth.ts | 0 .../frontend/src/hooks/useScan.ts | 0 .../frontend/src/lib/api.ts | 0 .../frontend/src/lib/errors.ts | 0 .../frontend/src/lib/queryClient.ts | 0 .../frontend/src/lib/utils.ts | 0 .../frontend/src/lib/validation.ts | 0 .../frontend/src/main.tsx | 0 .../frontend/src/pages/AuthPage.css | 0 .../frontend/src/pages/DashboardPage.css | 0 .../frontend/src/pages/DashboardPage.tsx | 0 .../frontend/src/pages/LoginPage.tsx | 0 .../frontend/src/pages/RegisterPage.tsx | 0 .../frontend/src/pages/ScanResultsPage.css | 0 .../frontend/src/pages/ScanResultsPage.tsx | 0 .../frontend/src/router.tsx | 0 .../frontend/src/services/authService.ts | 0 .../frontend/src/services/scanService.ts | 0 .../frontend/src/store/authStore.ts | 0 .../frontend/src/store/uiStore.ts | 0 .../frontend/src/styles/index.css | 0 .../frontend/src/styles/variables.css | 0 .../frontend/src/types/auth.types.ts | 0 .../frontend/src/types/guards.ts | 0 .../frontend/src/types/scan.types.ts | 0 .../frontend/src/vite-env.d.ts | 0 .../frontend/tsconfig.app.json | 0 .../frontend/tsconfig.json | 0 .../frontend/tsconfig.node.json | 0 .../frontend/vite.config.ts | 0 .../api-security-scanner/justfile | 0 .../learn/architecture.md | 0 .../api-security-scanner/learn/scanning.md | 0 .../learn/vulnerabilities.md | 0 .../api-security-scanner/package.json | 0 .../docker-security-audit/.gitignore | 0 .../docker-security-audit/.golangci.yml | 0 .../docker-security-audit/Dockerfile | 0 .../docker-security-audit/LICENSE | 0 .../docker-security-audit/Makefile | 0 .../docker-security-audit/README.md | 0 .../docker-security-audit/cmd/docksec/main.go | 0 .../docker-security-audit/go.mod | 0 .../docker-security-audit/go.sum | 0 .../internal/analyzer/analyzer.go | 0 .../internal/analyzer/compose.go | 0 .../internal/analyzer/container.go | 0 .../internal/analyzer/container_test.go | 0 .../internal/analyzer/daemon.go | 0 .../internal/analyzer/dockerfile.go | 0 .../internal/analyzer/image.go | 0 .../internal/benchmark/controls.go | 0 .../internal/config/config.go | 0 .../internal/config/constants.go | 0 .../internal/docker/client.go | 0 .../internal/finding/finding.go | 0 .../internal/parser/compose.go | 0 .../internal/parser/dockerfile.go | 0 .../internal/parser/visitor.go | 0 .../internal/proc/capabilities.go | 0 .../internal/proc/proc.go | 0 .../internal/proc/security.go | 0 .../internal/report/json.go | 0 .../internal/report/junit.go | 0 .../internal/report/reporter.go | 0 .../internal/report/sarif.go | 0 .../internal/report/terminal.go | 0 .../internal/rules/capabilities.go | 0 .../internal/rules/paths.go | 0 .../internal/rules/secrets.go | 0 .../internal/scanner/scanner.go | 0 .../learn/architecture.md | 0 .../learn/codebase-guide.md | 0 .../learn/security-concepts.md | 0 .../tests/e2e/e2e_test.go | 0 .../tests/integration/compose_test.go | 0 .../tests/integration/dockerfile_test.go | 0 .../tests/testdata/README.md | 0 .../tests/testdata/TEST-SUMMARY.md | 0 .../tests/testdata/compose/bad-caps.yml | 0 .../testdata/compose/bad-docker-socket.yml | 0 .../tests/testdata/compose/bad-mounts.yml | 0 .../tests/testdata/compose/bad-no-limits.yml | 0 .../tests/testdata/compose/bad-privileged.yml | 0 .../tests/testdata/compose/bad-secrets.yml | 0 .../testdata/compose/good-production.yml | 0 .../containers/privileged-container.json | 0 .../testdata/containers/secure-container.json | 0 .../dockerfiles/bad-add-command.Dockerfile | 0 .../dockerfiles/bad-privileged.Dockerfile | 0 .../dockerfiles/bad-root-user.Dockerfile | 0 .../dockerfiles/bad-secrets.Dockerfile | 0 .../dockerfiles/good-minimal.Dockerfile | 0 .../dockerfiles/good-security.Dockerfile | 0 README.md | 26 +-- templates/fullstack-template | 2 +- 787 files changed, 731 insertions(+), 742 deletions(-) rename PROJECTS/{ => advanced}/Aenebris/.gitignore (100%) rename PROJECTS/{ => advanced}/Aenebris/.style.yapf (100%) rename PROJECTS/{ => advanced}/Aenebris/CHANGELOG.md (100%) rename PROJECTS/{ => advanced}/Aenebris/LICENSE (100%) rename PROJECTS/{ => advanced}/Aenebris/Makefile (100%) rename PROJECTS/{ => advanced}/Aenebris/README.md (100%) rename PROJECTS/{ => advanced}/Aenebris/Setup.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/WHITEPAPER (99%) rename PROJECTS/{ => advanced}/Aenebris/aenebris.cabal (100%) rename PROJECTS/{ => advanced}/Aenebris/app/Main.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/config-design.md (97%) rename PROJECTS/{Aenebris/refer => advanced/Aenebris/docs}/proxy-haskell-research/ddos-mitigation.md (99%) rename PROJECTS/{Aenebris/refer => advanced/Aenebris/docs}/proxy-haskell-research/deployment.md (98%) rename PROJECTS/{Aenebris/refer => advanced/Aenebris/docs}/proxy-haskell-research/haskell-networking.md (97%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/http2-http3.md (99%) rename PROJECTS/{Aenebris/refer => advanced/Aenebris/docs}/proxy-haskell-research/load-balancing.md (97%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/ml-bot-detection.md (100%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/performance-optimization.md (97%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/rate-limiting.md (99%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/tls-ssl.md (99%) rename PROJECTS/{ => advanced}/Aenebris/docs/proxy-haskell-research/waf-design.md (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/TEST_TLS.md (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/config-advanced.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/config-https.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/config-loadbalancing.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/config-sni.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/config.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/generate-test-certs.sh (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/start_backends.sh (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/test_backend.py (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/test_backend_multi.py (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/websockets/config_ws_sse.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/websockets/sse_server.py (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/websockets/test_client.py (100%) rename PROJECTS/{ => advanced}/Aenebris/examples/websockets/ws_echo_server.py (100%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/config-design.md (97%) rename PROJECTS/{Aenebris/docs => advanced/Aenebris/refer}/proxy-haskell-research/ddos-mitigation.md (99%) rename PROJECTS/{Aenebris/docs => advanced/Aenebris/refer}/proxy-haskell-research/deployment.md (98%) rename PROJECTS/{Aenebris/docs => advanced/Aenebris/refer}/proxy-haskell-research/haskell-networking.md (97%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/http2-http3.md (99%) rename PROJECTS/{Aenebris/docs => advanced/Aenebris/refer}/proxy-haskell-research/load-balancing.md (97%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/ml-bot-detection.md (100%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/performance-optimization.md (97%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/rate-limiting.md (99%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/streaming-websockets.md (98%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/tls-ssl.md (99%) rename PROJECTS/{ => advanced}/Aenebris/refer/proxy-haskell-research/waf-design.md (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Backend.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Config.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Connection.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/HealthCheck.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/LoadBalancer.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Middleware/Redirect.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Middleware/Security.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Proxy.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/TLS.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/src/Aenebris/Tunnel.hs (100%) rename PROJECTS/{ => advanced}/Aenebris/stack.yaml (100%) rename PROJECTS/{ => advanced}/Aenebris/stack.yaml.lock (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/.style.yapf (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/README.md (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/examples/app.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/examples/docker-compose.yml (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/learn/algorithms.md (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/learn/architecture.md (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/learn/security.md (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/pyproject.toml (99%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/algorithms/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/algorithms/base.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/algorithms/fixed_window.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/algorithms/sliding_window.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/algorithms/token_bucket.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/config.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/defense/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/defense/circuit_breaker.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/defense/layers.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/dependencies.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/exceptions.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/fingerprinting/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/fingerprinting/auth.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/fingerprinting/composite.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/fingerprinting/headers.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/fingerprinting/ip.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/limiter.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/middleware.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/py.typed (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/lua/fixed_window.lua (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/lua/sliding_window.lua (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/lua/token_bucket.lua (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/memory.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/storage/redis_backend.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/src/fastapi_420/types.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/__init__.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/conftest.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_algorithms.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_fingerprinting.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_integration.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_limiter.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_storage.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/tests/test_types.py (100%) rename PROJECTS/{ => advanced}/api-rate-limiter/uv.lock (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/.env.example (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/.gitignore (99%) rename PROJECTS/{ => advanced}/bug-bounty-platform/.pre-commit-config.yaml (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/LICENSE (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/README.md (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/.dockerignore (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/.style.yapf (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/alembic.ini (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/alembic/env.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/alembic/script.py.mako (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py (99%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/alembic/versions/20260106_010122_add_bug_bounty_models.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/__main__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/admin/service.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/RefreshToken.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/auth/service.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/config.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/Base.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/base_repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/base_schema.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/common_schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/constants.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/database.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/enums.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/error_schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/exceptions.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/health_routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/logging.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/rate_limit.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/responses.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/core/security.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/factory.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/middleware/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/middleware/correlation.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/middleware/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/Asset.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/Program.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/RewardTier.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/program/service.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/Attachment.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/Comment.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/Report.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/report/service.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/User.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/dependencies.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/py.typed (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/repository.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/routes.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/schemas.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/app/user/service.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/conftest.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/pyproject.toml (99%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/integration/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/integration/test_admin.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/integration/test_auth.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/integration/test_health.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/integration/test_users.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/tests/unit/__init__.py (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/backend/uv.lock (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/compose.yml (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/dev.compose.yml (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/.dockerignore (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/.gitignore (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/.stylelintignore (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/biome.json (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/index.html (98%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/package.json (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/pnpm-lock.yaml (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/android-chrome-192x192.png (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/android-chrome-512x512.png (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/apple-touch-icon.png (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/favicon-16x16.png (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/favicon-32x32.png (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/public/assets/favicon.ico (100%) rename PROJECTS/{api-security-scanner/frontend/public => advanced/bug-bounty-platform/frontend/public/assets}/site.webmanifest (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/App.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/index.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/useAdmin.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/useAuth.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/usePrograms.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/useReports.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/hooks/useUsers.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/index.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/admin.types.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/auth.types.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/index.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/program.types.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/report.types.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/api/types/user.types.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/config.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/api/api.config.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/api/errors.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/api/index.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/api/query.config.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/app/protected-route.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/app/routers.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/app/shell.module.scss (99%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/app/shell.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/app/toast.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/auth.form.store.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/auth.store.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/index.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/program.form.store.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/settings.form.store.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/core/lib/shell.ui.store.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/main.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/admin.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/programs/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/programs/programs.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/reports/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/reports/reports.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/stats/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/admin/stats/stats.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/inbox/inbox.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/inbox/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/[id]/edit.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/[id]/edit.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/new.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/new.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/programs/programs.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/reports/[id].tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/company/reports/triage.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/dashboard/dashboard.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/dashboard/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/landing/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/landing/landing.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/login/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/login/login.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/[slug]/detail.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/[slug]/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/[slug]/submit.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/[slug]/submit.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/programs/programs.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/register/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/register/register.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/reports/[id]/detail.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/reports/[id]/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/reports/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/reports/reports.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/settings/index.tsx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/routes/settings/settings.module.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles/_fonts.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles/_index.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles/_mixins.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles/_reset.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/src/styles/_tokens.scss (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/stylelint.config.js (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/tsconfig.app.json (100%) rename PROJECTS/{api-security-scanner => advanced/bug-bounty-platform}/frontend/tsconfig.json (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/tsconfig.node.json (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/frontend/vite.config.ts (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/docker/fastapi.dev (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/docker/fastapi.prod (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/docker/frontend-builder.prod (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/docker/vite.dev (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/nginx/dev.nginx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/nginx/nginx.conf (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/nginx/nginx.prod.conf (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/infra/nginx/prod.nginx (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/justfile (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/learn/ARCHITECTURE.md (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/learn/DATABASE.md (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/learn/GETTING-STARTED.md (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/learn/PATTERNS.md (100%) rename PROJECTS/{ => advanced}/bug-bounty-platform/learn/SECURITY.md (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/.env.example (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/.gitignore (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/README.md (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/.dockerignore (100%) rename PROJECTS/{caesar-cipher => advanced/encrypted-p2p-chat/backend}/.style.yapf (100%) mode change 100644 => 100755 rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/alembic.ini (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/alembic/README (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/alembic/env.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/alembic/script.py.mako (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/api/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/api/auth.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/api/encryption.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/api/rooms.py (99%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/api/websocket.py (98%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/config.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/encryption/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/encryption/double_ratchet.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/encryption/x3dh_manager.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/enums.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/exception_handlers.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/exceptions.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/passkey/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/passkey/passkey_manager.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/redis_manager.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/surreal_manager.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/core/websocket_manager.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/factory.py (98%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/main.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/Base.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/Credential.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/IdentityKey.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/OneTimePrekey.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/RatchetState.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/SignedPrekey.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/SkippedMessageKey.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/User.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/models/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/auth.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/common.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/rooms.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/surreal.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/schemas/websocket.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/auth_service.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/message_service.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/prekey_service.py (99%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/presence_service.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/app/services/websocket_service.py (99%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/pyproject.toml (94%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/__init__.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/conftest.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/test_auth_service.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/test_encryption.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/test_message_service.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/tests/test_x3dh.py (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/backend/uv.lock (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/compose.yml (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/docker/dev/fastapi.docker (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/docker/dev/vite.docker (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/docker/prod/fastapi.docker (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/docker/prod/vite.docker (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/nginx/dev.nginx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/nginx/http.conf (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/conf/nginx/prod.nginx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/dev.compose.yml (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/.gitignore (98%) rename PROJECTS/{api-security-scanner => advanced/encrypted-p2p-chat}/frontend/.prettierignore (100%) mode change 100755 => 100644 rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/.prettierrc (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/README.md (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/eslint.config.js (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/index.html (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/package-lock.json (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/package.json (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/App.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Auth/AuthCard.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Auth/AuthForm.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Auth/PasskeyButton.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Auth/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/ChatHeader.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/ChatInput.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/ConversationItem.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/ConversationList.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/EncryptionBadge.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/MessageBubble.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/MessageList.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/NewConversation.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/OnlineStatus.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/TypingIndicator.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/UserSearch.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Chat/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Layout/AppShell.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Layout/Header.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Layout/ProtectedRoute.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Layout/Sidebar.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/Layout/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Avatar.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Badge.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Button.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Dropdown.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/IconButton.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Input.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Modal.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Skeleton.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Spinner.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/TextArea.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Toast.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/Tooltip.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/components/UI/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/config.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/crypto-service.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/double-ratchet.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/key-store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/message-store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/primitives.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/crypto/x3dh.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/index.css (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/index.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/pages/Chat.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/pages/Home.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/pages/Login.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/pages/NotFound.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/pages/Register.tsx (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/services/auth.service.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/services/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/services/room.service.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/auth.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/messages.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/presence.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/rooms.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/session.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/settings.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/typing.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/stores/ui.store.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/api.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/auth.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/chat.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/components.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/encryption.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/guards.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/types/websocket.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/vite-env.d.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/websocket/index.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/websocket/message-handlers.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/src/websocket/websocket-manager.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/tsconfig.json (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/frontend/vite.config.ts (100%) rename PROJECTS/{ => advanced}/encrypted-p2p-chat/justfile (100%) rename PROJECTS/{ => beginner}/caesar-cipher/.gitignore (100%) rename PROJECTS/{encrypted-p2p-chat/backend => beginner/caesar-cipher}/.style.yapf (100%) mode change 100755 => 100644 rename PROJECTS/{ => beginner}/caesar-cipher/Justfile (100%) rename PROJECTS/{ => beginner}/caesar-cipher/pyproject.toml (100%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/__init__.py (99%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/analyzer.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/cipher.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/constants.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/main.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/src/caesar_cipher/utils.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/tests/__init__.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/tests/test_analyzer.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/tests/test_cipher.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/tests/test_cli.py (100%) rename PROJECTS/{ => beginner}/caesar-cipher/uv.lock (100%) rename PROJECTS/{api-security-scanner/backend => beginner/dns-lookup}/.style.yapf (100%) rename PROJECTS/{ => beginner}/dns-lookup/README.md (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/__init__.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/__main__.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/cli.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/output.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/resolver.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/dnslookup/whois_lookup.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/justfile (100%) rename PROJECTS/{ => beginner}/dns-lookup/pyproject.toml (100%) rename PROJECTS/{ => beginner}/dns-lookup/tests/__init__.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/tests/test_resolver.py (100%) rename PROJECTS/{ => beginner}/dns-lookup/uv.lock (100%) rename PROJECTS/{dns-lookup => beginner/keylogger}/.style.yapf (100%) rename PROJECTS/{ => beginner}/keylogger/README.md (100%) rename PROJECTS/{ => beginner}/keylogger/justfile (100%) rename PROJECTS/{ => beginner}/keylogger/keylogger.py (100%) rename PROJECTS/{ => beginner}/keylogger/pyproject.toml (100%) rename PROJECTS/{ => beginner}/keylogger/test_keylogger.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.github/workflows/publish.yml (93%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.github/workflows/test.yml (94%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.gitignore (99%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.python-version (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.style.yapf (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/.yapfignore (66%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/LICENSE (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/README.md (99%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/docker-compose.yml (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/docs/best-practices.md (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/docs/metadata-risks.md (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/pyproject.toml (99%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/pyrightconfig.json (79%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/requirements.txt (99%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/scripts/generate_png_tests.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/commands/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/commands/read.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/commands/scrub.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/commands/verify.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/core/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/core/jpeg_metadata.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/core/png_metadata.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/main.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/batch_processor.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/excel_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/image_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/metadata_factory.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/metadata_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/pdf_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/powerpoint_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/report_generator.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/services/worddoc_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/display.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/exceptions.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/formatter.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/get_target_files.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/src/utils/logger.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_docx/file-sample_1MB.docx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_docx/file-sample_500kB.docx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_images/generated_test_03.png (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_images/generated_test_04.png (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_images/generated_test_05.png (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_images/test_canon.jpg (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_images/test_fuji.jpg (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_pdfs/file-example_PDF_1MB.pdf (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_pdfs/sample.pdf (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_pptx/Extlst-test.pptx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_pptx/sample3.pptx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_1000.xlsx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_5000.xlsx (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/conftest.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/e2e/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/e2e/test_main.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/e2e/test_read_command.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/e2e/test_scrub_command.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/e2e/test_verify_command.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/integration/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/integration/test_metadata_factory.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/__init__.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/test_excel_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/test_image_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/test_pdf_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/test_powerpoint_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/tests/unit/test_worddoc_handler.py (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/__init__.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_common.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_dump.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_exceptions.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_exif.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_insert.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_load.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_remove.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_transplant.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/_webp.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/typings/piexif/helper.pyi (100%) rename PROJECTS/{ => beginner}/metadata-scrubber-tool/uv.lock (100%) rename PROJECTS/{ => beginner}/simple-port-scanner/CMakeLists.txt (100%) rename PROJECTS/{ => beginner}/simple-port-scanner/README.md (99%) rename PROJECTS/{ => beginner}/simple-port-scanner/main.cpp (100%) rename PROJECTS/{ => beginner}/simple-port-scanner/src/PortScanner.cpp (99%) rename PROJECTS/{ => beginner}/simple-port-scanner/src/PortScanner.hpp (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/.gitignore (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/.golangci.yml (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/Justfile (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/README.md (96%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/cmd/angela/main.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/go.mod (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/go.sum (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/cli/output.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/cli/update.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/config/config.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/osv/client.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/osv/client_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/cache.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/cache_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/client.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/client_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/version.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pypi/version_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pyproject/parser.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pyproject/parser_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pyproject/writer.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/pyproject/writer_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/requirements/parser.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/requirements/parser_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/requirements/writer.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/requirements/writer_test.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/ui/banner.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/ui/color.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/ui/spinner.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/internal/ui/symbol.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/learn/GO-CONCURRENCY-PATTERNS.md (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/learn/PEP440-VERSION-PARSING.md (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/learn/TOML-COMMENT-PRESERVATION.md (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/pkg/types/types.go (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/testdata/pyproject.toml (100%) rename PROJECTS/{ => beginner}/simple-vulnerability-scanner/testdata/requirements.txt (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/.env.example (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/.gitignore (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/.pre-commit-config.yaml (100%) rename PROJECTS/{keylogger => intermediate/api-security-scanner/backend}/.style.yapf (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/backend.just (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/config.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/core/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/core/database.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/core/dependencies.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/core/enums.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/core/security.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/factory.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/main.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/models/Base.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/models/Scan.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/models/TestResult.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/models/User.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/models/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/pyproject.toml (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/repositories/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/repositories/scan_repository.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/repositories/test_result_repository.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/repositories/user_repository.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/routes/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/routes/auth.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/routes/scans.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/auth_scanner.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/base_scanner.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/idor_scanner.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/payloads.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/rate_limit_scanner.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/scanners/sqli_scanner.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/schemas/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/schemas/scan_schemas.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/schemas/test_result_schemas.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/schemas/user_schemas.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/services/__init__.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/services/auth_service.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/backend/services/scan_service.py (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/compose.yml (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/docker/dev/fastapi.docker (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/docker/dev/vite.docker (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/docker/prod/fastapi.docker (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/docker/prod/vite.docker (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/nginx/dev.nginx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/nginx/http.conf (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/conf/nginx/prod.nginx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/dev.compose.yml (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/.gitignore (100%) rename PROJECTS/{encrypted-p2p-chat => intermediate/api-security-scanner}/frontend/.prettierignore (100%) mode change 100644 => 100755 rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/.prettierrc.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/.stylelintrc.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/eslint.config.js (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/index.html (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/package-lock.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/package.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/android-chrome-192x192.png (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/android-chrome-512x512.png (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/apple-touch-icon.png (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/favicon-16x16.png (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/favicon-32x32.png (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/public/favicon.ico (100%) rename PROJECTS/{bug-bounty-platform/frontend/public/assets => intermediate/api-security-scanner/frontend/public}/site.webmanifest (96%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/App.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/auth/AuthForm.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/auth/LoginForm.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/auth/RegisterForm.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/Button.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/Button.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/Input.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/Input.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/LoadingOverlay.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/LoadingOverlay.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/common/ProtectedRoute.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/NewScanForm.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/ScanForm.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/ScansList.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/ScansList.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/TestResultCard.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/components/scan/TestResultCard.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/config/constants.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/hooks/useAuth.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/hooks/useScan.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/lib/api.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/lib/errors.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/lib/queryClient.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/lib/utils.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/lib/validation.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/main.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/AuthPage.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/DashboardPage.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/DashboardPage.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/LoginPage.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/RegisterPage.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/ScanResultsPage.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/pages/ScanResultsPage.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/router.tsx (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/services/authService.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/services/scanService.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/store/authStore.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/store/uiStore.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/styles/index.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/styles/variables.css (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/types/auth.types.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/types/guards.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/types/scan.types.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/src/vite-env.d.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/tsconfig.app.json (100%) rename PROJECTS/{bug-bounty-platform => intermediate/api-security-scanner}/frontend/tsconfig.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/tsconfig.node.json (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/frontend/vite.config.ts (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/justfile (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/learn/architecture.md (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/learn/scanning.md (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/learn/vulnerabilities.md (100%) rename PROJECTS/{ => intermediate}/api-security-scanner/package.json (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/.gitignore (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/.golangci.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/LICENSE (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/Makefile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/README.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/cmd/docksec/main.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/go.mod (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/go.sum (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/analyzer.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/compose.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/container.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/container_test.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/daemon.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/dockerfile.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/analyzer/image.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/benchmark/controls.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/config/config.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/config/constants.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/docker/client.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/finding/finding.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/parser/compose.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/parser/dockerfile.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/parser/visitor.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/proc/capabilities.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/proc/proc.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/proc/security.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/report/json.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/report/junit.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/report/reporter.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/report/sarif.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/report/terminal.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/rules/capabilities.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/rules/paths.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/rules/secrets.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/internal/scanner/scanner.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/learn/architecture.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/learn/codebase-guide.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/learn/security-concepts.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/e2e/e2e_test.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/integration/compose_test.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/integration/dockerfile_test.go (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/README.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/TEST-SUMMARY.md (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-caps.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-docker-socket.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-mounts.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-no-limits.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-privileged.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/bad-secrets.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/compose/good-production.yml (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/containers/privileged-container.json (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/containers/secure-container.json (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/bad-add-command.Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/bad-privileged.Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/bad-root-user.Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/bad-secrets.Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/good-minimal.Dockerfile (100%) rename PROJECTS/{ => intermediate}/docker-security-audit/tests/testdata/dockerfiles/good-security.Dockerfile (100%) diff --git a/PROJECTS/Aenebris/.gitignore b/PROJECTS/advanced/Aenebris/.gitignore similarity index 100% rename from PROJECTS/Aenebris/.gitignore rename to PROJECTS/advanced/Aenebris/.gitignore diff --git a/PROJECTS/Aenebris/.style.yapf b/PROJECTS/advanced/Aenebris/.style.yapf similarity index 100% rename from PROJECTS/Aenebris/.style.yapf rename to PROJECTS/advanced/Aenebris/.style.yapf diff --git a/PROJECTS/Aenebris/CHANGELOG.md b/PROJECTS/advanced/Aenebris/CHANGELOG.md similarity index 100% rename from PROJECTS/Aenebris/CHANGELOG.md rename to PROJECTS/advanced/Aenebris/CHANGELOG.md diff --git a/PROJECTS/Aenebris/LICENSE b/PROJECTS/advanced/Aenebris/LICENSE similarity index 100% rename from PROJECTS/Aenebris/LICENSE rename to PROJECTS/advanced/Aenebris/LICENSE diff --git a/PROJECTS/Aenebris/Makefile b/PROJECTS/advanced/Aenebris/Makefile similarity index 100% rename from PROJECTS/Aenebris/Makefile rename to PROJECTS/advanced/Aenebris/Makefile diff --git a/PROJECTS/Aenebris/README.md b/PROJECTS/advanced/Aenebris/README.md similarity index 100% rename from PROJECTS/Aenebris/README.md rename to PROJECTS/advanced/Aenebris/README.md diff --git a/PROJECTS/Aenebris/Setup.hs b/PROJECTS/advanced/Aenebris/Setup.hs similarity index 100% rename from PROJECTS/Aenebris/Setup.hs rename to PROJECTS/advanced/Aenebris/Setup.hs diff --git a/PROJECTS/Aenebris/WHITEPAPER b/PROJECTS/advanced/Aenebris/WHITEPAPER similarity index 99% rename from PROJECTS/Aenebris/WHITEPAPER rename to PROJECTS/advanced/Aenebris/WHITEPAPER index dc1b9d47..d4cbe3c2 100644 --- a/PROJECTS/Aenebris/WHITEPAPER +++ b/PROJECTS/advanced/Aenebris/WHITEPAPER @@ -5,7 +5,7 @@ Technical White Paper & Development Roadmap Version: 0.1.0 - Date: 2025-11-12 - Project Name: Ᾰenebris + Date: 2025-11-12 - Project Name: Ᾰenebris --- Abstract diff --git a/PROJECTS/Aenebris/aenebris.cabal b/PROJECTS/advanced/Aenebris/aenebris.cabal similarity index 100% rename from PROJECTS/Aenebris/aenebris.cabal rename to PROJECTS/advanced/Aenebris/aenebris.cabal diff --git a/PROJECTS/Aenebris/app/Main.hs b/PROJECTS/advanced/Aenebris/app/Main.hs similarity index 100% rename from PROJECTS/Aenebris/app/Main.hs rename to PROJECTS/advanced/Aenebris/app/Main.hs diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/config-design.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/config-design.md similarity index 97% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/config-design.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/config-design.md index 07666ffe..ffa048ce 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/config-design.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/config-design.md @@ -68,14 +68,14 @@ Dhall represents a paradigm shift—a non-Turing-complete functional language sp ```dhall -- types.dhall -let DatabaseConfig = - { Type = +let DatabaseConfig = + { Type = { host : Text , port : Natural , maxConnections : Natural , replica : Optional DatabaseConfig.Type } - , default = + , default = { host = "localhost" , port = 5432 , maxConnections = 20 @@ -87,7 +87,7 @@ let DatabaseConfig = let DB = ./types.dhall let staging = ./staging.dhall -in DB::{ +in DB::{ , host = "prod-db.internal" , port = 5432 , maxConnections = 100 @@ -133,11 +133,11 @@ data ServiceConfig = ServiceConfig -- Type-safe DSL in Haskell myService :: ServiceConfig myService = ServiceConfig - { routes = + { routes = [ route "/api" GET apiHandler , route "/health" GET healthCheck ] - , middleware = + , middleware = [ cors allowAll , logging Verbose , auth jwtValidator @@ -205,7 +205,7 @@ let identity : ∀(a : Type) → a → a = λ(a : Type) → λ(x : a) → x -- Type-safe record construction -let Config : Type = +let Config : Type = { apiKey : Text , endpoints : List { url : Text, port : Natural } , retries : Optional Natural @@ -270,7 +270,7 @@ watchConfigFile = withManager $ \mgr -> do "." (\event -> "config.yaml" `isSuffixOf` eventPath event) handleConfigChange - + forever $ threadDelay 1000000 handleConfigChange :: Event -> IO () @@ -370,7 +370,7 @@ updateConfigs :: TVar AppConfig -> TVar CacheConfig -> IO () updateConfigs appVar cacheVar = atomically $ do app <- readTVar appVar cache <- readTVar cacheVar - + -- Both updates happen atomically or retry writeTVar appVar (app { maxConnections = 100 }) writeTVar cacheVar (cache { ttl = 3600 }) @@ -418,16 +418,16 @@ initConfigManager path = do Right config -> do currentRef <- newIORef config lastValidRef <- newIORef config - + mgr <- startManager - + let manager = ConfigManager currentRef lastValidRef path mgr - + -- Start watching - _ <- watchDir mgr (takeDirectory path) - (matchesFile path) + _ <- watchDir mgr (takeDirectory path) + (matchesFile path) (handleReload manager) - + return $ Right manager where matchesFile target event = target == eventPath event @@ -444,27 +444,27 @@ handleReload manager event = do -- Save current as last valid current <- readIORef (currentConfig manager) writeIORef (lastValidConfig manager) current - + -- Atomic swap to new config atomicWriteIORef (currentConfig manager) newConfig - + logInfo "Config reloaded successfully" else logError "Validation failed, keeping old config" - + Left err -> do logError $ "Reload failed: " ++ err -- Keep running with old config where tryReload :: FilePath -> IO (Either String AppConfig) - tryReload path = + tryReload path = catch (eitherDecodeFileStrict path) (\(e :: SomeException) -> return $ Left $ show e) - + validateConfig :: AppConfig -> Bool - validateConfig cfg = + validateConfig cfg = -- Custom validation logic - not (null $ apiKeys cfg) + not (null $ apiKeys cfg) && all isValidEndpoint (databaseEndpoints $ database cfg) -- Access config safely from multiple threads @@ -484,7 +484,7 @@ debounceReload :: IORef UTCTime -> NominalDiffTime -> IO () -> IO () debounceReload lastReloadRef minInterval action = do now <- getCurrentTime lastReload <- readIORef lastReloadRef - + when (diffUTCTime now lastReload > minInterval) $ do writeIORef lastReloadRef now action @@ -502,7 +502,7 @@ data DatabasePool = DatabasePool rotatePoolCredentials :: DatabasePool -> Credentials -> IO () rotatePoolCredentials dbPool newCreds = do atomicWriteIORef (credentials dbPool) newCreds - + -- Drain old connections gradually -- New connections use new credentials from IORef drainPool (pool dbPool) gracefulDrainSeconds @@ -556,7 +556,7 @@ loadConfigFailFast path = do ```haskell import Data.Validation -data ValidationError = +data ValidationError = InvalidPort Int | MissingField Text | InvalidFormat Text Text @@ -571,7 +571,7 @@ validateConfig raw = Config validatePort p | p > 0 && p < 65536 = Success p | otherwise = Failure [InvalidPort p] - + validateHost h | not (T.null h) = Success h | otherwise = Failure [MissingField "host"] @@ -595,23 +595,23 @@ loadConfigGraceful path = do Left err -> do logWarning $ "Config parse error, using defaults: " ++ err return defaultConfig - + Right rawConfig -> do -- Core settings must be valid core <- case validateCore rawConfig of Left errors -> error $ "Core config invalid: " ++ show errors Right validated -> return validated - + -- Optional features use defaults on error features <- case validateFeatures rawConfig of Left errors -> do logWarning $ "Feature config invalid, using defaults: " ++ show errors return defaultFeatures Right validated -> return validated - + -- Experimental flags filter out invalid entries let flags = filterValidFlags (rawExperimental rawConfig) - + return $ ConfigWithDefaults core features flags ``` @@ -656,15 +656,15 @@ instance FromJSON ServerConfig where rawPort <- o .: "port" when (rawPort < 1 || rawPort > 65535) $ fail $ "Invalid port: " ++ show rawPort - + host <- o .: "host" when (T.null host) $ fail "Host cannot be empty" - + workers <- o .:? "workers" .!= 4 -- Default to 4 when (workers < 1 || workers > 1000) $ fail $ "Invalid worker count: " ++ show workers - + return $ ServerConfig rawPort host workers ``` @@ -729,9 +729,9 @@ interpolateEnvVars template = do let varName = T.drop 2 $ T.dropEnd 1 match -- Strip ${ } maybeValue <- lookupEnv (T.unpack varName) case maybeValue of - Just value -> + Just value -> return $ Right $ T.replace match (T.pack value) txt - Nothing -> + Nothing -> return $ Left $ "Undefined variable: " ++ T.unpack varName -- With defaults @@ -755,7 +755,7 @@ import System.Envy data AppConfig = AppConfig { appDatabaseUrl :: String -- DATABASE_URL - , appRedisHost :: String -- REDIS_HOST + , appRedisHost :: String -- REDIS_HOST , appPort :: Int -- PORT , appDebug :: Bool -- DEBUG , appLogLevel :: Maybe LogLevel -- LOG_LEVEL (optional) @@ -787,9 +787,9 @@ main = do import Options.Applicative import qualified Data.Yaml as Y -data ConfigSource = +data ConfigSource = CLIConfig Config - | EnvConfig Config + | EnvConfig Config | FileConfig Config | DefaultConfig Config @@ -804,7 +804,7 @@ mergeConfigs sources = foldl merge defaultConfig sources merge base (EnvConfig env) = base { port = port env `orDefault` port base } merge base (FileConfig file) = base { port = port file `orDefault` port base } merge base (DefaultConfig _) = base - + orDefault :: Maybe a -> a -> a orDefault = fromMaybe @@ -813,29 +813,29 @@ loadLayeredConfig :: IO Config loadLayeredConfig = do -- 1. Load defaults let defaults = defaultConfig - + -- 2. Load system config systemCfg <- loadSystemConfig `catch` \(_ :: IOException) -> return Nothing - - -- 3. Load project config + + -- 3. Load project config projectCfg <- loadProjectConfig `catch` \(_ :: IOException) -> return Nothing - + -- 4. Load local config localCfg <- Y.decodeFileEither "config.yaml" >>= \case Left _ -> return Nothing Right cfg -> return $ Just cfg - + -- 5. Load environment variables envCfg <- decodeEnv :: IO (Either String EnvConfig) let env = either (const Nothing) Just envCfg - + -- 6. Parse CLI args cliCfg <- execParser cliParser - + -- Merge with precedence - return $ mergeConfigs + return $ mergeConfigs [ maybe DefaultConfig FileConfig systemCfg - , maybe DefaultConfig FileConfig projectCfg + , maybe DefaultConfig FileConfig projectCfg , maybe DefaultConfig FileConfig localCfg , maybe DefaultConfig EnvConfig env , CLIConfig cliCfg @@ -852,7 +852,7 @@ newtype SafeEnvValue = SafeEnvValue Text validateEnvValue :: Text -> Either String SafeEnvValue validateEnvValue value | T.any isControlChar value = Left "Control characters not allowed" - | T.any (== ';') value = Left "Semicolons not allowed" + | T.any (== ';') value = Left "Semicolons not allowed" | T.any (== '|') value = Left "Pipes not allowed" | otherwise = Right $ SafeEnvValue value where @@ -903,10 +903,10 @@ loadSecrets :: VaultConnection -> IO (Either String AppSecrets) loadSecrets conn = do -- Get database credentials dbResult <- getSecret conn (SecretPath "myapp/database") Nothing - + -- Get API keys apiResult <- getSecret conn (SecretPath "myapp/api-keys") Nothing - + case (dbResult, apiResult) of (Right dbData, Right apiData) -> do let dbCreds = parseCredentials $ fromSecretData dbData @@ -923,7 +923,7 @@ updateSecret conn = do NoCheckAndSet (SecretPath "myapp/database") (toSecretData [("password", newPassword), ("username", "admin")]) - + case result of Right version -> putStrLn $ "Updated to version " ++ show version Left err -> putStrLn $ "Update failed: " ++ err @@ -966,14 +966,14 @@ loadDatabaseConfig :: IO (Either String DatabaseConfig) loadDatabaseConfig = do -- Discover credentials (IAM role, env vars, etc.) env <- newEnv discover - + -- Request secret let req = newGetSecretValue "production/database" resp <- runResourceT $ send env req - + -- Extract and parse case resp ^. getSecretValueResponse_secretString of - Just jsonString -> + Just jsonString -> case A.eitherDecode (encodeUtf8 jsonString) of Right config -> return $ Right config Left err -> return $ Left $ "Parse error: " ++ err @@ -983,13 +983,13 @@ loadDatabaseConfig = do rotateSecret :: Text -> IO () rotateSecret secretId = do env <- newEnv discover - + let req = newRotateSecret secretId & rotateSecret_rotationLambdaARN ?~ lambdaArn - & rotateSecret_rotationRules ?~ + & rotateSecret_rotationRules ?~ newRotationRulesType & rotationRulesType_automaticallyAfterDays ?~ 30 - + _ <- runResourceT $ send env req putStrLn "Rotation initiated" ``` @@ -1038,7 +1038,7 @@ withRotatingCreds rc action = do Just prev -> action prev -- Fallback during rotation window Nothing -> throwIO RotationError where - tryAction creds = + tryAction creds = catch (Right <$> action creds) (\(e :: SomeException) -> return $ Left e) @@ -1047,22 +1047,22 @@ rotationLoop :: IORef RotatingCredentials -> VaultConnection -> IO () rotationLoop credsRef vault = forever $ do currentTime <- getCurrentTime creds <- readIORef credsRef - + when (shouldRotate currentTime (rotationTime creds)) $ do -- Fetch new credentials newCreds <- fetchDynamicCreds vault - + -- Update with both old and new atomicModifyIORef' credsRef $ \old -> (RotatingCredentials newCreds (Just $ currentCreds old) currentTime, ()) - + threadDelay (5 * 60 * 1000000) -- Check every 5 minutes -- Vault dynamic secrets with lease renewal requestDynamicCredentials :: VaultConnection -> IO DynamicDBCredentials requestDynamicCredentials conn = do result <- vaultRead conn (VaultSecretPath "database/creds/readonly") - + case result of (metadata, Right creds) -> do -- Schedule renewal before expiration @@ -1074,7 +1074,7 @@ renewLeaseLoop :: VaultConnection -> Text -> Int -> IO () renewLeaseLoop conn leaseId duration = do let renewInterval = duration `div` 2 -- Renew at halfway point threadDelay (renewInterval * 1000000) - + success <- renewLease conn leaseId if success then renewLeaseLoop conn leaseId duration -- Continue renewing @@ -1086,7 +1086,7 @@ renewLeaseLoop conn leaseId duration = do ```haskell -- Never store secrets in code or config files -- ❌ DON'T DO THIS -apiKey = "sk_live_abc123xyz" +apiKey = "sk_live_abc123xyz" -- ✅ Load from secure source loadSecrets :: IO Secrets @@ -1222,12 +1222,12 @@ databaseCodec = DatabaseConfig ```dhall -- types/Database.dhall -let PoolConfig = { Type = +let PoolConfig = { Type = { minConnections : Natural , maxConnections : Natural , idleTimeout : Natural } -, default = +, default = { minConnections = 5 , maxConnections = 20 , idleTimeout = 30 @@ -1259,11 +1259,11 @@ in DatabaseConfig -- config/production.dhall let DB = ../types/Database.dhall -in DB::{ +in DB::{ , host = "prod-db.internal" , name = "production_db" , pool = DB.default.pool // { maxConnections = 100 } - , replicas = + , replicas = [ { host = "replica1.internal", port = 5432 } , { host = "replica2.internal", port = 5432 } ] @@ -1295,12 +1295,12 @@ initFeatureFlags :: FilePath -> IO FeatureFlagManager initFeatureFlags path = do initial <- loadFeatureFlags path flagsRef <- newIORef initial - + let manager = FeatureFlagManager flagsRef path - + -- Watch for changes _ <- forkIO $ watchAndReload manager - + return manager where loadFeatureFlags :: FilePath -> IO FeatureFlags @@ -1359,25 +1359,25 @@ loadConfig = do Just "production" -> Production Just "staging" -> Staging _ -> Development - + -- Load shared config shared <- decodeFileThrow "config/shared.yaml" - + -- Load environment-specific config let envFile = case env of Development -> "config/development.yaml" - Staging -> "config/staging.yaml" + Staging -> "config/staging.yaml" Production -> "config/production.yaml" - + envSpecific <- decodeFileThrow envFile - + -- Merge with env vars (highest precedence) envOverrides <- decodeEnv :: IO (Either String EnvOverrides) - + let finalConfig = case envOverrides of Right overrides -> applyOverrides envSpecific overrides Left _ -> envSpecific - + return $ MultiEnvConfig shared env finalConfig ``` @@ -1424,7 +1424,7 @@ handleReload event = do result <- try $ decodeFile path case result of Right newConfig -> atomicWriteIORef configRef newConfig - Left (err :: SomeException) -> + Left (err :: SomeException) -> logError $ "Reload failed, keeping old config: " ++ show err ``` @@ -1496,7 +1496,7 @@ let baseService = ./types/Service.dhall let makeServiceConfig = λ(name : Text) → λ(port : Natural) → baseService::{ name = name, port = port } -in { services = +in { services = [ makeServiceConfig "api" 8080 , makeServiceConfig "auth" 8081 -- ... 48 more services with consistent structure diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md similarity index 99% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md index 916e02cd..8731286f 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md @@ -189,16 +189,16 @@ Nginx's event-based architecture provides inherent resistance to connection exha http { # Time to read client request header client_header_timeout 10s; - + # Time between successive body data reads client_body_timeout 10s; - + # Keep-alive connection timeout keepalive_timeout 15s; - + # Time between successive writes to client send_timeout 10s; - + # Buffer limits prevent memory exhaustion client_body_buffer_size 128k; client_header_buffer_size 2k; @@ -228,19 +228,19 @@ LoadModule qos_module modules/mod_qos.so # Track 500,000 unique client IPs (150 bytes per entry) QS_ClientEntries 500000 - + # Maximum 20 concurrent connections per IP QS_SrvMaxConnPerIP 20 - + # Maximum 512 total active connections QS_SrvMaxConn 512 - + # Disable keep-alive when 400 connections active QS_SrvMaxConnClose 400 - + # Minimum data rates: 200 bytes/sec download, 1500 upload QS_SrvMinDataRate 200 1500 - + # Protect resource-intensive endpoints QS_LocRequestLimit "/login" 5 QS_LocRequestLimit "/admin" 3 @@ -264,15 +264,15 @@ http { limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; - + server { # Global: 10 concurrent connections per IP limit_conn addr 10; - + location / { limit_req zone=general burst=20 nodelay; } - + location /login { # Aggressive limits for authentication limit_conn addr 3; @@ -521,20 +521,20 @@ SEC("xdp") int ddos_protection(struct xdp_md *ctx) { void *data_end = (void *)(long)ctx->data_end; void *data = (void *)(long)ctx->data; - + // Parse Ethernet header struct ethhdr *eth = data; if ((void *)(eth + 1) > data_end) return XDP_PASS; if (eth->h_proto != __constant_htons(ETH_P_IP)) return XDP_PASS; - + // Parse IP header struct iphdr *iph = (void *)(eth + 1); if ((void *)(iph + 1) > data_end) return XDP_PASS; - + __u32 src_ip = iph->saddr; struct rate_limit_entry *entry = bpf_map_lookup_elem(&rate_limit_map, &src_ip); __u64 current_time = bpf_ktime_get_ns(); - + if (entry) { if (current_time - entry->last_update < TIME_WINDOW_NS) { entry->packet_count++; @@ -1099,7 +1099,7 @@ groups: for: 2m annotations: summary: "High SYN rate detected" - + - alert: ConntrackTableFull expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.9 for: 5m diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/deployment.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/deployment.md similarity index 98% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/deployment.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/deployment.md index a60d520e..1ab5f568 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/deployment.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/deployment.md @@ -269,14 +269,14 @@ For complex dependencies, Nix provides reproducible static builds. let pkgs = import {}; pkgsMusl = pkgs.pkgsMusl; - + staticLibs = [ (pkgsMusl.gmp6.override { withStatic = true; }) pkgsMusl.zlib.static (pkgsMusl.libffi.overrideAttrs (old: { dontDisableStatic = true; })) (pkgsMusl.openssl.override { static = true; }) ]; - + in pkgsMusl.haskellPackages.aenebris.overrideAttrs (old: { enableSharedExecutables = false; enableSharedLibraries = false; @@ -384,7 +384,7 @@ packages: . package * ghc-options: -O2 -split-sections gcc-options: -Os -ffunction-sections -fdata-sections - + package aenebris ld-options: -Wl,--gc-sections ghc-options: -funbox-strict-fields -fllvm @@ -442,13 +442,13 @@ spec: spec: # Service account for RBAC serviceAccountName: aenebris - + # Security context securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 - + # Topology spread for high availability topologySpreadConstraints: - maxSkew: 1 @@ -463,7 +463,7 @@ spec: labelSelector: matchLabels: app: aenebris - + # Node affinity for dedicated nodes affinity: nodeAffinity: @@ -474,7 +474,7 @@ spec: - key: workload-type operator: In values: [proxy, edge] - + # Pod anti-affinity podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: @@ -484,15 +484,15 @@ spec: matchLabels: app: aenebris topologyKey: kubernetes.io/hostname - + # Graceful shutdown - CRITICAL for WebSockets terminationGracePeriodSeconds: 120 - + containers: - name: aenebris image: ghcr.io/yourorg/aenebris:1.0.0 imagePullPolicy: IfNotPresent - + # Ports ports: - name: http @@ -504,7 +504,7 @@ spec: - name: metrics containerPort: 9090 protocol: TCP - + # Haskell RTS configuration for high performance command: - /usr/local/bin/aenebris @@ -519,14 +519,14 @@ spec: - "-RTS" - "--config" - "/etc/aenebris/config.yaml" - + # Environment variables env: - name: LOG_LEVEL value: "info" - name: METRICS_PORT value: "9090" - + # Resource requests and limits resources: requests: @@ -535,7 +535,7 @@ spec: limits: cpu: "8000m" # Burst to 8 cores memory: "4Gi" # Hard limit - + # Volume mounts volumeMounts: - name: config @@ -549,7 +549,7 @@ spec: readOnly: true - name: tmp mountPath: /tmp - + # Startup probe (slow initial startup) startupProbe: httpGet: @@ -561,7 +561,7 @@ spec: timeoutSeconds: 1 failureThreshold: 30 # 60 seconds max startup time successThreshold: 1 - + # Liveness probe (detect deadlocks) livenessProbe: httpGet: @@ -573,7 +573,7 @@ spec: timeoutSeconds: 2 failureThreshold: 3 successThreshold: 1 - + # Readiness probe (traffic management) readinessProbe: httpGet: @@ -585,7 +585,7 @@ spec: timeoutSeconds: 2 failureThreshold: 2 successThreshold: 1 - + # PreStop hook for graceful shutdown lifecycle: preStop: @@ -599,7 +599,7 @@ spec: kill -TERM 1 # Wait for connections to drain (110s, leaving 10s buffer) sleep 110 - + # Security context securityContext: allowPrivilegeEscalation: false @@ -609,7 +609,7 @@ spec: capabilities: drop: ["ALL"] add: ["NET_BIND_SERVICE"] - + volumes: - name: config configMap: @@ -683,7 +683,7 @@ spec: target: type: Utilization averageUtilization: 70 - + # Memory-based scaling - type: Resource resource: @@ -691,7 +691,7 @@ spec: target: type: Utilization averageUtilization: 80 - + # Custom metric: requests per second - type: Pods pods: @@ -700,7 +700,7 @@ spec: target: type: AverageValue averageValue: "2000" # 2k req/s per pod - + # Custom metric: active connections - type: Pods pods: @@ -709,7 +709,7 @@ spec: target: type: AverageValue averageValue: "1000" # 1k connections per pod - + # Scaling behavior behavior: scaleUp: @@ -971,7 +971,7 @@ probes: timeoutSeconds: 1 failureThreshold: 30 successThreshold: 1 - + liveness: httpGet: path: /healthz @@ -981,7 +981,7 @@ probes: timeoutSeconds: 2 failureThreshold: 3 successThreshold: 1 - + readiness: httpGet: path: /ready @@ -1009,12 +1009,12 @@ config: enabled: true path: "/health" interval: "10s" - + rateLimit: enabled: true requestsPerSecond: 1000 burst: 2000 - + tls: enabled: true minVersion: "1.2" @@ -1022,7 +1022,7 @@ config: - "TLS_AES_256_GCM_SHA384" - "TLS_AES_128_GCM_SHA256" - "TLS_CHACHA20_POLY1305_SHA256" - + websocket: enabled: true pingInterval: "30s" @@ -1041,7 +1041,7 @@ tls: secrets: upstreamCredentials: existingSecret: "aenebris-upstream-creds" - + # Network policies networkPolicy: enabled: true @@ -1496,7 +1496,7 @@ spec: timeoutSeconds: 1 failureThreshold: 30 # 5s + (30 * 2s) = 65s max successThreshold: 1 - + # Liveness probe - detects deadlocks livenessProbe: httpGet: @@ -1511,7 +1511,7 @@ spec: timeoutSeconds: 2 failureThreshold: 3 # Restart after 30s of failures successThreshold: 1 - + # Readiness probe - traffic management readinessProbe: httpGet: @@ -1541,15 +1541,15 @@ lifecycle: - | # Stop accepting new connections echo "Graceful shutdown initiated at $(date)" - + # Send SIGTERM to application (it should stop accepting) kill -TERM 1 - + # Wait for existing connections to drain # (110 seconds, leaving 10s buffer before SIGKILL) echo "Waiting for connections to drain..." sleep 110 - + echo "Shutdown complete at $(date)" ``` @@ -1575,23 +1575,23 @@ main :: IO () main = do shutdownFlag <- newTVarIO False setupGracefulShutdown shutdownFlag - + -- Start server in separate thread serverThread <- async $ runServer shutdownFlag - + -- Wait for shutdown signal atomically $ do shutdown <- readTVar shutdownFlag unless shutdown retry - + putStrLn "Stopping server, draining connections..." - + -- Stop accepting new connections stopAcceptingConnections - + -- Wait for existing connections to complete waitForConnectionsDrain 110 -- 110 seconds - + putStrLn "All connections drained, exiting" waitForConnectionsDrain :: Int -> IO () @@ -1617,10 +1617,10 @@ metadata: # AWS NLB service.beta.kubernetes.io/aws-load-balancer-connection-draining-enabled: "true" service.beta.kubernetes.io/aws-load-balancer-connection-draining-timeout: "120" - + # GCP cloud.google.com/neg: '{"ingress": true}' - + spec: sessionAffinity: ClientIP sessionAffinityConfig: @@ -1783,7 +1783,7 @@ sum(websocket_connections_total) by (pod) rate(container_cpu_cfs_throttled_seconds_total{pod=~"aenebris.*"}[5m]) # Memory usage vs limit -container_memory_usage_bytes{pod=~"aenebris.*"} / +container_memory_usage_bytes{pod=~"aenebris.*"} / container_spec_memory_limit_bytes{pod=~"aenebris.*"} ``` @@ -1853,14 +1853,14 @@ kubectl delete certificate aenebris-tls -n production This comprehensive deployment guide provides a production-ready foundation for deploying Ᾰenebris on Kubernetes. The architecture achieves: -✅ **Ultra-minimal Docker images** (15-50MB) via multi-stage builds and static linking -✅ **High availability** with topology spread, pod disruption budgets, and anti-affinity -✅ **Zero-downtime deployments** through graceful shutdown and connection draining -✅ **Automated TLS management** with cert-manager -✅ **Secure secrets handling** via External Secrets Operator and Sealed Secrets -✅ **Production-grade monitoring** with Prometheus and Grafana -✅ **Dynamic scaling** from 5 to 50 replicas based on traffic -✅ **WebSocket support** with proper connection management +✅ **Ultra-minimal Docker images** (15-50MB) via multi-stage builds and static linking +✅ **High availability** with topology spread, pod disruption budgets, and anti-affinity +✅ **Zero-downtime deployments** through graceful shutdown and connection draining +✅ **Automated TLS management** with cert-manager +✅ **Secure secrets handling** via External Secrets Operator and Sealed Secrets +✅ **Production-grade monitoring** with Prometheus and Grafana +✅ **Dynamic scaling** from 5 to 50 replicas based on traffic +✅ **WebSocket support** with proper connection management **Next Steps:** 1. Customize values.yaml for your environment diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/haskell-networking.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/haskell-networking.md similarity index 97% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/haskell-networking.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/haskell-networking.md index d48308a5..b2d3b8c7 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/haskell-networking.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/haskell-networking.md @@ -194,7 +194,7 @@ bingExample = do ### WaiProxyResponse type ```haskell -data WaiProxyResponse +data WaiProxyResponse = WPRResponse WAI.Response -- Return custom response | WPRProxyDest ProxyDest -- Forward to destination | WPRModifiedRequest WAI.Request ProxyDest -- Modify then forward @@ -245,7 +245,7 @@ proxyApp manager request respond = do else give chunk >> loop in loop } - + -- Make the request and forward response httpLbs proxiedReq manager >>= \response -> respond $ responseLBS @@ -257,7 +257,7 @@ proxyApp manager request respond = do fixHeaders :: RequestHeaders -> RequestHeaders fixHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders where - hopByHopHeaders = + hopByHopHeaders = [ "connection", "keep-alive", "proxy-authenticate" , "proxy-authorization", "te", "trailers" , "transfer-encoding", "upgrade" @@ -266,7 +266,7 @@ fixHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders fixResponseHeaders :: ResponseHeaders -> ResponseHeaders fixResponseHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders where - hopByHopHeaders = + hopByHopHeaders = [ "connection", "keep-alive", "proxy-authenticate" , "proxy-authorization", "te", "trailers" , "transfer-encoding", "upgrade" @@ -286,7 +286,7 @@ main = do ```haskell -- Add X-Forwarded-For header addForwardedFor :: Request -> RequestHeaders -> RequestHeaders -addForwardedFor req headers = +addForwardedFor req headers = let clientIP = show (remoteHost req) existing = lookup "X-Forwarded-For" headers newValue = case existing of @@ -369,7 +369,7 @@ import Network.HTTP.Types import Data.ByteString.Builder (byteString) app :: Application -app _req respond = respond $ +app _req respond = respond $ responseStream status200 [("Content-Type", "text/plain")] $ \write flush -> do write $ byteString "Hello\n" flush @@ -388,10 +388,10 @@ import Data.Function (fix) import Control.Monad (unless) streamFileApp :: Application -streamFileApp _req respond = +streamFileApp _req respond = withBinaryFile "largefile.txt" ReadMode $ \h -> - respond $ responseStream status200 [("Content-Type", "text/plain")] $ - \chunk _flush -> + respond $ responseStream status200 [("Content-Type", "text/plain")] $ + \chunk _flush -> fix $ \loop -> do bs <- B.hGetSome h 4096 -- Only 4KB in memory at once unless (B.null bs) $ do @@ -414,17 +414,17 @@ import qualified Data.ByteString.Char8 as C8 sseApp :: Application sseApp _req sendResponse = sendResponse $ - responseStream status200 + responseStream status200 [("Content-Type", "text/event-stream"), ("Cache-Control", "no-cache"), - ("Connection", "keep-alive")] + ("Connection", "keep-alive")] myStream myStream :: (Builder -> IO ()) -> IO () -> IO () myStream send flush = do send $ byteString "data: Starting streaming response.\n\n" flush - + forM_ [1..50 :: Int] $ \i -> do threadDelay 1000000 -- 1 second send $ byteString "data: Message " <> byteString (C8.pack $ show i) <> byteString "\n\n" @@ -464,10 +464,10 @@ main = do -- Pure operations result <- runConduit $ yieldMany [1..10] .| sumC print result -- 55 - + -- File operations - runConduitRes $ - sourceFile "input.txt" .| + runConduitRes $ + sourceFile "input.txt" .| sinkFile "output.txt" ``` @@ -480,8 +480,8 @@ import qualified Data.Conduit.Binary as CB import Control.Monad.Trans.Resource conduitFileApp :: Application -conduitFileApp _req respond = - respond $ responseStream status200 [("Content-Type", "text/plain")] $ +conduitFileApp _req respond = + respond $ responseStream status200 [("Content-Type", "text/plain")] $ \write flush -> runResourceT $ do CB.sourceFile "largefile.txt" $$ CB.mapM_ $ \chunk -> liftIO $ do write (byteString chunk) @@ -498,8 +498,8 @@ import qualified Data.Conduit.List as CL streamFromDB :: Handler () streamFromDB = do -- selectSource returns a conduit Source - selectSource [] [] - $$ CL.mapM_ $ \(Entity _ record) -> + selectSource [] [] + $$ CL.mapM_ $ \(Entity _ record) -> liftIO $ processRecord record ``` @@ -531,8 +531,8 @@ import Data.Conduit import qualified Data.Conduit.List as CL sumConduit :: IO Int -sumConduit = runConduit $ - yieldMany [1..10] .| +sumConduit = runConduit $ + yieldMany [1..10] .| CL.fold (+) 0 ``` @@ -589,17 +589,17 @@ generateCSV write flush = do -- Header write $ byteString "id,name,value\n" flush - + -- Generate 1 million rows without buffering forM_ [1..1000000] $ \i -> do - let row = byteString $ C8.pack $ + let row = byteString $ C8.pack $ show i ++ ",Item" ++ show i ++ "," ++ show (i * 100) ++ "\n" write row when (i `mod` 1000 == 0) flush csvApp :: Application csvApp _req respond = respond $ - responseStream status200 + responseStream status200 [("Content-Type", "text/csv"), ("Content-Disposition", "attachment; filename=data.csv")] generateCSV @@ -611,19 +611,19 @@ csvApp _req respond = respond $ processWithProgress :: (Builder -> IO ()) -> IO () -> IO () processWithProgress write flush = do let total = 100 - + forM_ [1..total] $ \i -> do threadDelay 100000 -- Simulate work - - let progress = byteString $ - "data: {\"progress\": " <> - byteString (C8.pack $ show i) <> - ", \"total\": " <> - byteString (C8.pack $ show total) <> + + let progress = byteString $ + "data: {\"progress\": " <> + byteString (C8.pack $ show i) <> + ", \"total\": " <> + byteString (C8.pack $ show total) <> "}\n\n" write progress flush - + write $ byteString "data: {\"status\": \"complete\"}\n\n" flush ``` @@ -725,7 +725,7 @@ application state pending = do client = (T.drop (T.length prefix) msg, conn) disconnect = do s <- modifyMVar state $ \s -> - let s' = filter ((/= fst client) . fst) s + let s' = filter ((/= fst client) . fst) s in return (s', s') broadcast (fst client <> " disconnected") s @@ -798,9 +798,9 @@ advancedTLS = do } , onInsecure = DenyInsecure "This server requires HTTPS" } - + warpOpts = setPort 443 $ setHost "0.0.0.0" $ defaultSettings - + runTLS tlsOpts warpOpts app validateClientCert :: CertificateChain -> IO CertificateUsage @@ -821,7 +821,7 @@ secureTLS = do let tlsOpts = tlsSettings "cert.pem" "key.pem" warpOpts = setPort 443 defaultSettings wsApp = websocketsOr WS.defaultConnectionOptions wsHandler httpApp - + runTLS tlsOpts warpOpts wsApp wsHandler :: WS.ServerApp @@ -844,7 +844,7 @@ dynamicCerts = do Just "example.com" -> loadCredentials "example.pem" "example-key.pem" Just "other.com" -> loadCredentials "other.pem" "other-key.pem" _ -> loadCredentials "default.pem" "default-key.pem" - + runTLS tlsOpts defaultSettings app loadCredentials :: FilePath -> FilePath -> IO Credentials @@ -909,7 +909,7 @@ gracefulShutdown = do let settings = setInstallShutdownHandler shutdownHandler $ setGracefulShutdownTimeout (Just 30) -- 30 seconds max $ setPort 8080 defaultSettings - + runSettings settings app where shutdownHandler closeSocket = do @@ -935,7 +935,7 @@ gracefulShutdown = do {-# LANGUAGE OverloadedStrings #-} productionSettings :: Settings -productionSettings = +productionSettings = setPort 443 $ setHost "*" $ setOnOpen onOpen @@ -953,13 +953,13 @@ productionSettings = onOpen sockAddr = do putStrLn $ "Connection: " ++ show sockAddr return True - - onClose sockAddr = + + onClose sockAddr = putStrLn $ "Closed: " ++ show sockAddr - - onException _ e = + + onException _ e = putStrLn $ "Exception: " ++ show e - + shutdownHandler closeSocket = do _ <- installHandler sigTERM (Catch closeSocket) Nothing _ <- installHandler sigINT (Catch closeSocket) Nothing @@ -1023,16 +1023,16 @@ websocketHandler pending = do -- HTTP handler (including streaming) httpHandler :: Application -httpHandler req respond = +httpHandler req respond = case pathInfo req of ["stream"] -> respond $ streamingResponse ["ws"] -> respond $ responseLBS status404 [] "Use WebSocket protocol" _ -> respond $ responseLBS status200 [] "Hello HTTP" streamingResponse :: Response -streamingResponse = responseStream - status200 - [("Content-Type", "text/event-stream")] +streamingResponse = responseStream + status200 + [("Content-Type", "text/event-stream")] $ \write flush -> forever $ do threadDelay 1000000 write $ byteString "data: tick\n\n" @@ -1067,10 +1067,10 @@ server { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; - + # Critical: disable buffering proxy_buffering off; - + # Increase timeouts proxy_read_timeout 86400s; proxy_send_timeout 86400s; @@ -1080,11 +1080,11 @@ server { location /stream/ { proxy_pass http://localhost:8002; proxy_http_version 1.1; - + # Critical: disable buffering for streaming proxy_buffering off; proxy_cache off; - + # Keep connection alive proxy_set_header Connection ''; proxy_set_header Cache-Control 'no-cache'; @@ -1242,9 +1242,9 @@ For unidirectional streaming, SSE offers advantages: ```haskell sseHandler :: Application sseHandler _req respond = respond $ - responseStream status200 + responseStream status200 [("Content-Type", "text/event-stream"), - ("Cache-Control", "no-cache")] + ("Cache-Control", "no-cache")] $ \write flush -> forever $ do threadDelay 1000000 write $ byteString "data: update\n\n" diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/http2-http3.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/http2-http3.md similarity index 99% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/http2-http3.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/http2-http3.md index 32e60dd3..779bb8d2 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/http2-http3.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/http2-http3.md @@ -163,14 +163,14 @@ server { listen 443 ssl; listen [::]:443 ssl; http2 on; - + # HTTP/3 over UDP listen 443 quic reuseport; listen [::]:443 quic reuseport; - + ssl_protocols TLSv1.2 TLSv1.3; add_header Alt-Svc 'h3=":443"; ma=86400' always; - + location / { proxy_pass http://localhost:3000; # Warp proxy_http_version 1.1; @@ -221,7 +221,7 @@ import Control.Monad.Trans.Resource app :: Application app req respond = runResourceT $ do - (releaseKey, handle) <- allocate + (releaseKey, handle) <- allocate (openFile "data.txt" ReadMode) hClose content <- liftIO $ hGetContents handle diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/load-balancing.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/load-balancing.md similarity index 97% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/load-balancing.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/load-balancing.md index c6ea7bae..19480dfd 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/load-balancing.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/load-balancing.md @@ -88,7 +88,7 @@ data Backend = Backend } trackConnection :: Backend -> IO a -> IO a -trackConnection backend action = +trackConnection backend action = bracket_ (atomically $ modifyTVar' (activeConnections backend) (+1)) (atomically $ modifyTVar' (activeConnections backend) (subtract 1)) @@ -110,7 +110,7 @@ This pattern **composes naturally with health checks** - the STM transaction can import Control.Concurrent.LoadDistribution lb <- evenlyDistributed (return $ Set.fromList backends) -withResource lb $ \maybeBackend -> +withResource lb $ \maybeBackend -> case maybeBackend of Just backend -> proxyRequest backend Nothing -> handleNoBackends @@ -132,18 +132,18 @@ data WeightedBackend a = WeightedBackend smoothWeightedSelect :: [WeightedBackend a] -> IO a smoothWeightedSelect backends = atomically $ do -- Increase all current weights by their base weights - forM_ backends $ \wb -> + forM_ backends $ \wb -> modifyTVar' (currentWeight wb) (+ weight wb) - + -- Find backend with maximum current weight weights <- mapM (readTVar . currentWeight) backends let maxWeight = maximum weights selected = backends !! fromJust (findIndex (== maxWeight) weights) - + -- Reduce selected backend's current weight by total let totalWeight = sum (map weight backends) modifyTVar' (currentWeight selected) (subtract totalWeight) - + return $ backend selected ``` @@ -188,7 +188,7 @@ data BackendState = BackendState -- BAD: Touches many TVars in single transaction countAllConnections :: [Backend] -> STM Int -countAllConnections backends = +countAllConnections backends = sum <$> mapM (readTVar . activeConns) backends -- GOOD: Maintain aggregate counter @@ -281,7 +281,7 @@ The `retry` primitive is STM's killer feature - **threads automatically block un badPattern = atomically $ do val <- expensiveComputation -- Recomputed on every retry! tvar <- readTVar someTVar - + -- GOOD: Pure computation outside goodPattern = do let val = expensiveComputation @@ -299,7 +299,7 @@ goodPattern = do ```haskell -- Update multiple backend states atomically updateHealthChecks :: [Backend] -> [(Backend, Bool)] -> STM () -updateHealthChecks backends results = +updateHealthChecks backends results = forM_ results $ \(backend, isHealthy) -> writeTVar (healthy backend) isHealthy ``` @@ -344,7 +344,7 @@ performHealthCheck manager config backend = do req <- parseRequest url response <- httpLbs req manager return $ statusCode (responseStatus response) == 200 - + return $ fromMaybe False result ``` @@ -362,13 +362,13 @@ import Control.Monad (forever) healthCheckLoop :: Manager -> HealthCheckConfig -> [Backend] -> IO () healthCheckLoop manager config backends = forever $ do -- Check all backends concurrently - results <- mapConcurrently - (performHealthCheck manager config) + results <- mapConcurrently + (performHealthCheck manager config) backends - + -- Update backend states zipWithM_ (updateBackendState config) backends results - + -- Wait for next interval threadDelay (hcInterval config * 1000000) @@ -414,7 +414,7 @@ updateBackendState config backend healthy = atomically $ do state <- readTVar (backendState backend) failures <- readTVar (backendFailures backend) successes <- readTVar (backendSuccesses backend) - + case (state, healthy) of (Healthy, False) -> do let newFailures = failures + 1 @@ -422,22 +422,22 @@ updateBackendState config backend healthy = atomically $ do when (newFailures >= hcMaxFailures config) $ do writeTVar (backendState backend) Unhealthy writeTVar (backendFailures backend) 0 - + (Unhealthy, True) -> do writeTVar (backendState backend) Recovering writeTVar (backendSuccesses backend) 1 - + (Recovering, True) -> do let newSuccesses = successes + 1 writeTVar (backendSuccesses backend) newSuccesses when (newSuccesses >= hcRecoveryAttempts config) $ do writeTVar (backendState backend) Healthy writeTVar (backendSuccesses backend) 0 - + (Recovering, False) -> do writeTVar (backendState backend) Unhealthy writeTVar (backendSuccesses backend) 0 - + _ -> return () ``` @@ -458,15 +458,15 @@ testBreaker = undefined proxyWithCircuitBreaker :: Backend -> Request -> IO Response proxyWithCircuitBreaker backend req = do cbConf <- initialBreakerState - - result <- flip runReaderT cbConf $ + + result <- flip runReaderT cbConf $ withBreaker testBreaker $ liftIO $ forwardRequest backend req - + case result of - Left (CircuitBreakerClosed msg) -> + Left (CircuitBreakerClosed msg) -> -- Circuit open, return cached response or error return $ errorResponse 503 "Service Temporarily Unavailable" - Right response -> + Right response -> return response ``` @@ -521,7 +521,7 @@ exponentialBackoffWithJitter config action = go 0 (initialDelay config) ```haskell import Control.Retry -recovering +recovering (exponentialBackoff 50000 <> limitRetries 5) [const $ Handler $ \e -> return (isRetryable e)] (\_ -> performHealthCheck backend) @@ -554,16 +554,16 @@ proxyApp :: ProxyConfig -> Application proxyApp config req respond = do mBackend <- selectHealthyBackend (pcBalancer config) case mBackend of - Nothing -> + Nothing -> respond $ responseLBS status503 [] "No healthy backends available" - Just backend -> - waiProxyTo - (\_ -> return $ WPRProxyDest (ProxyDest - (backendHost backend) + Just backend -> + waiProxyTo + (\_ -> return $ WPRProxyDest (ProxyDest + (backendHost backend) (backendPort backend))) - defaultOnExc + defaultOnExc (pcManager config) - req + req respond ``` @@ -585,7 +585,7 @@ import Network.Wai (Middleware, mapResponseHeaders) -- Add load balancer info header addBackendHeader :: Backend -> Middleware addBackendHeader backend app req respond = - app req $ respond . mapResponseHeaders + app req $ respond . mapResponseHeaders ((hBackend, encodeUtf8 $ backendId backend) :) -- Connection tracking middleware @@ -593,18 +593,18 @@ trackingMiddleware :: ServerMetrics -> Middleware trackingMiddleware metrics app req respond = do atomically $ modifyTVar' (activeConnections metrics) (+1) atomically $ modifyTVar' (totalRequests metrics) (+1) - + let respond' res = do atomically $ modifyTVar' (activeConnections metrics) (subtract 1) respond res - + app req respond' `onException` atomically (modifyTVar' (errorCount metrics) (+1)) -- Compose middleware main = do config <- initProxyConfig - let app = trackingMiddleware metrics + let app = trackingMiddleware metrics $ proxyApp config run 8000 app ``` @@ -624,7 +624,7 @@ main = do **Compile-time optimizations**: ```cabal -ghc-options: -Wall -O2 -threaded +ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N -fspec-constr -fspecialise -funbox-strict-fields @@ -709,7 +709,7 @@ data ProxyConfig = ProxyConfig -- Backend selection dispatcher selectBackend :: ProxyConfig -> IO (Maybe Backend) -selectBackend config = +selectBackend config = case strategy config of RoundRobin -> selectRoundRobin config LeastConnections -> selectLeastConnections config @@ -722,7 +722,7 @@ selectRoundRobin config = do len = V.length backends' idx <- atomicModifyIORef' (rrCounter config) $ \i -> ((i + 1) `mod` len, i) - + -- Find next healthy backend findHealthy backends' idx len where @@ -733,7 +733,7 @@ selectRoundRobin config = do isHealthy <- atomically $ (== Healthy) <$> readTVar (state backend) if isHealthy then return (Just backend) - else findHealthy backends' + else findHealthy backends' ((start + 1) `mod` V.length backends') (remaining - 1) @@ -756,24 +756,24 @@ selectLeastConnections config = do selectWeightedRR :: ProxyConfig -> IO (Maybe Backend) selectWeightedRR config = atomically $ do let backends' = V.toList (backends config) - + -- Increase current weights - forM_ backends' $ \wb -> + forM_ backends' $ \wb -> modifyTVar' (currentWeight wb) (+ backendWeight wb) - + -- Select backend with max current weight weights <- mapM (readTVar . currentWeight) backends' let maxWeight = maximum weights selected = backends' !! fromJust (findIndex (== maxWeight) weights) - + -- Check health isHealthy <- (== Healthy) <$> readTVar (state selected) guard isHealthy - + -- Reduce selected backend's current weight let totalWeight = sum (map backendWeight backends') modifyTVar' (currentWeight selected) (subtract totalWeight) - + return selected -- Main proxy application @@ -781,17 +781,17 @@ proxyApp :: ProxyConfig -> Application proxyApp config req respond = do mBackend <- selectBackend config case mBackend of - Nothing -> + Nothing -> respond $ responseLBS status503 [] "No healthy backends" Just backend -> do -- Track connection atomically $ modifyTVar' (activeConns backend) (+1) - + let dest = ProxyDest (backendHost backend) (backendPort backend) respond' res = do atomically $ modifyTVar' (activeConns backend) (subtract 1) respond res - + waiProxyTo (\_ -> return $ WPRProxyDest dest) defaultOnExc @@ -807,14 +807,14 @@ healthCheckLoop manager backends = forever $ do threadDelay 10000000 -- 10 seconds where checkHealth mgr backend = do - let url = "http://" <> backendHost backend <> ":" + let url = "http://" <> backendHost backend <> ":" <> show (backendPort backend) <> "/health" result <- timeout 2000000 $ do req <- parseRequest (unpack url) response <- httpLbs req mgr return $ statusCode (responseStatus response) == 200 return $ fromMaybe False result - + updateHealth backend healthy = atomically $ do currentState <- readTVar (state backend) failureCount <- readTVar (failures backend) @@ -838,7 +838,7 @@ initProxyConfig specs strat = do manager <- newTlsManager counter <- newIORef 0 checker <- async $ healthCheckLoop manager (V.toList backends) - + return ProxyConfig { backends = backends , strategy = strat @@ -859,18 +859,18 @@ initProxyConfig specs strat = do -- Main entry point main :: IO () main = do - let backendSpecs = + let backendSpecs = [ BackendSpec "localhost" 8001 5 , BackendSpec "localhost" 8002 1 , BackendSpec "localhost" 8003 1 ] - + config <- initProxyConfig backendSpecs SmoothWeightedRR - - let settings = setPort 8000 - $ setTimeout 30 + + let settings = setPort 8000 + $ setTimeout 30 $ defaultSettings - + putStrLn "Load balancing proxy started on port 8000" runSettings settings (proxyApp config) ``` @@ -939,8 +939,8 @@ import Test.DejaFu testNoDeadlock :: IO () testNoDeadlock = autocheck $ do balancer <- setup - concurrently_ - (selectBackend balancer) + concurrently_ + (selectBackend balancer) (selectBackend balancer) ``` diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/ml-bot-detection.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/ml-bot-detection.md similarity index 100% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/ml-bot-detection.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/ml-bot-detection.md diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/performance-optimization.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/performance-optimization.md similarity index 97% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/performance-optimization.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/performance-optimization.md index fd36863c..406a657f 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/performance-optimization.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/performance-optimization.md @@ -30,13 +30,13 @@ import Foreign.C.Types import System.Posix.Types (Fd(..)) foreign import ccall unsafe "splice" - c_splice :: CInt -> Ptr CLong -> CInt -> Ptr CLong + c_splice :: CInt -> Ptr CLong -> CInt -> Ptr CLong -> CSize -> CUInt -> IO CSsize splice :: Fd -> Fd -> Int -> [SpliceFlag] -> IO Int splice (Fd fdIn) (Fd fdOut) len flags = do let cflags = foldr (.|.) 0 [f | SpliceFlag f <- flags] - result <- c_splice fdIn nullPtr fdOut nullPtr + result <- c_splice fdIn nullPtr fdOut nullPtr (fromIntegral len) cflags if result == -1 then throwErrno "splice" @@ -59,10 +59,10 @@ The `simple-sendfile` package powers Warp's high-performance static file serving ```haskell import Network.Sendfile -sendfileWithHeader :: Socket -> FilePath -> FileRange +sendfileWithHeader :: Socket -> FilePath -> FileRange -> IO () -> [ByteString] -> IO () -- Sends headers and file data efficiently -sendfileWithHeader sock path (PartOfFile offset len) +sendfileWithHeader sock path (PartOfFile offset len) tickle headers ``` @@ -77,7 +77,7 @@ spliceWithRetry :: Fd -> Fd -> Int -> IO () spliceWithRetry fdIn fdOut chunkSize = loop where loop = do - result <- try $ splice fdIn fdOut chunkSize + result <- try $ splice fdIn fdOut chunkSize [spliceNonBlock, spliceMore] case result of Right 0 -> return () -- EOF @@ -111,15 +111,15 @@ Conversion costs between variants matter significantly. `toStrict` forces entire ```haskell import Data.ByteString.Builder -buildHttpResponse :: Int -> [(ByteString, ByteString)] +buildHttpResponse :: Int -> [(ByteString, ByteString)] -> LazyByteString -> LazyByteString buildHttpResponse status headers body = toLazyByteString builder where - builder = statusLine <> headerLines + builder = statusLine <> headerLines <> byteString "\r\n" <> lazyByteString body - statusLine = byteString "HTTP/1.1 " <> intDec status + statusLine = byteString "HTTP/1.1 " <> intDec status <> byteString " OK\r\n" - headerLines = mconcat + headerLines = mconcat [ byteString k <> byteString ": " <> byteString v <> byteString "\r\n" | (k, v) <- headers ] ``` @@ -134,7 +134,7 @@ import Data.Pool createBackendPool :: HostName -> PortNumber -> IO (Pool Socket) createBackendPool host port = do capabilities <- getNumCapabilities - newPool $ + newPool $ defaultPoolConfig (connectBackend host port) -- Create function close -- Destroy function @@ -228,7 +228,7 @@ Interpreting results requires understanding latency distribution. The `--latency ``` Latency Distribution 50% 635.91us - 75% 712.34us + 75% 712.34us 90% 1.04ms 99% 2.87ms ``` @@ -385,7 +385,7 @@ ThreadScope displays CPU activity across cores, spark creation/conversion (for p **Profiling workflow progresses systematically**: 1. **Baseline measurement** with `-O2 +RTS -s` establishes initial performance -2. **Time profiling** with `-prof -fprof-late +RTS -p` identifies CPU hotspots +2. **Time profiling** with `-prof -fprof-late +RTS -p` identifies CPU hotspots 3. **Memory profiling** with `-hd -l` and eventlog2html reveals allocation patterns 4. **Detailed investigation** using info table profiling for exact source locations 5. **Iterative optimization** applying fixes and re-profiling to verify improvements @@ -401,7 +401,7 @@ Successful optimization follows priority order: algorithms trump micro-optimizat **Compilation optimization checklist**: - [ ] Use `-O` or `-O2` for production builds - [ ] Add `-fllvm` for numeric-intensive code after benchmarking -- [ ] Enable `-threaded` for concurrent programs +- [ ] Enable `-threaded` for concurrent programs - [ ] Include `-rtsopts` to allow runtime tuning - [ ] Set `-with-rtsopts=-N` for automatic parallelism - [ ] Use `optimization: 2` in cabal.project, not `ghc-options` @@ -483,7 +483,7 @@ import System.IO data ProxyConfig = ProxyConfig { listenPort :: PortNumber - , targetHost :: HostName + , targetHost :: HostName , targetPort :: PortNumber , poolStripes :: Int , poolPerStripe :: Int @@ -492,8 +492,8 @@ data ProxyConfig = ProxyConfig -- Create backend connection pool createBackendPool :: ProxyConfig -> IO (Pool Socket) -createBackendPool config = - newPool $ +createBackendPool config = + newPool $ defaultPoolConfig (connectBackend (targetHost config) (targetPort config)) close @@ -503,7 +503,7 @@ createBackendPool config = connectBackend :: HostName -> PortNumber -> IO Socket connectBackend host port = do - addr:_ <- getAddrInfo + addr:_ <- getAddrInfo (Just defaultHints { addrSocketType = Stream }) (Just host) (Just $ show port) sock <- socket (addrFamily addr) Stream defaultProtocol @@ -517,18 +517,18 @@ runProxy :: ProxyConfig -> IO () runProxy config = do pool <- createBackendPool config addr:_ <- getAddrInfo - (Just defaultHints + (Just defaultHints { addrSocketType = Stream , addrFlags = [AI_PASSIVE] }) Nothing (Just $ show $ listenPort config) - + sock <- socket (addrFamily addr) Stream defaultProtocol setSocketOption sock ReuseAddr 1 bind sock (addrAddress addr) listen sock 128 - + putStrLn $ "Proxy listening on port " ++ show (listenPort config) - + forever $ do (client, clientAddr) <- accept sock forkIO $ handleClient pool client @@ -538,27 +538,27 @@ runProxy config = do handleClient :: Pool Socket -> Socket -> IO () handleClient pool client = do done <- newEmptyMVar - + withResource pool $ \backend -> do -- Bidirectional zero-copy forwarding let chunkSize = 65536 -- 64KB chunks - + forkIO $ do - result <- try $ splice chunkSize (client, Nothing) + result <- try $ splice chunkSize (client, Nothing) (backend, Nothing) case result of - Left (e :: SomeException) -> + Left (e :: SomeException) -> putStrLn $ "Client->Backend error: " ++ show e Right _ -> return () putMVar done () - + result <- try $ splice chunkSize (backend, Nothing) (client, Nothing) case result of Left (e :: SomeException) -> putStrLn $ "Backend->Client error: " ++ show e Right _ -> return () - + takeMVar done main :: IO () @@ -582,7 +582,7 @@ main = do import Data.ByteString.Builder import qualified Data.ByteString.Lazy as BL -buildHttpResponse :: Int -> [(ByteString, ByteString)] +buildHttpResponse :: Int -> [(ByteString, ByteString)] -> BL.ByteString -> BL.ByteString buildHttpResponse status headers body = toLazyByteString $ mconcat @@ -591,7 +591,7 @@ buildHttpResponse status headers body = toLazyByteString $ , byteString " " , statusText status , byteString "\r\n" - , mconcat [ byteString k <> byteString ": " + , mconcat [ byteString k <> byteString ": " <> byteString v <> byteString "\r\n" | (k, v) <- headers ] , byteString "\r\n" @@ -599,7 +599,7 @@ buildHttpResponse status headers body = toLazyByteString $ ] where statusText 200 = byteString "OK" - statusText 404 = byteString "Not Found" + statusText 404 = byteString "Not Found" statusText 500 = byteString "Internal Server Error" statusText _ = byteString "Unknown" ``` @@ -616,14 +616,14 @@ parseRequestLine :: ByteString -> Maybe (ByteString, ByteString, ByteString) parseRequestLine bs = do let (method, rest1) = BS.break (== space) bs guard (not $ BS.null rest1) - + let rest2 = BS.drop 1 rest1 (path, rest3) = BS.break (== space) rest2 guard (not $ BS.null rest3) - + let rest4 = BS.drop 1 rest3 (version, _) = BS.break (== cr) rest4 - + return (method, path, version) where space = 32; cr = 13 @@ -635,11 +635,11 @@ parseHeaders = go . BC.lines go [] = [] go (line:rest) | BS.null line = [] - | otherwise = + | otherwise = case BC.break (== ':') line of - (key, value) + (key, value) | BS.null value -> go rest - | otherwise -> + | otherwise -> let val = BS.dropWhile (== 32) (BS.drop 1 value) in (key, val) : go rest ``` diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/rate-limiting.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/rate-limiting.md similarity index 99% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/rate-limiting.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/rate-limiting.md index cb51e712..3eb037e1 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/rate-limiting.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/rate-limiting.md @@ -210,16 +210,16 @@ RateLimit: "default";r=0;t=60 async function fetchWithRetry(url, maxRetries = 3) { for (let attempt = 0; attempt < maxRetries; attempt++) { const res = await fetch(url); - + if (res.status === 429) { const retryAfter = res.headers.get('retry-after'); const delay = parseInt(retryAfter) * 1000 || (1000 * Math.pow(2, attempt)); const jitter = delay * 0.2 * (Math.random() - 0.5); - + await sleep(delay + jitter); continue; } - + return res; } throw new Error('Max retries exceeded'); diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/tls-ssl.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/tls-ssl.md similarity index 99% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/tls-ssl.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/tls-ssl.md index 2bb5a609..4ecc4390 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/tls-ssl.md +++ b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/tls-ssl.md @@ -91,10 +91,10 @@ tlsClient hostname port = do addr:_ <- getAddrInfo Nothing (Just hostname) (Just port) sock <- socket (addrFamily addr) Stream defaultProtocol connect sock (addrAddress addr) - + -- Configure TLS parameters let params = (defaultParamsClient hostname "") - { clientSupported = def + { clientSupported = def { supportedCiphers = ciphersuite_default , supportedVersions = [TLS13, TLS12] , supportedGroups = [X25519, P256] @@ -103,16 +103,16 @@ tlsClient hostname port = do { sharedCAStore = systemStore } } - + -- Perform handshake ctx <- contextNew sock params handshake ctx - + -- Send HTTP request sendData ctx "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" response <- recvData ctx print response - + -- Clean shutdown bye ctx close sock @@ -131,8 +131,8 @@ import qualified Network.TLS as TLS import Network.TLS.Extra.Cipher app :: Application -app _ respond = - respond $ responseLBS status200 +app _ respond = + respond $ responseLBS status200 [("Content-Type", "text/plain") ,("Strict-Transport-Security", "max-age=31536000; includeSubDomains")] "Secure HTTPS Server" @@ -144,11 +144,11 @@ main = do , tlsCiphers = ciphersuite_strong , onInsecure = DenyInsecure "HTTPS required" } - + warpConfig = defaultSettings & setPort 443 & setHost "0.0.0.0" - + putStrLn "HTTPS server on :443" runTLS tlsConfig warpConfig app ``` @@ -169,14 +169,14 @@ validateCertificate certFile hostname = do -- Load certificate chain certs <- readSignedObject certFile let chain = CertificateChain certs - + -- Get system CA store store <- getSystemCertificateStore - + -- Validate with default checks let cache = exceptionValidationCache [] failures <- validateDefault store cache (hostname, ":443") chain - + case failures of [] -> putStrLn "✓ Certificate valid" >> return True errs -> do @@ -206,10 +206,10 @@ initializeKeys :: CertConfig -> IO () initializeKeys cfg = do accountExists <- doesFileExist (accountKey cfg) domainExists <- doesFileExist (domainKey cfg) - - unless accountExists $ + + unless accountExists $ callCommand $ "openssl genrsa 4096 > " ++ accountKey cfg - + unless domainExists $ callCommand $ "openssl genrsa 4096 > " ++ domainKey cfg @@ -337,7 +337,7 @@ import qualified Network.TLS as TLS customTlsManager :: IO Manager customTlsManager = do let tlsParams = (TLS.defaultParamsClient "example.com" "") - { TLS.clientSupported = def + { TLS.clientSupported = def { TLS.supportedCiphers = ciphersuite_strong , TLS.supportedVersions = [TLS.TLS13, TLS.TLS12] } @@ -346,15 +346,15 @@ customTlsManager = do } } tlsSettings = TLSSettings tlsParams - + newManager $ mkManagerSettings tlsSettings Nothing -customValidation :: CertificateStore -> ValidationCache -> ServiceID +customValidation :: CertificateStore -> ValidationCache -> ServiceID -> CertificateChain -> IO [FailedReason] customValidation store cache sid chain = do -- Perform standard validation failures <- validateDefault store cache sid chain - + -- Add custom checks (certificate pinning, etc.) if null failures then return [] @@ -375,11 +375,11 @@ loadCredentials hostname = do main :: IO () main = do - let tlsConfig = tlsSettingsSni + let tlsConfig = tlsSettingsSni (return $ Just loadCredentials) "default.crt" "default.key" - + runTLS tlsConfig defaultSettings app ``` @@ -392,15 +392,15 @@ import Data.IORef setupSessionManager :: IO SessionManager setupSessionManager = do sessions <- newIORef Map.empty - + return SessionManager { sessionResume = \sessionID -> do cache <- readIORef sessions return $ Map.lookup sessionID cache - + , sessionEstablish = \sessionID sessionData -> do modifyIORef' sessions (Map.insert sessionID sessionData) - + , sessionInvalidate = \sessionID -> do modifyIORef' sessions (Map.delete sessionID) } @@ -408,7 +408,7 @@ setupSessionManager = do clientWithResumption :: HostName -> IO () clientWithResumption hostname = do manager <- setupSessionManager - + let params = (defaultParamsClient hostname "") { clientShared = def { sharedSessionManager = manager diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/waf-design.md b/PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/waf-design.md similarity index 100% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/waf-design.md rename to PROJECTS/advanced/Aenebris/docs/proxy-haskell-research/waf-design.md diff --git a/PROJECTS/Aenebris/examples/TEST_TLS.md b/PROJECTS/advanced/Aenebris/examples/TEST_TLS.md similarity index 100% rename from PROJECTS/Aenebris/examples/TEST_TLS.md rename to PROJECTS/advanced/Aenebris/examples/TEST_TLS.md diff --git a/PROJECTS/Aenebris/examples/config-advanced.yaml b/PROJECTS/advanced/Aenebris/examples/config-advanced.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/config-advanced.yaml rename to PROJECTS/advanced/Aenebris/examples/config-advanced.yaml diff --git a/PROJECTS/Aenebris/examples/config-https.yaml b/PROJECTS/advanced/Aenebris/examples/config-https.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/config-https.yaml rename to PROJECTS/advanced/Aenebris/examples/config-https.yaml diff --git a/PROJECTS/Aenebris/examples/config-loadbalancing.yaml b/PROJECTS/advanced/Aenebris/examples/config-loadbalancing.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/config-loadbalancing.yaml rename to PROJECTS/advanced/Aenebris/examples/config-loadbalancing.yaml diff --git a/PROJECTS/Aenebris/examples/config-sni.yaml b/PROJECTS/advanced/Aenebris/examples/config-sni.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/config-sni.yaml rename to PROJECTS/advanced/Aenebris/examples/config-sni.yaml diff --git a/PROJECTS/Aenebris/examples/config.yaml b/PROJECTS/advanced/Aenebris/examples/config.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/config.yaml rename to PROJECTS/advanced/Aenebris/examples/config.yaml diff --git a/PROJECTS/Aenebris/examples/generate-test-certs.sh b/PROJECTS/advanced/Aenebris/examples/generate-test-certs.sh similarity index 100% rename from PROJECTS/Aenebris/examples/generate-test-certs.sh rename to PROJECTS/advanced/Aenebris/examples/generate-test-certs.sh diff --git a/PROJECTS/Aenebris/examples/start_backends.sh b/PROJECTS/advanced/Aenebris/examples/start_backends.sh similarity index 100% rename from PROJECTS/Aenebris/examples/start_backends.sh rename to PROJECTS/advanced/Aenebris/examples/start_backends.sh diff --git a/PROJECTS/Aenebris/examples/test_backend.py b/PROJECTS/advanced/Aenebris/examples/test_backend.py similarity index 100% rename from PROJECTS/Aenebris/examples/test_backend.py rename to PROJECTS/advanced/Aenebris/examples/test_backend.py diff --git a/PROJECTS/Aenebris/examples/test_backend_multi.py b/PROJECTS/advanced/Aenebris/examples/test_backend_multi.py similarity index 100% rename from PROJECTS/Aenebris/examples/test_backend_multi.py rename to PROJECTS/advanced/Aenebris/examples/test_backend_multi.py diff --git a/PROJECTS/Aenebris/examples/websockets/config_ws_sse.yaml b/PROJECTS/advanced/Aenebris/examples/websockets/config_ws_sse.yaml similarity index 100% rename from PROJECTS/Aenebris/examples/websockets/config_ws_sse.yaml rename to PROJECTS/advanced/Aenebris/examples/websockets/config_ws_sse.yaml diff --git a/PROJECTS/Aenebris/examples/websockets/sse_server.py b/PROJECTS/advanced/Aenebris/examples/websockets/sse_server.py similarity index 100% rename from PROJECTS/Aenebris/examples/websockets/sse_server.py rename to PROJECTS/advanced/Aenebris/examples/websockets/sse_server.py diff --git a/PROJECTS/Aenebris/examples/websockets/test_client.py b/PROJECTS/advanced/Aenebris/examples/websockets/test_client.py similarity index 100% rename from PROJECTS/Aenebris/examples/websockets/test_client.py rename to PROJECTS/advanced/Aenebris/examples/websockets/test_client.py diff --git a/PROJECTS/Aenebris/examples/websockets/ws_echo_server.py b/PROJECTS/advanced/Aenebris/examples/websockets/ws_echo_server.py similarity index 100% rename from PROJECTS/Aenebris/examples/websockets/ws_echo_server.py rename to PROJECTS/advanced/Aenebris/examples/websockets/ws_echo_server.py diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/config-design.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/config-design.md similarity index 97% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/config-design.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/config-design.md index 07666ffe..ffa048ce 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/config-design.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/config-design.md @@ -68,14 +68,14 @@ Dhall represents a paradigm shift—a non-Turing-complete functional language sp ```dhall -- types.dhall -let DatabaseConfig = - { Type = +let DatabaseConfig = + { Type = { host : Text , port : Natural , maxConnections : Natural , replica : Optional DatabaseConfig.Type } - , default = + , default = { host = "localhost" , port = 5432 , maxConnections = 20 @@ -87,7 +87,7 @@ let DatabaseConfig = let DB = ./types.dhall let staging = ./staging.dhall -in DB::{ +in DB::{ , host = "prod-db.internal" , port = 5432 , maxConnections = 100 @@ -133,11 +133,11 @@ data ServiceConfig = ServiceConfig -- Type-safe DSL in Haskell myService :: ServiceConfig myService = ServiceConfig - { routes = + { routes = [ route "/api" GET apiHandler , route "/health" GET healthCheck ] - , middleware = + , middleware = [ cors allowAll , logging Verbose , auth jwtValidator @@ -205,7 +205,7 @@ let identity : ∀(a : Type) → a → a = λ(a : Type) → λ(x : a) → x -- Type-safe record construction -let Config : Type = +let Config : Type = { apiKey : Text , endpoints : List { url : Text, port : Natural } , retries : Optional Natural @@ -270,7 +270,7 @@ watchConfigFile = withManager $ \mgr -> do "." (\event -> "config.yaml" `isSuffixOf` eventPath event) handleConfigChange - + forever $ threadDelay 1000000 handleConfigChange :: Event -> IO () @@ -370,7 +370,7 @@ updateConfigs :: TVar AppConfig -> TVar CacheConfig -> IO () updateConfigs appVar cacheVar = atomically $ do app <- readTVar appVar cache <- readTVar cacheVar - + -- Both updates happen atomically or retry writeTVar appVar (app { maxConnections = 100 }) writeTVar cacheVar (cache { ttl = 3600 }) @@ -418,16 +418,16 @@ initConfigManager path = do Right config -> do currentRef <- newIORef config lastValidRef <- newIORef config - + mgr <- startManager - + let manager = ConfigManager currentRef lastValidRef path mgr - + -- Start watching - _ <- watchDir mgr (takeDirectory path) - (matchesFile path) + _ <- watchDir mgr (takeDirectory path) + (matchesFile path) (handleReload manager) - + return $ Right manager where matchesFile target event = target == eventPath event @@ -444,27 +444,27 @@ handleReload manager event = do -- Save current as last valid current <- readIORef (currentConfig manager) writeIORef (lastValidConfig manager) current - + -- Atomic swap to new config atomicWriteIORef (currentConfig manager) newConfig - + logInfo "Config reloaded successfully" else logError "Validation failed, keeping old config" - + Left err -> do logError $ "Reload failed: " ++ err -- Keep running with old config where tryReload :: FilePath -> IO (Either String AppConfig) - tryReload path = + tryReload path = catch (eitherDecodeFileStrict path) (\(e :: SomeException) -> return $ Left $ show e) - + validateConfig :: AppConfig -> Bool - validateConfig cfg = + validateConfig cfg = -- Custom validation logic - not (null $ apiKeys cfg) + not (null $ apiKeys cfg) && all isValidEndpoint (databaseEndpoints $ database cfg) -- Access config safely from multiple threads @@ -484,7 +484,7 @@ debounceReload :: IORef UTCTime -> NominalDiffTime -> IO () -> IO () debounceReload lastReloadRef minInterval action = do now <- getCurrentTime lastReload <- readIORef lastReloadRef - + when (diffUTCTime now lastReload > minInterval) $ do writeIORef lastReloadRef now action @@ -502,7 +502,7 @@ data DatabasePool = DatabasePool rotatePoolCredentials :: DatabasePool -> Credentials -> IO () rotatePoolCredentials dbPool newCreds = do atomicWriteIORef (credentials dbPool) newCreds - + -- Drain old connections gradually -- New connections use new credentials from IORef drainPool (pool dbPool) gracefulDrainSeconds @@ -556,7 +556,7 @@ loadConfigFailFast path = do ```haskell import Data.Validation -data ValidationError = +data ValidationError = InvalidPort Int | MissingField Text | InvalidFormat Text Text @@ -571,7 +571,7 @@ validateConfig raw = Config validatePort p | p > 0 && p < 65536 = Success p | otherwise = Failure [InvalidPort p] - + validateHost h | not (T.null h) = Success h | otherwise = Failure [MissingField "host"] @@ -595,23 +595,23 @@ loadConfigGraceful path = do Left err -> do logWarning $ "Config parse error, using defaults: " ++ err return defaultConfig - + Right rawConfig -> do -- Core settings must be valid core <- case validateCore rawConfig of Left errors -> error $ "Core config invalid: " ++ show errors Right validated -> return validated - + -- Optional features use defaults on error features <- case validateFeatures rawConfig of Left errors -> do logWarning $ "Feature config invalid, using defaults: " ++ show errors return defaultFeatures Right validated -> return validated - + -- Experimental flags filter out invalid entries let flags = filterValidFlags (rawExperimental rawConfig) - + return $ ConfigWithDefaults core features flags ``` @@ -656,15 +656,15 @@ instance FromJSON ServerConfig where rawPort <- o .: "port" when (rawPort < 1 || rawPort > 65535) $ fail $ "Invalid port: " ++ show rawPort - + host <- o .: "host" when (T.null host) $ fail "Host cannot be empty" - + workers <- o .:? "workers" .!= 4 -- Default to 4 when (workers < 1 || workers > 1000) $ fail $ "Invalid worker count: " ++ show workers - + return $ ServerConfig rawPort host workers ``` @@ -729,9 +729,9 @@ interpolateEnvVars template = do let varName = T.drop 2 $ T.dropEnd 1 match -- Strip ${ } maybeValue <- lookupEnv (T.unpack varName) case maybeValue of - Just value -> + Just value -> return $ Right $ T.replace match (T.pack value) txt - Nothing -> + Nothing -> return $ Left $ "Undefined variable: " ++ T.unpack varName -- With defaults @@ -755,7 +755,7 @@ import System.Envy data AppConfig = AppConfig { appDatabaseUrl :: String -- DATABASE_URL - , appRedisHost :: String -- REDIS_HOST + , appRedisHost :: String -- REDIS_HOST , appPort :: Int -- PORT , appDebug :: Bool -- DEBUG , appLogLevel :: Maybe LogLevel -- LOG_LEVEL (optional) @@ -787,9 +787,9 @@ main = do import Options.Applicative import qualified Data.Yaml as Y -data ConfigSource = +data ConfigSource = CLIConfig Config - | EnvConfig Config + | EnvConfig Config | FileConfig Config | DefaultConfig Config @@ -804,7 +804,7 @@ mergeConfigs sources = foldl merge defaultConfig sources merge base (EnvConfig env) = base { port = port env `orDefault` port base } merge base (FileConfig file) = base { port = port file `orDefault` port base } merge base (DefaultConfig _) = base - + orDefault :: Maybe a -> a -> a orDefault = fromMaybe @@ -813,29 +813,29 @@ loadLayeredConfig :: IO Config loadLayeredConfig = do -- 1. Load defaults let defaults = defaultConfig - + -- 2. Load system config systemCfg <- loadSystemConfig `catch` \(_ :: IOException) -> return Nothing - - -- 3. Load project config + + -- 3. Load project config projectCfg <- loadProjectConfig `catch` \(_ :: IOException) -> return Nothing - + -- 4. Load local config localCfg <- Y.decodeFileEither "config.yaml" >>= \case Left _ -> return Nothing Right cfg -> return $ Just cfg - + -- 5. Load environment variables envCfg <- decodeEnv :: IO (Either String EnvConfig) let env = either (const Nothing) Just envCfg - + -- 6. Parse CLI args cliCfg <- execParser cliParser - + -- Merge with precedence - return $ mergeConfigs + return $ mergeConfigs [ maybe DefaultConfig FileConfig systemCfg - , maybe DefaultConfig FileConfig projectCfg + , maybe DefaultConfig FileConfig projectCfg , maybe DefaultConfig FileConfig localCfg , maybe DefaultConfig EnvConfig env , CLIConfig cliCfg @@ -852,7 +852,7 @@ newtype SafeEnvValue = SafeEnvValue Text validateEnvValue :: Text -> Either String SafeEnvValue validateEnvValue value | T.any isControlChar value = Left "Control characters not allowed" - | T.any (== ';') value = Left "Semicolons not allowed" + | T.any (== ';') value = Left "Semicolons not allowed" | T.any (== '|') value = Left "Pipes not allowed" | otherwise = Right $ SafeEnvValue value where @@ -903,10 +903,10 @@ loadSecrets :: VaultConnection -> IO (Either String AppSecrets) loadSecrets conn = do -- Get database credentials dbResult <- getSecret conn (SecretPath "myapp/database") Nothing - + -- Get API keys apiResult <- getSecret conn (SecretPath "myapp/api-keys") Nothing - + case (dbResult, apiResult) of (Right dbData, Right apiData) -> do let dbCreds = parseCredentials $ fromSecretData dbData @@ -923,7 +923,7 @@ updateSecret conn = do NoCheckAndSet (SecretPath "myapp/database") (toSecretData [("password", newPassword), ("username", "admin")]) - + case result of Right version -> putStrLn $ "Updated to version " ++ show version Left err -> putStrLn $ "Update failed: " ++ err @@ -966,14 +966,14 @@ loadDatabaseConfig :: IO (Either String DatabaseConfig) loadDatabaseConfig = do -- Discover credentials (IAM role, env vars, etc.) env <- newEnv discover - + -- Request secret let req = newGetSecretValue "production/database" resp <- runResourceT $ send env req - + -- Extract and parse case resp ^. getSecretValueResponse_secretString of - Just jsonString -> + Just jsonString -> case A.eitherDecode (encodeUtf8 jsonString) of Right config -> return $ Right config Left err -> return $ Left $ "Parse error: " ++ err @@ -983,13 +983,13 @@ loadDatabaseConfig = do rotateSecret :: Text -> IO () rotateSecret secretId = do env <- newEnv discover - + let req = newRotateSecret secretId & rotateSecret_rotationLambdaARN ?~ lambdaArn - & rotateSecret_rotationRules ?~ + & rotateSecret_rotationRules ?~ newRotationRulesType & rotationRulesType_automaticallyAfterDays ?~ 30 - + _ <- runResourceT $ send env req putStrLn "Rotation initiated" ``` @@ -1038,7 +1038,7 @@ withRotatingCreds rc action = do Just prev -> action prev -- Fallback during rotation window Nothing -> throwIO RotationError where - tryAction creds = + tryAction creds = catch (Right <$> action creds) (\(e :: SomeException) -> return $ Left e) @@ -1047,22 +1047,22 @@ rotationLoop :: IORef RotatingCredentials -> VaultConnection -> IO () rotationLoop credsRef vault = forever $ do currentTime <- getCurrentTime creds <- readIORef credsRef - + when (shouldRotate currentTime (rotationTime creds)) $ do -- Fetch new credentials newCreds <- fetchDynamicCreds vault - + -- Update with both old and new atomicModifyIORef' credsRef $ \old -> (RotatingCredentials newCreds (Just $ currentCreds old) currentTime, ()) - + threadDelay (5 * 60 * 1000000) -- Check every 5 minutes -- Vault dynamic secrets with lease renewal requestDynamicCredentials :: VaultConnection -> IO DynamicDBCredentials requestDynamicCredentials conn = do result <- vaultRead conn (VaultSecretPath "database/creds/readonly") - + case result of (metadata, Right creds) -> do -- Schedule renewal before expiration @@ -1074,7 +1074,7 @@ renewLeaseLoop :: VaultConnection -> Text -> Int -> IO () renewLeaseLoop conn leaseId duration = do let renewInterval = duration `div` 2 -- Renew at halfway point threadDelay (renewInterval * 1000000) - + success <- renewLease conn leaseId if success then renewLeaseLoop conn leaseId duration -- Continue renewing @@ -1086,7 +1086,7 @@ renewLeaseLoop conn leaseId duration = do ```haskell -- Never store secrets in code or config files -- ❌ DON'T DO THIS -apiKey = "sk_live_abc123xyz" +apiKey = "sk_live_abc123xyz" -- ✅ Load from secure source loadSecrets :: IO Secrets @@ -1222,12 +1222,12 @@ databaseCodec = DatabaseConfig ```dhall -- types/Database.dhall -let PoolConfig = { Type = +let PoolConfig = { Type = { minConnections : Natural , maxConnections : Natural , idleTimeout : Natural } -, default = +, default = { minConnections = 5 , maxConnections = 20 , idleTimeout = 30 @@ -1259,11 +1259,11 @@ in DatabaseConfig -- config/production.dhall let DB = ../types/Database.dhall -in DB::{ +in DB::{ , host = "prod-db.internal" , name = "production_db" , pool = DB.default.pool // { maxConnections = 100 } - , replicas = + , replicas = [ { host = "replica1.internal", port = 5432 } , { host = "replica2.internal", port = 5432 } ] @@ -1295,12 +1295,12 @@ initFeatureFlags :: FilePath -> IO FeatureFlagManager initFeatureFlags path = do initial <- loadFeatureFlags path flagsRef <- newIORef initial - + let manager = FeatureFlagManager flagsRef path - + -- Watch for changes _ <- forkIO $ watchAndReload manager - + return manager where loadFeatureFlags :: FilePath -> IO FeatureFlags @@ -1359,25 +1359,25 @@ loadConfig = do Just "production" -> Production Just "staging" -> Staging _ -> Development - + -- Load shared config shared <- decodeFileThrow "config/shared.yaml" - + -- Load environment-specific config let envFile = case env of Development -> "config/development.yaml" - Staging -> "config/staging.yaml" + Staging -> "config/staging.yaml" Production -> "config/production.yaml" - + envSpecific <- decodeFileThrow envFile - + -- Merge with env vars (highest precedence) envOverrides <- decodeEnv :: IO (Either String EnvOverrides) - + let finalConfig = case envOverrides of Right overrides -> applyOverrides envSpecific overrides Left _ -> envSpecific - + return $ MultiEnvConfig shared env finalConfig ``` @@ -1424,7 +1424,7 @@ handleReload event = do result <- try $ decodeFile path case result of Right newConfig -> atomicWriteIORef configRef newConfig - Left (err :: SomeException) -> + Left (err :: SomeException) -> logError $ "Reload failed, keeping old config: " ++ show err ``` @@ -1496,7 +1496,7 @@ let baseService = ./types/Service.dhall let makeServiceConfig = λ(name : Text) → λ(port : Natural) → baseService::{ name = name, port = port } -in { services = +in { services = [ makeServiceConfig "api" 8080 , makeServiceConfig "auth" 8081 -- ... 48 more services with consistent structure diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md similarity index 99% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md index 916e02cd..8731286f 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/ddos-mitigation.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/ddos-mitigation.md @@ -189,16 +189,16 @@ Nginx's event-based architecture provides inherent resistance to connection exha http { # Time to read client request header client_header_timeout 10s; - + # Time between successive body data reads client_body_timeout 10s; - + # Keep-alive connection timeout keepalive_timeout 15s; - + # Time between successive writes to client send_timeout 10s; - + # Buffer limits prevent memory exhaustion client_body_buffer_size 128k; client_header_buffer_size 2k; @@ -228,19 +228,19 @@ LoadModule qos_module modules/mod_qos.so # Track 500,000 unique client IPs (150 bytes per entry) QS_ClientEntries 500000 - + # Maximum 20 concurrent connections per IP QS_SrvMaxConnPerIP 20 - + # Maximum 512 total active connections QS_SrvMaxConn 512 - + # Disable keep-alive when 400 connections active QS_SrvMaxConnClose 400 - + # Minimum data rates: 200 bytes/sec download, 1500 upload QS_SrvMinDataRate 200 1500 - + # Protect resource-intensive endpoints QS_LocRequestLimit "/login" 5 QS_LocRequestLimit "/admin" 3 @@ -264,15 +264,15 @@ http { limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s; limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s; - + server { # Global: 10 concurrent connections per IP limit_conn addr 10; - + location / { limit_req zone=general burst=20 nodelay; } - + location /login { # Aggressive limits for authentication limit_conn addr 3; @@ -521,20 +521,20 @@ SEC("xdp") int ddos_protection(struct xdp_md *ctx) { void *data_end = (void *)(long)ctx->data_end; void *data = (void *)(long)ctx->data; - + // Parse Ethernet header struct ethhdr *eth = data; if ((void *)(eth + 1) > data_end) return XDP_PASS; if (eth->h_proto != __constant_htons(ETH_P_IP)) return XDP_PASS; - + // Parse IP header struct iphdr *iph = (void *)(eth + 1); if ((void *)(iph + 1) > data_end) return XDP_PASS; - + __u32 src_ip = iph->saddr; struct rate_limit_entry *entry = bpf_map_lookup_elem(&rate_limit_map, &src_ip); __u64 current_time = bpf_ktime_get_ns(); - + if (entry) { if (current_time - entry->last_update < TIME_WINDOW_NS) { entry->packet_count++; @@ -1099,7 +1099,7 @@ groups: for: 2m annotations: summary: "High SYN rate detected" - + - alert: ConntrackTableFull expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit > 0.9 for: 5m diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/deployment.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/deployment.md similarity index 98% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/deployment.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/deployment.md index a60d520e..1ab5f568 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/deployment.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/deployment.md @@ -269,14 +269,14 @@ For complex dependencies, Nix provides reproducible static builds. let pkgs = import {}; pkgsMusl = pkgs.pkgsMusl; - + staticLibs = [ (pkgsMusl.gmp6.override { withStatic = true; }) pkgsMusl.zlib.static (pkgsMusl.libffi.overrideAttrs (old: { dontDisableStatic = true; })) (pkgsMusl.openssl.override { static = true; }) ]; - + in pkgsMusl.haskellPackages.aenebris.overrideAttrs (old: { enableSharedExecutables = false; enableSharedLibraries = false; @@ -384,7 +384,7 @@ packages: . package * ghc-options: -O2 -split-sections gcc-options: -Os -ffunction-sections -fdata-sections - + package aenebris ld-options: -Wl,--gc-sections ghc-options: -funbox-strict-fields -fllvm @@ -442,13 +442,13 @@ spec: spec: # Service account for RBAC serviceAccountName: aenebris - + # Security context securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 - + # Topology spread for high availability topologySpreadConstraints: - maxSkew: 1 @@ -463,7 +463,7 @@ spec: labelSelector: matchLabels: app: aenebris - + # Node affinity for dedicated nodes affinity: nodeAffinity: @@ -474,7 +474,7 @@ spec: - key: workload-type operator: In values: [proxy, edge] - + # Pod anti-affinity podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: @@ -484,15 +484,15 @@ spec: matchLabels: app: aenebris topologyKey: kubernetes.io/hostname - + # Graceful shutdown - CRITICAL for WebSockets terminationGracePeriodSeconds: 120 - + containers: - name: aenebris image: ghcr.io/yourorg/aenebris:1.0.0 imagePullPolicy: IfNotPresent - + # Ports ports: - name: http @@ -504,7 +504,7 @@ spec: - name: metrics containerPort: 9090 protocol: TCP - + # Haskell RTS configuration for high performance command: - /usr/local/bin/aenebris @@ -519,14 +519,14 @@ spec: - "-RTS" - "--config" - "/etc/aenebris/config.yaml" - + # Environment variables env: - name: LOG_LEVEL value: "info" - name: METRICS_PORT value: "9090" - + # Resource requests and limits resources: requests: @@ -535,7 +535,7 @@ spec: limits: cpu: "8000m" # Burst to 8 cores memory: "4Gi" # Hard limit - + # Volume mounts volumeMounts: - name: config @@ -549,7 +549,7 @@ spec: readOnly: true - name: tmp mountPath: /tmp - + # Startup probe (slow initial startup) startupProbe: httpGet: @@ -561,7 +561,7 @@ spec: timeoutSeconds: 1 failureThreshold: 30 # 60 seconds max startup time successThreshold: 1 - + # Liveness probe (detect deadlocks) livenessProbe: httpGet: @@ -573,7 +573,7 @@ spec: timeoutSeconds: 2 failureThreshold: 3 successThreshold: 1 - + # Readiness probe (traffic management) readinessProbe: httpGet: @@ -585,7 +585,7 @@ spec: timeoutSeconds: 2 failureThreshold: 2 successThreshold: 1 - + # PreStop hook for graceful shutdown lifecycle: preStop: @@ -599,7 +599,7 @@ spec: kill -TERM 1 # Wait for connections to drain (110s, leaving 10s buffer) sleep 110 - + # Security context securityContext: allowPrivilegeEscalation: false @@ -609,7 +609,7 @@ spec: capabilities: drop: ["ALL"] add: ["NET_BIND_SERVICE"] - + volumes: - name: config configMap: @@ -683,7 +683,7 @@ spec: target: type: Utilization averageUtilization: 70 - + # Memory-based scaling - type: Resource resource: @@ -691,7 +691,7 @@ spec: target: type: Utilization averageUtilization: 80 - + # Custom metric: requests per second - type: Pods pods: @@ -700,7 +700,7 @@ spec: target: type: AverageValue averageValue: "2000" # 2k req/s per pod - + # Custom metric: active connections - type: Pods pods: @@ -709,7 +709,7 @@ spec: target: type: AverageValue averageValue: "1000" # 1k connections per pod - + # Scaling behavior behavior: scaleUp: @@ -971,7 +971,7 @@ probes: timeoutSeconds: 1 failureThreshold: 30 successThreshold: 1 - + liveness: httpGet: path: /healthz @@ -981,7 +981,7 @@ probes: timeoutSeconds: 2 failureThreshold: 3 successThreshold: 1 - + readiness: httpGet: path: /ready @@ -1009,12 +1009,12 @@ config: enabled: true path: "/health" interval: "10s" - + rateLimit: enabled: true requestsPerSecond: 1000 burst: 2000 - + tls: enabled: true minVersion: "1.2" @@ -1022,7 +1022,7 @@ config: - "TLS_AES_256_GCM_SHA384" - "TLS_AES_128_GCM_SHA256" - "TLS_CHACHA20_POLY1305_SHA256" - + websocket: enabled: true pingInterval: "30s" @@ -1041,7 +1041,7 @@ tls: secrets: upstreamCredentials: existingSecret: "aenebris-upstream-creds" - + # Network policies networkPolicy: enabled: true @@ -1496,7 +1496,7 @@ spec: timeoutSeconds: 1 failureThreshold: 30 # 5s + (30 * 2s) = 65s max successThreshold: 1 - + # Liveness probe - detects deadlocks livenessProbe: httpGet: @@ -1511,7 +1511,7 @@ spec: timeoutSeconds: 2 failureThreshold: 3 # Restart after 30s of failures successThreshold: 1 - + # Readiness probe - traffic management readinessProbe: httpGet: @@ -1541,15 +1541,15 @@ lifecycle: - | # Stop accepting new connections echo "Graceful shutdown initiated at $(date)" - + # Send SIGTERM to application (it should stop accepting) kill -TERM 1 - + # Wait for existing connections to drain # (110 seconds, leaving 10s buffer before SIGKILL) echo "Waiting for connections to drain..." sleep 110 - + echo "Shutdown complete at $(date)" ``` @@ -1575,23 +1575,23 @@ main :: IO () main = do shutdownFlag <- newTVarIO False setupGracefulShutdown shutdownFlag - + -- Start server in separate thread serverThread <- async $ runServer shutdownFlag - + -- Wait for shutdown signal atomically $ do shutdown <- readTVar shutdownFlag unless shutdown retry - + putStrLn "Stopping server, draining connections..." - + -- Stop accepting new connections stopAcceptingConnections - + -- Wait for existing connections to complete waitForConnectionsDrain 110 -- 110 seconds - + putStrLn "All connections drained, exiting" waitForConnectionsDrain :: Int -> IO () @@ -1617,10 +1617,10 @@ metadata: # AWS NLB service.beta.kubernetes.io/aws-load-balancer-connection-draining-enabled: "true" service.beta.kubernetes.io/aws-load-balancer-connection-draining-timeout: "120" - + # GCP cloud.google.com/neg: '{"ingress": true}' - + spec: sessionAffinity: ClientIP sessionAffinityConfig: @@ -1783,7 +1783,7 @@ sum(websocket_connections_total) by (pod) rate(container_cpu_cfs_throttled_seconds_total{pod=~"aenebris.*"}[5m]) # Memory usage vs limit -container_memory_usage_bytes{pod=~"aenebris.*"} / +container_memory_usage_bytes{pod=~"aenebris.*"} / container_spec_memory_limit_bytes{pod=~"aenebris.*"} ``` @@ -1853,14 +1853,14 @@ kubectl delete certificate aenebris-tls -n production This comprehensive deployment guide provides a production-ready foundation for deploying Ᾰenebris on Kubernetes. The architecture achieves: -✅ **Ultra-minimal Docker images** (15-50MB) via multi-stage builds and static linking -✅ **High availability** with topology spread, pod disruption budgets, and anti-affinity -✅ **Zero-downtime deployments** through graceful shutdown and connection draining -✅ **Automated TLS management** with cert-manager -✅ **Secure secrets handling** via External Secrets Operator and Sealed Secrets -✅ **Production-grade monitoring** with Prometheus and Grafana -✅ **Dynamic scaling** from 5 to 50 replicas based on traffic -✅ **WebSocket support** with proper connection management +✅ **Ultra-minimal Docker images** (15-50MB) via multi-stage builds and static linking +✅ **High availability** with topology spread, pod disruption budgets, and anti-affinity +✅ **Zero-downtime deployments** through graceful shutdown and connection draining +✅ **Automated TLS management** with cert-manager +✅ **Secure secrets handling** via External Secrets Operator and Sealed Secrets +✅ **Production-grade monitoring** with Prometheus and Grafana +✅ **Dynamic scaling** from 5 to 50 replicas based on traffic +✅ **WebSocket support** with proper connection management **Next Steps:** 1. Customize values.yaml for your environment diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/haskell-networking.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/haskell-networking.md similarity index 97% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/haskell-networking.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/haskell-networking.md index d48308a5..b2d3b8c7 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/haskell-networking.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/haskell-networking.md @@ -194,7 +194,7 @@ bingExample = do ### WaiProxyResponse type ```haskell -data WaiProxyResponse +data WaiProxyResponse = WPRResponse WAI.Response -- Return custom response | WPRProxyDest ProxyDest -- Forward to destination | WPRModifiedRequest WAI.Request ProxyDest -- Modify then forward @@ -245,7 +245,7 @@ proxyApp manager request respond = do else give chunk >> loop in loop } - + -- Make the request and forward response httpLbs proxiedReq manager >>= \response -> respond $ responseLBS @@ -257,7 +257,7 @@ proxyApp manager request respond = do fixHeaders :: RequestHeaders -> RequestHeaders fixHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders where - hopByHopHeaders = + hopByHopHeaders = [ "connection", "keep-alive", "proxy-authenticate" , "proxy-authorization", "te", "trailers" , "transfer-encoding", "upgrade" @@ -266,7 +266,7 @@ fixHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders fixResponseHeaders :: ResponseHeaders -> ResponseHeaders fixResponseHeaders = filter $ \(name, _) -> name `notElem` hopByHopHeaders where - hopByHopHeaders = + hopByHopHeaders = [ "connection", "keep-alive", "proxy-authenticate" , "proxy-authorization", "te", "trailers" , "transfer-encoding", "upgrade" @@ -286,7 +286,7 @@ main = do ```haskell -- Add X-Forwarded-For header addForwardedFor :: Request -> RequestHeaders -> RequestHeaders -addForwardedFor req headers = +addForwardedFor req headers = let clientIP = show (remoteHost req) existing = lookup "X-Forwarded-For" headers newValue = case existing of @@ -369,7 +369,7 @@ import Network.HTTP.Types import Data.ByteString.Builder (byteString) app :: Application -app _req respond = respond $ +app _req respond = respond $ responseStream status200 [("Content-Type", "text/plain")] $ \write flush -> do write $ byteString "Hello\n" flush @@ -388,10 +388,10 @@ import Data.Function (fix) import Control.Monad (unless) streamFileApp :: Application -streamFileApp _req respond = +streamFileApp _req respond = withBinaryFile "largefile.txt" ReadMode $ \h -> - respond $ responseStream status200 [("Content-Type", "text/plain")] $ - \chunk _flush -> + respond $ responseStream status200 [("Content-Type", "text/plain")] $ + \chunk _flush -> fix $ \loop -> do bs <- B.hGetSome h 4096 -- Only 4KB in memory at once unless (B.null bs) $ do @@ -414,17 +414,17 @@ import qualified Data.ByteString.Char8 as C8 sseApp :: Application sseApp _req sendResponse = sendResponse $ - responseStream status200 + responseStream status200 [("Content-Type", "text/event-stream"), ("Cache-Control", "no-cache"), - ("Connection", "keep-alive")] + ("Connection", "keep-alive")] myStream myStream :: (Builder -> IO ()) -> IO () -> IO () myStream send flush = do send $ byteString "data: Starting streaming response.\n\n" flush - + forM_ [1..50 :: Int] $ \i -> do threadDelay 1000000 -- 1 second send $ byteString "data: Message " <> byteString (C8.pack $ show i) <> byteString "\n\n" @@ -464,10 +464,10 @@ main = do -- Pure operations result <- runConduit $ yieldMany [1..10] .| sumC print result -- 55 - + -- File operations - runConduitRes $ - sourceFile "input.txt" .| + runConduitRes $ + sourceFile "input.txt" .| sinkFile "output.txt" ``` @@ -480,8 +480,8 @@ import qualified Data.Conduit.Binary as CB import Control.Monad.Trans.Resource conduitFileApp :: Application -conduitFileApp _req respond = - respond $ responseStream status200 [("Content-Type", "text/plain")] $ +conduitFileApp _req respond = + respond $ responseStream status200 [("Content-Type", "text/plain")] $ \write flush -> runResourceT $ do CB.sourceFile "largefile.txt" $$ CB.mapM_ $ \chunk -> liftIO $ do write (byteString chunk) @@ -498,8 +498,8 @@ import qualified Data.Conduit.List as CL streamFromDB :: Handler () streamFromDB = do -- selectSource returns a conduit Source - selectSource [] [] - $$ CL.mapM_ $ \(Entity _ record) -> + selectSource [] [] + $$ CL.mapM_ $ \(Entity _ record) -> liftIO $ processRecord record ``` @@ -531,8 +531,8 @@ import Data.Conduit import qualified Data.Conduit.List as CL sumConduit :: IO Int -sumConduit = runConduit $ - yieldMany [1..10] .| +sumConduit = runConduit $ + yieldMany [1..10] .| CL.fold (+) 0 ``` @@ -589,17 +589,17 @@ generateCSV write flush = do -- Header write $ byteString "id,name,value\n" flush - + -- Generate 1 million rows without buffering forM_ [1..1000000] $ \i -> do - let row = byteString $ C8.pack $ + let row = byteString $ C8.pack $ show i ++ ",Item" ++ show i ++ "," ++ show (i * 100) ++ "\n" write row when (i `mod` 1000 == 0) flush csvApp :: Application csvApp _req respond = respond $ - responseStream status200 + responseStream status200 [("Content-Type", "text/csv"), ("Content-Disposition", "attachment; filename=data.csv")] generateCSV @@ -611,19 +611,19 @@ csvApp _req respond = respond $ processWithProgress :: (Builder -> IO ()) -> IO () -> IO () processWithProgress write flush = do let total = 100 - + forM_ [1..total] $ \i -> do threadDelay 100000 -- Simulate work - - let progress = byteString $ - "data: {\"progress\": " <> - byteString (C8.pack $ show i) <> - ", \"total\": " <> - byteString (C8.pack $ show total) <> + + let progress = byteString $ + "data: {\"progress\": " <> + byteString (C8.pack $ show i) <> + ", \"total\": " <> + byteString (C8.pack $ show total) <> "}\n\n" write progress flush - + write $ byteString "data: {\"status\": \"complete\"}\n\n" flush ``` @@ -725,7 +725,7 @@ application state pending = do client = (T.drop (T.length prefix) msg, conn) disconnect = do s <- modifyMVar state $ \s -> - let s' = filter ((/= fst client) . fst) s + let s' = filter ((/= fst client) . fst) s in return (s', s') broadcast (fst client <> " disconnected") s @@ -798,9 +798,9 @@ advancedTLS = do } , onInsecure = DenyInsecure "This server requires HTTPS" } - + warpOpts = setPort 443 $ setHost "0.0.0.0" $ defaultSettings - + runTLS tlsOpts warpOpts app validateClientCert :: CertificateChain -> IO CertificateUsage @@ -821,7 +821,7 @@ secureTLS = do let tlsOpts = tlsSettings "cert.pem" "key.pem" warpOpts = setPort 443 defaultSettings wsApp = websocketsOr WS.defaultConnectionOptions wsHandler httpApp - + runTLS tlsOpts warpOpts wsApp wsHandler :: WS.ServerApp @@ -844,7 +844,7 @@ dynamicCerts = do Just "example.com" -> loadCredentials "example.pem" "example-key.pem" Just "other.com" -> loadCredentials "other.pem" "other-key.pem" _ -> loadCredentials "default.pem" "default-key.pem" - + runTLS tlsOpts defaultSettings app loadCredentials :: FilePath -> FilePath -> IO Credentials @@ -909,7 +909,7 @@ gracefulShutdown = do let settings = setInstallShutdownHandler shutdownHandler $ setGracefulShutdownTimeout (Just 30) -- 30 seconds max $ setPort 8080 defaultSettings - + runSettings settings app where shutdownHandler closeSocket = do @@ -935,7 +935,7 @@ gracefulShutdown = do {-# LANGUAGE OverloadedStrings #-} productionSettings :: Settings -productionSettings = +productionSettings = setPort 443 $ setHost "*" $ setOnOpen onOpen @@ -953,13 +953,13 @@ productionSettings = onOpen sockAddr = do putStrLn $ "Connection: " ++ show sockAddr return True - - onClose sockAddr = + + onClose sockAddr = putStrLn $ "Closed: " ++ show sockAddr - - onException _ e = + + onException _ e = putStrLn $ "Exception: " ++ show e - + shutdownHandler closeSocket = do _ <- installHandler sigTERM (Catch closeSocket) Nothing _ <- installHandler sigINT (Catch closeSocket) Nothing @@ -1023,16 +1023,16 @@ websocketHandler pending = do -- HTTP handler (including streaming) httpHandler :: Application -httpHandler req respond = +httpHandler req respond = case pathInfo req of ["stream"] -> respond $ streamingResponse ["ws"] -> respond $ responseLBS status404 [] "Use WebSocket protocol" _ -> respond $ responseLBS status200 [] "Hello HTTP" streamingResponse :: Response -streamingResponse = responseStream - status200 - [("Content-Type", "text/event-stream")] +streamingResponse = responseStream + status200 + [("Content-Type", "text/event-stream")] $ \write flush -> forever $ do threadDelay 1000000 write $ byteString "data: tick\n\n" @@ -1067,10 +1067,10 @@ server { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; - + # Critical: disable buffering proxy_buffering off; - + # Increase timeouts proxy_read_timeout 86400s; proxy_send_timeout 86400s; @@ -1080,11 +1080,11 @@ server { location /stream/ { proxy_pass http://localhost:8002; proxy_http_version 1.1; - + # Critical: disable buffering for streaming proxy_buffering off; proxy_cache off; - + # Keep connection alive proxy_set_header Connection ''; proxy_set_header Cache-Control 'no-cache'; @@ -1242,9 +1242,9 @@ For unidirectional streaming, SSE offers advantages: ```haskell sseHandler :: Application sseHandler _req respond = respond $ - responseStream status200 + responseStream status200 [("Content-Type", "text/event-stream"), - ("Cache-Control", "no-cache")] + ("Cache-Control", "no-cache")] $ \write flush -> forever $ do threadDelay 1000000 write $ byteString "data: update\n\n" diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/http2-http3.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/http2-http3.md similarity index 99% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/http2-http3.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/http2-http3.md index 32e60dd3..779bb8d2 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/http2-http3.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/http2-http3.md @@ -163,14 +163,14 @@ server { listen 443 ssl; listen [::]:443 ssl; http2 on; - + # HTTP/3 over UDP listen 443 quic reuseport; listen [::]:443 quic reuseport; - + ssl_protocols TLSv1.2 TLSv1.3; add_header Alt-Svc 'h3=":443"; ma=86400' always; - + location / { proxy_pass http://localhost:3000; # Warp proxy_http_version 1.1; @@ -221,7 +221,7 @@ import Control.Monad.Trans.Resource app :: Application app req respond = runResourceT $ do - (releaseKey, handle) <- allocate + (releaseKey, handle) <- allocate (openFile "data.txt" ReadMode) hClose content <- liftIO $ hGetContents handle diff --git a/PROJECTS/Aenebris/docs/proxy-haskell-research/load-balancing.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/load-balancing.md similarity index 97% rename from PROJECTS/Aenebris/docs/proxy-haskell-research/load-balancing.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/load-balancing.md index c6ea7bae..19480dfd 100644 --- a/PROJECTS/Aenebris/docs/proxy-haskell-research/load-balancing.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/load-balancing.md @@ -88,7 +88,7 @@ data Backend = Backend } trackConnection :: Backend -> IO a -> IO a -trackConnection backend action = +trackConnection backend action = bracket_ (atomically $ modifyTVar' (activeConnections backend) (+1)) (atomically $ modifyTVar' (activeConnections backend) (subtract 1)) @@ -110,7 +110,7 @@ This pattern **composes naturally with health checks** - the STM transaction can import Control.Concurrent.LoadDistribution lb <- evenlyDistributed (return $ Set.fromList backends) -withResource lb $ \maybeBackend -> +withResource lb $ \maybeBackend -> case maybeBackend of Just backend -> proxyRequest backend Nothing -> handleNoBackends @@ -132,18 +132,18 @@ data WeightedBackend a = WeightedBackend smoothWeightedSelect :: [WeightedBackend a] -> IO a smoothWeightedSelect backends = atomically $ do -- Increase all current weights by their base weights - forM_ backends $ \wb -> + forM_ backends $ \wb -> modifyTVar' (currentWeight wb) (+ weight wb) - + -- Find backend with maximum current weight weights <- mapM (readTVar . currentWeight) backends let maxWeight = maximum weights selected = backends !! fromJust (findIndex (== maxWeight) weights) - + -- Reduce selected backend's current weight by total let totalWeight = sum (map weight backends) modifyTVar' (currentWeight selected) (subtract totalWeight) - + return $ backend selected ``` @@ -188,7 +188,7 @@ data BackendState = BackendState -- BAD: Touches many TVars in single transaction countAllConnections :: [Backend] -> STM Int -countAllConnections backends = +countAllConnections backends = sum <$> mapM (readTVar . activeConns) backends -- GOOD: Maintain aggregate counter @@ -281,7 +281,7 @@ The `retry` primitive is STM's killer feature - **threads automatically block un badPattern = atomically $ do val <- expensiveComputation -- Recomputed on every retry! tvar <- readTVar someTVar - + -- GOOD: Pure computation outside goodPattern = do let val = expensiveComputation @@ -299,7 +299,7 @@ goodPattern = do ```haskell -- Update multiple backend states atomically updateHealthChecks :: [Backend] -> [(Backend, Bool)] -> STM () -updateHealthChecks backends results = +updateHealthChecks backends results = forM_ results $ \(backend, isHealthy) -> writeTVar (healthy backend) isHealthy ``` @@ -344,7 +344,7 @@ performHealthCheck manager config backend = do req <- parseRequest url response <- httpLbs req manager return $ statusCode (responseStatus response) == 200 - + return $ fromMaybe False result ``` @@ -362,13 +362,13 @@ import Control.Monad (forever) healthCheckLoop :: Manager -> HealthCheckConfig -> [Backend] -> IO () healthCheckLoop manager config backends = forever $ do -- Check all backends concurrently - results <- mapConcurrently - (performHealthCheck manager config) + results <- mapConcurrently + (performHealthCheck manager config) backends - + -- Update backend states zipWithM_ (updateBackendState config) backends results - + -- Wait for next interval threadDelay (hcInterval config * 1000000) @@ -414,7 +414,7 @@ updateBackendState config backend healthy = atomically $ do state <- readTVar (backendState backend) failures <- readTVar (backendFailures backend) successes <- readTVar (backendSuccesses backend) - + case (state, healthy) of (Healthy, False) -> do let newFailures = failures + 1 @@ -422,22 +422,22 @@ updateBackendState config backend healthy = atomically $ do when (newFailures >= hcMaxFailures config) $ do writeTVar (backendState backend) Unhealthy writeTVar (backendFailures backend) 0 - + (Unhealthy, True) -> do writeTVar (backendState backend) Recovering writeTVar (backendSuccesses backend) 1 - + (Recovering, True) -> do let newSuccesses = successes + 1 writeTVar (backendSuccesses backend) newSuccesses when (newSuccesses >= hcRecoveryAttempts config) $ do writeTVar (backendState backend) Healthy writeTVar (backendSuccesses backend) 0 - + (Recovering, False) -> do writeTVar (backendState backend) Unhealthy writeTVar (backendSuccesses backend) 0 - + _ -> return () ``` @@ -458,15 +458,15 @@ testBreaker = undefined proxyWithCircuitBreaker :: Backend -> Request -> IO Response proxyWithCircuitBreaker backend req = do cbConf <- initialBreakerState - - result <- flip runReaderT cbConf $ + + result <- flip runReaderT cbConf $ withBreaker testBreaker $ liftIO $ forwardRequest backend req - + case result of - Left (CircuitBreakerClosed msg) -> + Left (CircuitBreakerClosed msg) -> -- Circuit open, return cached response or error return $ errorResponse 503 "Service Temporarily Unavailable" - Right response -> + Right response -> return response ``` @@ -521,7 +521,7 @@ exponentialBackoffWithJitter config action = go 0 (initialDelay config) ```haskell import Control.Retry -recovering +recovering (exponentialBackoff 50000 <> limitRetries 5) [const $ Handler $ \e -> return (isRetryable e)] (\_ -> performHealthCheck backend) @@ -554,16 +554,16 @@ proxyApp :: ProxyConfig -> Application proxyApp config req respond = do mBackend <- selectHealthyBackend (pcBalancer config) case mBackend of - Nothing -> + Nothing -> respond $ responseLBS status503 [] "No healthy backends available" - Just backend -> - waiProxyTo - (\_ -> return $ WPRProxyDest (ProxyDest - (backendHost backend) + Just backend -> + waiProxyTo + (\_ -> return $ WPRProxyDest (ProxyDest + (backendHost backend) (backendPort backend))) - defaultOnExc + defaultOnExc (pcManager config) - req + req respond ``` @@ -585,7 +585,7 @@ import Network.Wai (Middleware, mapResponseHeaders) -- Add load balancer info header addBackendHeader :: Backend -> Middleware addBackendHeader backend app req respond = - app req $ respond . mapResponseHeaders + app req $ respond . mapResponseHeaders ((hBackend, encodeUtf8 $ backendId backend) :) -- Connection tracking middleware @@ -593,18 +593,18 @@ trackingMiddleware :: ServerMetrics -> Middleware trackingMiddleware metrics app req respond = do atomically $ modifyTVar' (activeConnections metrics) (+1) atomically $ modifyTVar' (totalRequests metrics) (+1) - + let respond' res = do atomically $ modifyTVar' (activeConnections metrics) (subtract 1) respond res - + app req respond' `onException` atomically (modifyTVar' (errorCount metrics) (+1)) -- Compose middleware main = do config <- initProxyConfig - let app = trackingMiddleware metrics + let app = trackingMiddleware metrics $ proxyApp config run 8000 app ``` @@ -624,7 +624,7 @@ main = do **Compile-time optimizations**: ```cabal -ghc-options: -Wall -O2 -threaded +ghc-options: -Wall -O2 -threaded -rtsopts -with-rtsopts=-N -fspec-constr -fspecialise -funbox-strict-fields @@ -709,7 +709,7 @@ data ProxyConfig = ProxyConfig -- Backend selection dispatcher selectBackend :: ProxyConfig -> IO (Maybe Backend) -selectBackend config = +selectBackend config = case strategy config of RoundRobin -> selectRoundRobin config LeastConnections -> selectLeastConnections config @@ -722,7 +722,7 @@ selectRoundRobin config = do len = V.length backends' idx <- atomicModifyIORef' (rrCounter config) $ \i -> ((i + 1) `mod` len, i) - + -- Find next healthy backend findHealthy backends' idx len where @@ -733,7 +733,7 @@ selectRoundRobin config = do isHealthy <- atomically $ (== Healthy) <$> readTVar (state backend) if isHealthy then return (Just backend) - else findHealthy backends' + else findHealthy backends' ((start + 1) `mod` V.length backends') (remaining - 1) @@ -756,24 +756,24 @@ selectLeastConnections config = do selectWeightedRR :: ProxyConfig -> IO (Maybe Backend) selectWeightedRR config = atomically $ do let backends' = V.toList (backends config) - + -- Increase current weights - forM_ backends' $ \wb -> + forM_ backends' $ \wb -> modifyTVar' (currentWeight wb) (+ backendWeight wb) - + -- Select backend with max current weight weights <- mapM (readTVar . currentWeight) backends' let maxWeight = maximum weights selected = backends' !! fromJust (findIndex (== maxWeight) weights) - + -- Check health isHealthy <- (== Healthy) <$> readTVar (state selected) guard isHealthy - + -- Reduce selected backend's current weight let totalWeight = sum (map backendWeight backends') modifyTVar' (currentWeight selected) (subtract totalWeight) - + return selected -- Main proxy application @@ -781,17 +781,17 @@ proxyApp :: ProxyConfig -> Application proxyApp config req respond = do mBackend <- selectBackend config case mBackend of - Nothing -> + Nothing -> respond $ responseLBS status503 [] "No healthy backends" Just backend -> do -- Track connection atomically $ modifyTVar' (activeConns backend) (+1) - + let dest = ProxyDest (backendHost backend) (backendPort backend) respond' res = do atomically $ modifyTVar' (activeConns backend) (subtract 1) respond res - + waiProxyTo (\_ -> return $ WPRProxyDest dest) defaultOnExc @@ -807,14 +807,14 @@ healthCheckLoop manager backends = forever $ do threadDelay 10000000 -- 10 seconds where checkHealth mgr backend = do - let url = "http://" <> backendHost backend <> ":" + let url = "http://" <> backendHost backend <> ":" <> show (backendPort backend) <> "/health" result <- timeout 2000000 $ do req <- parseRequest (unpack url) response <- httpLbs req mgr return $ statusCode (responseStatus response) == 200 return $ fromMaybe False result - + updateHealth backend healthy = atomically $ do currentState <- readTVar (state backend) failureCount <- readTVar (failures backend) @@ -838,7 +838,7 @@ initProxyConfig specs strat = do manager <- newTlsManager counter <- newIORef 0 checker <- async $ healthCheckLoop manager (V.toList backends) - + return ProxyConfig { backends = backends , strategy = strat @@ -859,18 +859,18 @@ initProxyConfig specs strat = do -- Main entry point main :: IO () main = do - let backendSpecs = + let backendSpecs = [ BackendSpec "localhost" 8001 5 , BackendSpec "localhost" 8002 1 , BackendSpec "localhost" 8003 1 ] - + config <- initProxyConfig backendSpecs SmoothWeightedRR - - let settings = setPort 8000 - $ setTimeout 30 + + let settings = setPort 8000 + $ setTimeout 30 $ defaultSettings - + putStrLn "Load balancing proxy started on port 8000" runSettings settings (proxyApp config) ``` @@ -939,8 +939,8 @@ import Test.DejaFu testNoDeadlock :: IO () testNoDeadlock = autocheck $ do balancer <- setup - concurrently_ - (selectBackend balancer) + concurrently_ + (selectBackend balancer) (selectBackend balancer) ``` diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/ml-bot-detection.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/ml-bot-detection.md similarity index 100% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/ml-bot-detection.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/ml-bot-detection.md diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/performance-optimization.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/performance-optimization.md similarity index 97% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/performance-optimization.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/performance-optimization.md index fd36863c..406a657f 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/performance-optimization.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/performance-optimization.md @@ -30,13 +30,13 @@ import Foreign.C.Types import System.Posix.Types (Fd(..)) foreign import ccall unsafe "splice" - c_splice :: CInt -> Ptr CLong -> CInt -> Ptr CLong + c_splice :: CInt -> Ptr CLong -> CInt -> Ptr CLong -> CSize -> CUInt -> IO CSsize splice :: Fd -> Fd -> Int -> [SpliceFlag] -> IO Int splice (Fd fdIn) (Fd fdOut) len flags = do let cflags = foldr (.|.) 0 [f | SpliceFlag f <- flags] - result <- c_splice fdIn nullPtr fdOut nullPtr + result <- c_splice fdIn nullPtr fdOut nullPtr (fromIntegral len) cflags if result == -1 then throwErrno "splice" @@ -59,10 +59,10 @@ The `simple-sendfile` package powers Warp's high-performance static file serving ```haskell import Network.Sendfile -sendfileWithHeader :: Socket -> FilePath -> FileRange +sendfileWithHeader :: Socket -> FilePath -> FileRange -> IO () -> [ByteString] -> IO () -- Sends headers and file data efficiently -sendfileWithHeader sock path (PartOfFile offset len) +sendfileWithHeader sock path (PartOfFile offset len) tickle headers ``` @@ -77,7 +77,7 @@ spliceWithRetry :: Fd -> Fd -> Int -> IO () spliceWithRetry fdIn fdOut chunkSize = loop where loop = do - result <- try $ splice fdIn fdOut chunkSize + result <- try $ splice fdIn fdOut chunkSize [spliceNonBlock, spliceMore] case result of Right 0 -> return () -- EOF @@ -111,15 +111,15 @@ Conversion costs between variants matter significantly. `toStrict` forces entire ```haskell import Data.ByteString.Builder -buildHttpResponse :: Int -> [(ByteString, ByteString)] +buildHttpResponse :: Int -> [(ByteString, ByteString)] -> LazyByteString -> LazyByteString buildHttpResponse status headers body = toLazyByteString builder where - builder = statusLine <> headerLines + builder = statusLine <> headerLines <> byteString "\r\n" <> lazyByteString body - statusLine = byteString "HTTP/1.1 " <> intDec status + statusLine = byteString "HTTP/1.1 " <> intDec status <> byteString " OK\r\n" - headerLines = mconcat + headerLines = mconcat [ byteString k <> byteString ": " <> byteString v <> byteString "\r\n" | (k, v) <- headers ] ``` @@ -134,7 +134,7 @@ import Data.Pool createBackendPool :: HostName -> PortNumber -> IO (Pool Socket) createBackendPool host port = do capabilities <- getNumCapabilities - newPool $ + newPool $ defaultPoolConfig (connectBackend host port) -- Create function close -- Destroy function @@ -228,7 +228,7 @@ Interpreting results requires understanding latency distribution. The `--latency ``` Latency Distribution 50% 635.91us - 75% 712.34us + 75% 712.34us 90% 1.04ms 99% 2.87ms ``` @@ -385,7 +385,7 @@ ThreadScope displays CPU activity across cores, spark creation/conversion (for p **Profiling workflow progresses systematically**: 1. **Baseline measurement** with `-O2 +RTS -s` establishes initial performance -2. **Time profiling** with `-prof -fprof-late +RTS -p` identifies CPU hotspots +2. **Time profiling** with `-prof -fprof-late +RTS -p` identifies CPU hotspots 3. **Memory profiling** with `-hd -l` and eventlog2html reveals allocation patterns 4. **Detailed investigation** using info table profiling for exact source locations 5. **Iterative optimization** applying fixes and re-profiling to verify improvements @@ -401,7 +401,7 @@ Successful optimization follows priority order: algorithms trump micro-optimizat **Compilation optimization checklist**: - [ ] Use `-O` or `-O2` for production builds - [ ] Add `-fllvm` for numeric-intensive code after benchmarking -- [ ] Enable `-threaded` for concurrent programs +- [ ] Enable `-threaded` for concurrent programs - [ ] Include `-rtsopts` to allow runtime tuning - [ ] Set `-with-rtsopts=-N` for automatic parallelism - [ ] Use `optimization: 2` in cabal.project, not `ghc-options` @@ -483,7 +483,7 @@ import System.IO data ProxyConfig = ProxyConfig { listenPort :: PortNumber - , targetHost :: HostName + , targetHost :: HostName , targetPort :: PortNumber , poolStripes :: Int , poolPerStripe :: Int @@ -492,8 +492,8 @@ data ProxyConfig = ProxyConfig -- Create backend connection pool createBackendPool :: ProxyConfig -> IO (Pool Socket) -createBackendPool config = - newPool $ +createBackendPool config = + newPool $ defaultPoolConfig (connectBackend (targetHost config) (targetPort config)) close @@ -503,7 +503,7 @@ createBackendPool config = connectBackend :: HostName -> PortNumber -> IO Socket connectBackend host port = do - addr:_ <- getAddrInfo + addr:_ <- getAddrInfo (Just defaultHints { addrSocketType = Stream }) (Just host) (Just $ show port) sock <- socket (addrFamily addr) Stream defaultProtocol @@ -517,18 +517,18 @@ runProxy :: ProxyConfig -> IO () runProxy config = do pool <- createBackendPool config addr:_ <- getAddrInfo - (Just defaultHints + (Just defaultHints { addrSocketType = Stream , addrFlags = [AI_PASSIVE] }) Nothing (Just $ show $ listenPort config) - + sock <- socket (addrFamily addr) Stream defaultProtocol setSocketOption sock ReuseAddr 1 bind sock (addrAddress addr) listen sock 128 - + putStrLn $ "Proxy listening on port " ++ show (listenPort config) - + forever $ do (client, clientAddr) <- accept sock forkIO $ handleClient pool client @@ -538,27 +538,27 @@ runProxy config = do handleClient :: Pool Socket -> Socket -> IO () handleClient pool client = do done <- newEmptyMVar - + withResource pool $ \backend -> do -- Bidirectional zero-copy forwarding let chunkSize = 65536 -- 64KB chunks - + forkIO $ do - result <- try $ splice chunkSize (client, Nothing) + result <- try $ splice chunkSize (client, Nothing) (backend, Nothing) case result of - Left (e :: SomeException) -> + Left (e :: SomeException) -> putStrLn $ "Client->Backend error: " ++ show e Right _ -> return () putMVar done () - + result <- try $ splice chunkSize (backend, Nothing) (client, Nothing) case result of Left (e :: SomeException) -> putStrLn $ "Backend->Client error: " ++ show e Right _ -> return () - + takeMVar done main :: IO () @@ -582,7 +582,7 @@ main = do import Data.ByteString.Builder import qualified Data.ByteString.Lazy as BL -buildHttpResponse :: Int -> [(ByteString, ByteString)] +buildHttpResponse :: Int -> [(ByteString, ByteString)] -> BL.ByteString -> BL.ByteString buildHttpResponse status headers body = toLazyByteString $ mconcat @@ -591,7 +591,7 @@ buildHttpResponse status headers body = toLazyByteString $ , byteString " " , statusText status , byteString "\r\n" - , mconcat [ byteString k <> byteString ": " + , mconcat [ byteString k <> byteString ": " <> byteString v <> byteString "\r\n" | (k, v) <- headers ] , byteString "\r\n" @@ -599,7 +599,7 @@ buildHttpResponse status headers body = toLazyByteString $ ] where statusText 200 = byteString "OK" - statusText 404 = byteString "Not Found" + statusText 404 = byteString "Not Found" statusText 500 = byteString "Internal Server Error" statusText _ = byteString "Unknown" ``` @@ -616,14 +616,14 @@ parseRequestLine :: ByteString -> Maybe (ByteString, ByteString, ByteString) parseRequestLine bs = do let (method, rest1) = BS.break (== space) bs guard (not $ BS.null rest1) - + let rest2 = BS.drop 1 rest1 (path, rest3) = BS.break (== space) rest2 guard (not $ BS.null rest3) - + let rest4 = BS.drop 1 rest3 (version, _) = BS.break (== cr) rest4 - + return (method, path, version) where space = 32; cr = 13 @@ -635,11 +635,11 @@ parseHeaders = go . BC.lines go [] = [] go (line:rest) | BS.null line = [] - | otherwise = + | otherwise = case BC.break (== ':') line of - (key, value) + (key, value) | BS.null value -> go rest - | otherwise -> + | otherwise -> let val = BS.dropWhile (== 32) (BS.drop 1 value) in (key, val) : go rest ``` diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/rate-limiting.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/rate-limiting.md similarity index 99% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/rate-limiting.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/rate-limiting.md index cb51e712..3eb037e1 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/rate-limiting.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/rate-limiting.md @@ -210,16 +210,16 @@ RateLimit: "default";r=0;t=60 async function fetchWithRetry(url, maxRetries = 3) { for (let attempt = 0; attempt < maxRetries; attempt++) { const res = await fetch(url); - + if (res.status === 429) { const retryAfter = res.headers.get('retry-after'); const delay = parseInt(retryAfter) * 1000 || (1000 * Math.pow(2, attempt)); const jitter = delay * 0.2 * (Math.random() - 0.5); - + await sleep(delay + jitter); continue; } - + return res; } throw new Error('Max retries exceeded'); diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/streaming-websockets.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/streaming-websockets.md similarity index 98% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/streaming-websockets.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/streaming-websockets.md index c8dfd649..b4e97b1e 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/streaming-websockets.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/streaming-websockets.md @@ -34,7 +34,7 @@ For a Haskell reverse proxy, the recommended approach uses WAI's `responseRaw` c ```haskell handleWebSocketProxy :: Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived -handleWebSocketProxy req respond = respond $ +handleWebSocketProxy req respond = respond $ responseRaw (rawProxy targetHost targetPort) backupResponse ``` @@ -83,7 +83,7 @@ The **recommended hybrid approach**: forward all ping/pong frames transparently Per-connection state: last_activity: timestamp pong_expected: bool - + Periodic check (every 10s): if pong_expected and (now - ping_sent_at) > pong_timeout: terminate_connection("pong timeout") @@ -104,7 +104,7 @@ HAProxy's model provides the blueprint for proper timeout architecture: ``` defaults timeout client 25s # HTTP inactivity - timeout server 25s # HTTP inactivity + timeout server 25s # HTTP inactivity timeout connect 5s # TCP establishment timeout tunnel 3600s # WebSocket/upgraded connections ``` @@ -129,7 +129,7 @@ Auto-detect connection type via `Connection: Upgrade` + `Upgrade: websocket` hea The connection state machine should explicitly model different phases: ```haskell -data ConnectionState +data ConnectionState = HttpRequest -- Initial HTTP parsing | HttpResponse -- Response from upstream | ProtocolUpgrade -- Detected upgrade, awaiting 101 @@ -155,14 +155,14 @@ transitionState :: ConnectionState -> Event -> ConnectionState **Recommended Haskell stack:** - `wai` + `warp`: HTTP server foundation -- `streaming-commons`: TCP client connections +- `streaming-commons`: TCP client connections - `splice`: Zero-copy socket forwarding on Linux - `async`: Concurrent bidirectional copy with `race_` - `websockets` + `wai-websockets`: Only if frame-level access needed **Architecture flow:** ``` -Listener → HTTP Parser → Route Match → +Listener → HTTP Parser → Route Match → ├─ Regular HTTP → Buffer Pool → Upstream → Response Buffer → Client ├─ WebSocket → Upgrade Handler → Bidirectional Tunnel (splice) └─ SSE/Stream → Detect Header → Immediate Flush → Client diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/tls-ssl.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/tls-ssl.md similarity index 99% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/tls-ssl.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/tls-ssl.md index 2bb5a609..4ecc4390 100644 --- a/PROJECTS/Aenebris/refer/proxy-haskell-research/tls-ssl.md +++ b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/tls-ssl.md @@ -91,10 +91,10 @@ tlsClient hostname port = do addr:_ <- getAddrInfo Nothing (Just hostname) (Just port) sock <- socket (addrFamily addr) Stream defaultProtocol connect sock (addrAddress addr) - + -- Configure TLS parameters let params = (defaultParamsClient hostname "") - { clientSupported = def + { clientSupported = def { supportedCiphers = ciphersuite_default , supportedVersions = [TLS13, TLS12] , supportedGroups = [X25519, P256] @@ -103,16 +103,16 @@ tlsClient hostname port = do { sharedCAStore = systemStore } } - + -- Perform handshake ctx <- contextNew sock params handshake ctx - + -- Send HTTP request sendData ctx "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" response <- recvData ctx print response - + -- Clean shutdown bye ctx close sock @@ -131,8 +131,8 @@ import qualified Network.TLS as TLS import Network.TLS.Extra.Cipher app :: Application -app _ respond = - respond $ responseLBS status200 +app _ respond = + respond $ responseLBS status200 [("Content-Type", "text/plain") ,("Strict-Transport-Security", "max-age=31536000; includeSubDomains")] "Secure HTTPS Server" @@ -144,11 +144,11 @@ main = do , tlsCiphers = ciphersuite_strong , onInsecure = DenyInsecure "HTTPS required" } - + warpConfig = defaultSettings & setPort 443 & setHost "0.0.0.0" - + putStrLn "HTTPS server on :443" runTLS tlsConfig warpConfig app ``` @@ -169,14 +169,14 @@ validateCertificate certFile hostname = do -- Load certificate chain certs <- readSignedObject certFile let chain = CertificateChain certs - + -- Get system CA store store <- getSystemCertificateStore - + -- Validate with default checks let cache = exceptionValidationCache [] failures <- validateDefault store cache (hostname, ":443") chain - + case failures of [] -> putStrLn "✓ Certificate valid" >> return True errs -> do @@ -206,10 +206,10 @@ initializeKeys :: CertConfig -> IO () initializeKeys cfg = do accountExists <- doesFileExist (accountKey cfg) domainExists <- doesFileExist (domainKey cfg) - - unless accountExists $ + + unless accountExists $ callCommand $ "openssl genrsa 4096 > " ++ accountKey cfg - + unless domainExists $ callCommand $ "openssl genrsa 4096 > " ++ domainKey cfg @@ -337,7 +337,7 @@ import qualified Network.TLS as TLS customTlsManager :: IO Manager customTlsManager = do let tlsParams = (TLS.defaultParamsClient "example.com" "") - { TLS.clientSupported = def + { TLS.clientSupported = def { TLS.supportedCiphers = ciphersuite_strong , TLS.supportedVersions = [TLS.TLS13, TLS.TLS12] } @@ -346,15 +346,15 @@ customTlsManager = do } } tlsSettings = TLSSettings tlsParams - + newManager $ mkManagerSettings tlsSettings Nothing -customValidation :: CertificateStore -> ValidationCache -> ServiceID +customValidation :: CertificateStore -> ValidationCache -> ServiceID -> CertificateChain -> IO [FailedReason] customValidation store cache sid chain = do -- Perform standard validation failures <- validateDefault store cache sid chain - + -- Add custom checks (certificate pinning, etc.) if null failures then return [] @@ -375,11 +375,11 @@ loadCredentials hostname = do main :: IO () main = do - let tlsConfig = tlsSettingsSni + let tlsConfig = tlsSettingsSni (return $ Just loadCredentials) "default.crt" "default.key" - + runTLS tlsConfig defaultSettings app ``` @@ -392,15 +392,15 @@ import Data.IORef setupSessionManager :: IO SessionManager setupSessionManager = do sessions <- newIORef Map.empty - + return SessionManager { sessionResume = \sessionID -> do cache <- readIORef sessions return $ Map.lookup sessionID cache - + , sessionEstablish = \sessionID sessionData -> do modifyIORef' sessions (Map.insert sessionID sessionData) - + , sessionInvalidate = \sessionID -> do modifyIORef' sessions (Map.delete sessionID) } @@ -408,7 +408,7 @@ setupSessionManager = do clientWithResumption :: HostName -> IO () clientWithResumption hostname = do manager <- setupSessionManager - + let params = (defaultParamsClient hostname "") { clientShared = def { sharedSessionManager = manager diff --git a/PROJECTS/Aenebris/refer/proxy-haskell-research/waf-design.md b/PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/waf-design.md similarity index 100% rename from PROJECTS/Aenebris/refer/proxy-haskell-research/waf-design.md rename to PROJECTS/advanced/Aenebris/refer/proxy-haskell-research/waf-design.md diff --git a/PROJECTS/Aenebris/src/Aenebris/Backend.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Backend.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Backend.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Backend.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Config.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Config.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Config.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Config.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Connection.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Connection.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Connection.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Connection.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/HealthCheck.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/HealthCheck.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/HealthCheck.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/HealthCheck.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/LoadBalancer.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/LoadBalancer.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/LoadBalancer.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/LoadBalancer.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Middleware/Redirect.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Middleware/Redirect.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Middleware/Redirect.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Middleware/Redirect.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Middleware/Security.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Middleware/Security.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Middleware/Security.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Middleware/Security.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Proxy.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Proxy.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Proxy.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Proxy.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/TLS.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/TLS.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/TLS.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/TLS.hs diff --git a/PROJECTS/Aenebris/src/Aenebris/Tunnel.hs b/PROJECTS/advanced/Aenebris/src/Aenebris/Tunnel.hs similarity index 100% rename from PROJECTS/Aenebris/src/Aenebris/Tunnel.hs rename to PROJECTS/advanced/Aenebris/src/Aenebris/Tunnel.hs diff --git a/PROJECTS/Aenebris/stack.yaml b/PROJECTS/advanced/Aenebris/stack.yaml similarity index 100% rename from PROJECTS/Aenebris/stack.yaml rename to PROJECTS/advanced/Aenebris/stack.yaml diff --git a/PROJECTS/Aenebris/stack.yaml.lock b/PROJECTS/advanced/Aenebris/stack.yaml.lock similarity index 100% rename from PROJECTS/Aenebris/stack.yaml.lock rename to PROJECTS/advanced/Aenebris/stack.yaml.lock diff --git a/PROJECTS/api-rate-limiter/.style.yapf b/PROJECTS/advanced/api-rate-limiter/.style.yapf similarity index 100% rename from PROJECTS/api-rate-limiter/.style.yapf rename to PROJECTS/advanced/api-rate-limiter/.style.yapf diff --git a/PROJECTS/api-rate-limiter/README.md b/PROJECTS/advanced/api-rate-limiter/README.md similarity index 100% rename from PROJECTS/api-rate-limiter/README.md rename to PROJECTS/advanced/api-rate-limiter/README.md diff --git a/PROJECTS/api-rate-limiter/examples/app.py b/PROJECTS/advanced/api-rate-limiter/examples/app.py similarity index 100% rename from PROJECTS/api-rate-limiter/examples/app.py rename to PROJECTS/advanced/api-rate-limiter/examples/app.py diff --git a/PROJECTS/api-rate-limiter/examples/docker-compose.yml b/PROJECTS/advanced/api-rate-limiter/examples/docker-compose.yml similarity index 100% rename from PROJECTS/api-rate-limiter/examples/docker-compose.yml rename to PROJECTS/advanced/api-rate-limiter/examples/docker-compose.yml diff --git a/PROJECTS/api-rate-limiter/learn/algorithms.md b/PROJECTS/advanced/api-rate-limiter/learn/algorithms.md similarity index 100% rename from PROJECTS/api-rate-limiter/learn/algorithms.md rename to PROJECTS/advanced/api-rate-limiter/learn/algorithms.md diff --git a/PROJECTS/api-rate-limiter/learn/architecture.md b/PROJECTS/advanced/api-rate-limiter/learn/architecture.md similarity index 100% rename from PROJECTS/api-rate-limiter/learn/architecture.md rename to PROJECTS/advanced/api-rate-limiter/learn/architecture.md diff --git a/PROJECTS/api-rate-limiter/learn/security.md b/PROJECTS/advanced/api-rate-limiter/learn/security.md similarity index 100% rename from PROJECTS/api-rate-limiter/learn/security.md rename to PROJECTS/advanced/api-rate-limiter/learn/security.md diff --git a/PROJECTS/api-rate-limiter/pyproject.toml b/PROJECTS/advanced/api-rate-limiter/pyproject.toml similarity index 99% rename from PROJECTS/api-rate-limiter/pyproject.toml rename to PROJECTS/advanced/api-rate-limiter/pyproject.toml index ba8fe216..22dee00d 100644 --- a/PROJECTS/api-rate-limiter/pyproject.toml +++ b/PROJECTS/advanced/api-rate-limiter/pyproject.toml @@ -139,8 +139,8 @@ warn_required_dynamic_aliases = true py-version = "3.11" jobs = 4 load-plugins = [ - "pylint_pydantic", - "pylint_per_file_ignores", + "pylint_pydantic", + "pylint_per_file_ignores", ] persistent = true ignore = [ @@ -239,4 +239,3 @@ possibly-missing-import = "error" unused-ignore-comment = "warn" redundant-cast = "warn" undefined-reveal = "warn" - diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/__init__.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/__init__.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/__init__.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/__init__.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/__init__.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/__init__.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/base.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/base.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/base.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/base.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/fixed_window.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/fixed_window.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/fixed_window.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/fixed_window.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/sliding_window.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/sliding_window.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/sliding_window.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/sliding_window.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/token_bucket.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/token_bucket.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/algorithms/token_bucket.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/algorithms/token_bucket.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/config.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/config.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/config.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/config.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/defense/__init__.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/defense/__init__.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/__init__.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/defense/circuit_breaker.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/circuit_breaker.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/defense/circuit_breaker.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/circuit_breaker.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/defense/layers.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/layers.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/defense/layers.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/defense/layers.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/dependencies.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/dependencies.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/dependencies.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/dependencies.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/exceptions.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/exceptions.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/exceptions.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/exceptions.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/__init__.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/__init__.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/__init__.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/auth.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/auth.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/auth.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/auth.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/composite.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/composite.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/composite.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/composite.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/headers.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/headers.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/headers.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/headers.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/ip.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/ip.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/fingerprinting/ip.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/fingerprinting/ip.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/limiter.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/limiter.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/limiter.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/limiter.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/middleware.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/middleware.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/middleware.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/middleware.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/py.typed b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/py.typed similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/py.typed rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/py.typed diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/__init__.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/__init__.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/__init__.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/fixed_window.lua b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/fixed_window.lua similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/fixed_window.lua rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/fixed_window.lua diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/sliding_window.lua b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/sliding_window.lua similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/sliding_window.lua rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/sliding_window.lua diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/token_bucket.lua b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/token_bucket.lua similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/lua/token_bucket.lua rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/lua/token_bucket.lua diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/memory.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/memory.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/memory.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/memory.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/storage/redis_backend.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/redis_backend.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/storage/redis_backend.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/storage/redis_backend.py diff --git a/PROJECTS/api-rate-limiter/src/fastapi_420/types.py b/PROJECTS/advanced/api-rate-limiter/src/fastapi_420/types.py similarity index 100% rename from PROJECTS/api-rate-limiter/src/fastapi_420/types.py rename to PROJECTS/advanced/api-rate-limiter/src/fastapi_420/types.py diff --git a/PROJECTS/api-rate-limiter/tests/__init__.py b/PROJECTS/advanced/api-rate-limiter/tests/__init__.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/__init__.py rename to PROJECTS/advanced/api-rate-limiter/tests/__init__.py diff --git a/PROJECTS/api-rate-limiter/tests/conftest.py b/PROJECTS/advanced/api-rate-limiter/tests/conftest.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/conftest.py rename to PROJECTS/advanced/api-rate-limiter/tests/conftest.py diff --git a/PROJECTS/api-rate-limiter/tests/test_algorithms.py b/PROJECTS/advanced/api-rate-limiter/tests/test_algorithms.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_algorithms.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_algorithms.py diff --git a/PROJECTS/api-rate-limiter/tests/test_fingerprinting.py b/PROJECTS/advanced/api-rate-limiter/tests/test_fingerprinting.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_fingerprinting.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_fingerprinting.py diff --git a/PROJECTS/api-rate-limiter/tests/test_integration.py b/PROJECTS/advanced/api-rate-limiter/tests/test_integration.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_integration.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_integration.py diff --git a/PROJECTS/api-rate-limiter/tests/test_limiter.py b/PROJECTS/advanced/api-rate-limiter/tests/test_limiter.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_limiter.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_limiter.py diff --git a/PROJECTS/api-rate-limiter/tests/test_storage.py b/PROJECTS/advanced/api-rate-limiter/tests/test_storage.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_storage.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_storage.py diff --git a/PROJECTS/api-rate-limiter/tests/test_types.py b/PROJECTS/advanced/api-rate-limiter/tests/test_types.py similarity index 100% rename from PROJECTS/api-rate-limiter/tests/test_types.py rename to PROJECTS/advanced/api-rate-limiter/tests/test_types.py diff --git a/PROJECTS/api-rate-limiter/uv.lock b/PROJECTS/advanced/api-rate-limiter/uv.lock similarity index 100% rename from PROJECTS/api-rate-limiter/uv.lock rename to PROJECTS/advanced/api-rate-limiter/uv.lock diff --git a/PROJECTS/bug-bounty-platform/.env.example b/PROJECTS/advanced/bug-bounty-platform/.env.example similarity index 100% rename from PROJECTS/bug-bounty-platform/.env.example rename to PROJECTS/advanced/bug-bounty-platform/.env.example diff --git a/PROJECTS/bug-bounty-platform/.gitignore b/PROJECTS/advanced/bug-bounty-platform/.gitignore similarity index 99% rename from PROJECTS/bug-bounty-platform/.gitignore rename to PROJECTS/advanced/bug-bounty-platform/.gitignore index 0c265239..25f66331 100644 --- a/PROJECTS/bug-bounty-platform/.gitignore +++ b/PROJECTS/advanced/bug-bounty-platform/.gitignore @@ -36,4 +36,3 @@ htmlcov/ dmypy.json .DS_Store - diff --git a/PROJECTS/bug-bounty-platform/.pre-commit-config.yaml b/PROJECTS/advanced/bug-bounty-platform/.pre-commit-config.yaml similarity index 100% rename from PROJECTS/bug-bounty-platform/.pre-commit-config.yaml rename to PROJECTS/advanced/bug-bounty-platform/.pre-commit-config.yaml diff --git a/PROJECTS/bug-bounty-platform/LICENSE b/PROJECTS/advanced/bug-bounty-platform/LICENSE similarity index 100% rename from PROJECTS/bug-bounty-platform/LICENSE rename to PROJECTS/advanced/bug-bounty-platform/LICENSE diff --git a/PROJECTS/bug-bounty-platform/README.md b/PROJECTS/advanced/bug-bounty-platform/README.md similarity index 100% rename from PROJECTS/bug-bounty-platform/README.md rename to PROJECTS/advanced/bug-bounty-platform/README.md diff --git a/PROJECTS/bug-bounty-platform/backend/.dockerignore b/PROJECTS/advanced/bug-bounty-platform/backend/.dockerignore similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/.dockerignore rename to PROJECTS/advanced/bug-bounty-platform/backend/.dockerignore diff --git a/PROJECTS/bug-bounty-platform/backend/.style.yapf b/PROJECTS/advanced/bug-bounty-platform/backend/.style.yapf similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/.style.yapf rename to PROJECTS/advanced/bug-bounty-platform/backend/.style.yapf diff --git a/PROJECTS/bug-bounty-platform/backend/alembic.ini b/PROJECTS/advanced/bug-bounty-platform/backend/alembic.ini similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/alembic.ini rename to PROJECTS/advanced/bug-bounty-platform/backend/alembic.ini diff --git a/PROJECTS/bug-bounty-platform/backend/alembic/env.py b/PROJECTS/advanced/bug-bounty-platform/backend/alembic/env.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/alembic/env.py rename to PROJECTS/advanced/bug-bounty-platform/backend/alembic/env.py diff --git a/PROJECTS/bug-bounty-platform/backend/alembic/script.py.mako b/PROJECTS/advanced/bug-bounty-platform/backend/alembic/script.py.mako similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/alembic/script.py.mako rename to PROJECTS/advanced/bug-bounty-platform/backend/alembic/script.py.mako diff --git a/PROJECTS/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py b/PROJECTS/advanced/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py similarity index 99% rename from PROJECTS/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py rename to PROJECTS/advanced/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py index acf88147..fb08e640 100644 --- a/PROJECTS/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py +++ b/PROJECTS/advanced/bug-bounty-platform/backend/alembic/versions/20251224_033104_initial.py @@ -1,7 +1,7 @@ """initial Revision ID: 801b86be184b -Revises: +Revises: Create Date: 2025-12-24 03:31:04.712921 """ from typing import Sequence, Union diff --git a/PROJECTS/bug-bounty-platform/backend/alembic/versions/20260106_010122_add_bug_bounty_models.py b/PROJECTS/advanced/bug-bounty-platform/backend/alembic/versions/20260106_010122_add_bug_bounty_models.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/alembic/versions/20260106_010122_add_bug_bounty_models.py rename to PROJECTS/advanced/bug-bounty-platform/backend/alembic/versions/20260106_010122_add_bug_bounty_models.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/__main__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/__main__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/__main__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/__main__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/admin/service.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/admin/service.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/admin/service.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/admin/service.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/RefreshToken.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/RefreshToken.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/RefreshToken.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/RefreshToken.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/auth/service.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/auth/service.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/auth/service.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/auth/service.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/config.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/config.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/config.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/config.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/Base.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/Base.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/Base.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/Base.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/base_repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/base_repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/base_repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/base_repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/base_schema.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/base_schema.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/base_schema.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/base_schema.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/common_schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/common_schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/common_schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/common_schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/constants.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/constants.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/constants.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/constants.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/database.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/database.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/database.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/database.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/enums.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/enums.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/enums.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/enums.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/error_schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/error_schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/error_schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/error_schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/exceptions.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/exceptions.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/exceptions.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/exceptions.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/health_routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/health_routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/health_routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/health_routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/logging.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/logging.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/logging.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/logging.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/rate_limit.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/rate_limit.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/rate_limit.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/rate_limit.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/responses.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/responses.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/responses.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/responses.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/core/security.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/core/security.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/core/security.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/core/security.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/factory.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/factory.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/factory.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/factory.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/middleware/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/middleware/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/middleware/correlation.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/correlation.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/middleware/correlation.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/correlation.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/middleware/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/middleware/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/middleware/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/Asset.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/Asset.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/Asset.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/Asset.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/Program.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/Program.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/Program.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/Program.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/RewardTier.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/RewardTier.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/RewardTier.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/RewardTier.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/program/service.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/program/service.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/program/service.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/program/service.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/Attachment.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/Attachment.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/Attachment.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/Attachment.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/Comment.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/Comment.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/Comment.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/Comment.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/Report.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/Report.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/Report.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/Report.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/report/service.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/report/service.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/report/service.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/report/service.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/User.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/User.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/User.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/User.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/dependencies.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/dependencies.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/dependencies.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/dependencies.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/py.typed b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/py.typed similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/py.typed rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/py.typed diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/repository.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/repository.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/repository.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/repository.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/routes.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/routes.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/routes.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/routes.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/schemas.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/schemas.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/schemas.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/schemas.py diff --git a/PROJECTS/bug-bounty-platform/backend/app/user/service.py b/PROJECTS/advanced/bug-bounty-platform/backend/app/user/service.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/app/user/service.py rename to PROJECTS/advanced/bug-bounty-platform/backend/app/user/service.py diff --git a/PROJECTS/bug-bounty-platform/backend/conftest.py b/PROJECTS/advanced/bug-bounty-platform/backend/conftest.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/conftest.py rename to PROJECTS/advanced/bug-bounty-platform/backend/conftest.py diff --git a/PROJECTS/bug-bounty-platform/backend/pyproject.toml b/PROJECTS/advanced/bug-bounty-platform/backend/pyproject.toml similarity index 99% rename from PROJECTS/bug-bounty-platform/backend/pyproject.toml rename to PROJECTS/advanced/bug-bounty-platform/backend/pyproject.toml index eed0abf8..0e00047a 100644 --- a/PROJECTS/bug-bounty-platform/backend/pyproject.toml +++ b/PROJECTS/advanced/bug-bounty-platform/backend/pyproject.toml @@ -165,8 +165,8 @@ warn_required_dynamic_aliases = true py-version = "3.11" jobs = 4 load-plugins = [ - "pylint_pydantic", - "pylint_per_file_ignores", + "pylint_pydantic", + "pylint_per_file_ignores", ] persistent = true ignore = [ diff --git a/PROJECTS/bug-bounty-platform/backend/tests/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/integration/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/integration/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/integration/test_admin.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_admin.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/integration/test_admin.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_admin.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/integration/test_auth.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_auth.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/integration/test_auth.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_auth.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/integration/test_health.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_health.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/integration/test_health.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_health.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/integration/test_users.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_users.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/integration/test_users.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/integration/test_users.py diff --git a/PROJECTS/bug-bounty-platform/backend/tests/unit/__init__.py b/PROJECTS/advanced/bug-bounty-platform/backend/tests/unit/__init__.py similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/tests/unit/__init__.py rename to PROJECTS/advanced/bug-bounty-platform/backend/tests/unit/__init__.py diff --git a/PROJECTS/bug-bounty-platform/backend/uv.lock b/PROJECTS/advanced/bug-bounty-platform/backend/uv.lock similarity index 100% rename from PROJECTS/bug-bounty-platform/backend/uv.lock rename to PROJECTS/advanced/bug-bounty-platform/backend/uv.lock diff --git a/PROJECTS/bug-bounty-platform/compose.yml b/PROJECTS/advanced/bug-bounty-platform/compose.yml similarity index 100% rename from PROJECTS/bug-bounty-platform/compose.yml rename to PROJECTS/advanced/bug-bounty-platform/compose.yml diff --git a/PROJECTS/bug-bounty-platform/dev.compose.yml b/PROJECTS/advanced/bug-bounty-platform/dev.compose.yml similarity index 100% rename from PROJECTS/bug-bounty-platform/dev.compose.yml rename to PROJECTS/advanced/bug-bounty-platform/dev.compose.yml diff --git a/PROJECTS/bug-bounty-platform/frontend/.dockerignore b/PROJECTS/advanced/bug-bounty-platform/frontend/.dockerignore similarity index 100% rename from PROJECTS/bug-bounty-platform/frontend/.dockerignore rename to PROJECTS/advanced/bug-bounty-platform/frontend/.dockerignore diff --git a/PROJECTS/bug-bounty-platform/frontend/.gitignore b/PROJECTS/advanced/bug-bounty-platform/frontend/.gitignore similarity index 100% rename from PROJECTS/bug-bounty-platform/frontend/.gitignore rename to PROJECTS/advanced/bug-bounty-platform/frontend/.gitignore diff --git a/PROJECTS/bug-bounty-platform/frontend/.stylelintignore b/PROJECTS/advanced/bug-bounty-platform/frontend/.stylelintignore similarity index 100% rename from PROJECTS/bug-bounty-platform/frontend/.stylelintignore rename to PROJECTS/advanced/bug-bounty-platform/frontend/.stylelintignore diff --git a/PROJECTS/bug-bounty-platform/frontend/biome.json b/PROJECTS/advanced/bug-bounty-platform/frontend/biome.json similarity index 100% rename from PROJECTS/bug-bounty-platform/frontend/biome.json rename to PROJECTS/advanced/bug-bounty-platform/frontend/biome.json diff --git a/PROJECTS/bug-bounty-platform/frontend/index.html b/PROJECTS/advanced/bug-bounty-platform/frontend/index.html similarity index 98% rename from PROJECTS/bug-bounty-platform/frontend/index.html rename to PROJECTS/advanced/bug-bounty-platform/frontend/index.html index 65ee0f76..085b5d91 100644 --- a/PROJECTS/bug-bounty-platform/frontend/index.html +++ b/PROJECTS/advanced/bug-bounty-platform/frontend/index.html @@ -19,7 +19,7 @@ + /> None: status_code = status.HTTP_404_NOT_FOUND, detail = "Room not found", ) - - diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/api/websocket.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/api/websocket.py similarity index 98% rename from PROJECTS/encrypted-p2p-chat/backend/app/api/websocket.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/api/websocket.py index c68e17e1..2cd17444 100644 --- a/PROJECTS/encrypted-p2p-chat/backend/app/api/websocket.py +++ b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/api/websocket.py @@ -8,8 +8,8 @@ import logging from uuid import UUID from fastapi import ( - APIRouter, - WebSocket, + APIRouter, + WebSocket, WebSocketDisconnect, Query, ) diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/config.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/config.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/config.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/config.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/double_ratchet.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/double_ratchet.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/double_ratchet.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/double_ratchet.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/x3dh_manager.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/x3dh_manager.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/encryption/x3dh_manager.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/encryption/x3dh_manager.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/enums.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/enums.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/enums.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/enums.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/exception_handlers.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/exception_handlers.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/exception_handlers.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/exception_handlers.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/exceptions.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/exceptions.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/exceptions.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/exceptions.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/passkey/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/passkey/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/passkey/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/passkey/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/passkey/passkey_manager.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/passkey/passkey_manager.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/passkey/passkey_manager.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/passkey/passkey_manager.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/redis_manager.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/redis_manager.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/redis_manager.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/redis_manager.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/surreal_manager.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/surreal_manager.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/surreal_manager.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/surreal_manager.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/core/websocket_manager.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/websocket_manager.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/core/websocket_manager.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/core/websocket_manager.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/factory.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/factory.py similarity index 98% rename from PROJECTS/encrypted-p2p-chat/backend/app/factory.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/factory.py index 772b36b0..c557105a 100644 --- a/PROJECTS/encrypted-p2p-chat/backend/app/factory.py +++ b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/factory.py @@ -68,7 +68,7 @@ def create_app() -> FastAPI: title = settings.APP_NAME, description = APP_DESCRIPTION, version = APP_VERSION, - openapi_version = "3.1.0", + openapi_version = "3.1.0", docs_url = "/docs" if settings.is_development else None, redoc_url = "/redoc" if settings.is_development else None, default_response_class = ORJSONResponse, diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/main.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/main.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/main.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/main.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/Base.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/Base.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/Base.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/Base.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/Credential.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/Credential.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/Credential.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/Credential.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/IdentityKey.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/IdentityKey.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/IdentityKey.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/IdentityKey.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/OneTimePrekey.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/OneTimePrekey.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/OneTimePrekey.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/OneTimePrekey.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/RatchetState.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/RatchetState.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/RatchetState.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/RatchetState.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/SignedPrekey.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/SignedPrekey.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/SignedPrekey.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/SignedPrekey.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/SkippedMessageKey.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/SkippedMessageKey.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/SkippedMessageKey.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/SkippedMessageKey.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/User.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/User.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/User.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/User.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/models/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/models/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/models/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/auth.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/auth.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/auth.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/auth.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/common.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/common.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/common.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/common.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/rooms.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/rooms.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/rooms.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/rooms.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/surreal.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/surreal.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/surreal.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/surreal.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/schemas/websocket.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/websocket.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/schemas/websocket.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/schemas/websocket.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/auth_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/auth_service.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/auth_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/auth_service.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/message_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/message_service.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/message_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/message_service.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/prekey_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/prekey_service.py similarity index 99% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/prekey_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/prekey_service.py index 9501b603..52ba9040 100644 --- a/PROJECTS/encrypted-p2p-chat/backend/app/services/prekey_service.py +++ b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/prekey_service.py @@ -155,7 +155,7 @@ class PrekeyService: user_id: UUID ) -> IdentityKey: """ - Generates and stores initial identity key, + Generates and stores initial identity key, signed prekey, and one time prekeys for a user """ statement = select(User).where(User.id == user_id) diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/presence_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/presence_service.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/presence_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/presence_service.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/app/services/websocket_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/websocket_service.py similarity index 99% rename from PROJECTS/encrypted-p2p-chat/backend/app/services/websocket_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/websocket_service.py index 3e01b27c..5e1e554f 100644 --- a/PROJECTS/encrypted-p2p-chat/backend/app/services/websocket_service.py +++ b/PROJECTS/advanced/encrypted-p2p-chat/backend/app/services/websocket_service.py @@ -34,7 +34,7 @@ logger = logging.getLogger(__name__) class WebSocketService: """ - Service for processing WebSocket + Service for processing WebSocket messages and routing to appropriate handlers """ async def route_message( diff --git a/PROJECTS/encrypted-p2p-chat/backend/pyproject.toml b/PROJECTS/advanced/encrypted-p2p-chat/backend/pyproject.toml similarity index 94% rename from PROJECTS/encrypted-p2p-chat/backend/pyproject.toml rename to PROJECTS/advanced/encrypted-p2p-chat/backend/pyproject.toml index 047868fe..0a1a7704 100644 --- a/PROJECTS/encrypted-p2p-chat/backend/pyproject.toml +++ b/PROJECTS/advanced/encrypted-p2p-chat/backend/pyproject.toml @@ -173,30 +173,30 @@ disable_error_code = ["attr-defined", "type-arg"] py-version = "3.13" jobs = 4 load-plugins = [ - "pylint_mongoengine", - "pylint_pydantic", - "pylint_per_file_ignores", - "pylint_flask", + "pylint_mongoengine", + "pylint_pydantic", + "pylint_per_file_ignores", + "pylint_flask", "pylint_celery" ] persistent = true suggestion-mode = true ignore = [ - "venv", - ".venv", - "__pycache__", - "build", - "dist", + "venv", + ".venv", + "__pycache__", + "build", + "dist", ".git", - ".pytest_cache", - ".mypy_cache", - ".ruff_cache", + ".pytest_cache", + ".mypy_cache", + ".ruff_cache", ] ignore-paths = [ - "^venv/.*", - "^.venv/.*", - "^build/.*", - "^dist/.*", + "^venv/.*", + "^.venv/.*", + "^build/.*", + "^dist/.*", ] [tool.pylint.type-check] generated-members = [ diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/__init__.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/__init__.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/__init__.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/__init__.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/conftest.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/conftest.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/conftest.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/conftest.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/test_auth_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_auth_service.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/test_auth_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_auth_service.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/test_encryption.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_encryption.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/test_encryption.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_encryption.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/test_message_service.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_message_service.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/test_message_service.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_message_service.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/tests/test_x3dh.py b/PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_x3dh.py similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/tests/test_x3dh.py rename to PROJECTS/advanced/encrypted-p2p-chat/backend/tests/test_x3dh.py diff --git a/PROJECTS/encrypted-p2p-chat/backend/uv.lock b/PROJECTS/advanced/encrypted-p2p-chat/backend/uv.lock similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/uv.lock rename to PROJECTS/advanced/encrypted-p2p-chat/backend/uv.lock diff --git a/PROJECTS/encrypted-p2p-chat/compose.yml b/PROJECTS/advanced/encrypted-p2p-chat/compose.yml similarity index 100% rename from PROJECTS/encrypted-p2p-chat/compose.yml rename to PROJECTS/advanced/encrypted-p2p-chat/compose.yml diff --git a/PROJECTS/encrypted-p2p-chat/conf/docker/dev/fastapi.docker b/PROJECTS/advanced/encrypted-p2p-chat/conf/docker/dev/fastapi.docker similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/docker/dev/fastapi.docker rename to PROJECTS/advanced/encrypted-p2p-chat/conf/docker/dev/fastapi.docker diff --git a/PROJECTS/encrypted-p2p-chat/conf/docker/dev/vite.docker b/PROJECTS/advanced/encrypted-p2p-chat/conf/docker/dev/vite.docker similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/docker/dev/vite.docker rename to PROJECTS/advanced/encrypted-p2p-chat/conf/docker/dev/vite.docker diff --git a/PROJECTS/encrypted-p2p-chat/conf/docker/prod/fastapi.docker b/PROJECTS/advanced/encrypted-p2p-chat/conf/docker/prod/fastapi.docker similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/docker/prod/fastapi.docker rename to PROJECTS/advanced/encrypted-p2p-chat/conf/docker/prod/fastapi.docker diff --git a/PROJECTS/encrypted-p2p-chat/conf/docker/prod/vite.docker b/PROJECTS/advanced/encrypted-p2p-chat/conf/docker/prod/vite.docker similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/docker/prod/vite.docker rename to PROJECTS/advanced/encrypted-p2p-chat/conf/docker/prod/vite.docker diff --git a/PROJECTS/encrypted-p2p-chat/conf/nginx/dev.nginx b/PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/dev.nginx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/nginx/dev.nginx rename to PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/dev.nginx diff --git a/PROJECTS/encrypted-p2p-chat/conf/nginx/http.conf b/PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/http.conf similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/nginx/http.conf rename to PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/http.conf diff --git a/PROJECTS/encrypted-p2p-chat/conf/nginx/prod.nginx b/PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/prod.nginx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/conf/nginx/prod.nginx rename to PROJECTS/advanced/encrypted-p2p-chat/conf/nginx/prod.nginx diff --git a/PROJECTS/encrypted-p2p-chat/dev.compose.yml b/PROJECTS/advanced/encrypted-p2p-chat/dev.compose.yml similarity index 100% rename from PROJECTS/encrypted-p2p-chat/dev.compose.yml rename to PROJECTS/advanced/encrypted-p2p-chat/dev.compose.yml diff --git a/PROJECTS/encrypted-p2p-chat/frontend/.gitignore b/PROJECTS/advanced/encrypted-p2p-chat/frontend/.gitignore similarity index 98% rename from PROJECTS/encrypted-p2p-chat/frontend/.gitignore rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/.gitignore index c78808df..ca6d7e8b 100644 --- a/PROJECTS/encrypted-p2p-chat/frontend/.gitignore +++ b/PROJECTS/advanced/encrypted-p2p-chat/frontend/.gitignore @@ -5,4 +5,3 @@ dist-ssr .env .DS_Store .context - diff --git a/PROJECTS/api-security-scanner/frontend/.prettierignore b/PROJECTS/advanced/encrypted-p2p-chat/frontend/.prettierignore old mode 100755 new mode 100644 similarity index 100% rename from PROJECTS/api-security-scanner/frontend/.prettierignore rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/.prettierignore diff --git a/PROJECTS/encrypted-p2p-chat/frontend/.prettierrc b/PROJECTS/advanced/encrypted-p2p-chat/frontend/.prettierrc similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/.prettierrc rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/.prettierrc diff --git a/PROJECTS/encrypted-p2p-chat/frontend/README.md b/PROJECTS/advanced/encrypted-p2p-chat/frontend/README.md similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/README.md rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/README.md diff --git a/PROJECTS/encrypted-p2p-chat/frontend/eslint.config.js b/PROJECTS/advanced/encrypted-p2p-chat/frontend/eslint.config.js similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/eslint.config.js rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/eslint.config.js diff --git a/PROJECTS/encrypted-p2p-chat/frontend/index.html b/PROJECTS/advanced/encrypted-p2p-chat/frontend/index.html similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/index.html rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/index.html diff --git a/PROJECTS/encrypted-p2p-chat/frontend/package-lock.json b/PROJECTS/advanced/encrypted-p2p-chat/frontend/package-lock.json similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/package-lock.json rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/package-lock.json diff --git a/PROJECTS/encrypted-p2p-chat/frontend/package.json b/PROJECTS/advanced/encrypted-p2p-chat/frontend/package.json similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/package.json rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/package.json diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/App.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/App.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/App.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/App.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/AuthCard.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/AuthCard.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/AuthCard.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/AuthCard.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/AuthForm.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/AuthForm.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/AuthForm.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/AuthForm.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/PasskeyButton.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/PasskeyButton.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/PasskeyButton.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/PasskeyButton.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Auth/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Auth/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ChatHeader.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ChatHeader.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ChatHeader.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ChatHeader.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ChatInput.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ChatInput.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ChatInput.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ChatInput.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ConversationItem.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ConversationItem.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ConversationItem.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ConversationItem.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ConversationList.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ConversationList.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/ConversationList.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/ConversationList.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/EncryptionBadge.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/EncryptionBadge.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/EncryptionBadge.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/EncryptionBadge.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/MessageBubble.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/MessageBubble.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/MessageBubble.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/MessageBubble.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/MessageList.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/MessageList.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/MessageList.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/MessageList.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/NewConversation.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/NewConversation.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/NewConversation.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/NewConversation.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/OnlineStatus.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/OnlineStatus.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/OnlineStatus.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/OnlineStatus.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/TypingIndicator.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/TypingIndicator.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/TypingIndicator.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/TypingIndicator.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/UserSearch.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/UserSearch.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/UserSearch.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/UserSearch.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Chat/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Chat/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/AppShell.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/AppShell.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/AppShell.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/AppShell.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/Header.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/Header.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/Header.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/Header.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/ProtectedRoute.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/ProtectedRoute.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/ProtectedRoute.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/ProtectedRoute.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/Sidebar.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/Sidebar.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/Sidebar.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/Sidebar.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/Layout/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/Layout/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Avatar.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Avatar.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Avatar.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Avatar.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Badge.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Badge.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Badge.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Badge.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Button.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Button.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Button.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Button.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Dropdown.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Dropdown.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Dropdown.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Dropdown.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/IconButton.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/IconButton.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/IconButton.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/IconButton.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Input.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Input.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Input.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Input.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Modal.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Modal.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Modal.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Modal.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Skeleton.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Skeleton.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Skeleton.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Skeleton.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Spinner.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Spinner.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Spinner.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Spinner.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/TextArea.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/TextArea.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/TextArea.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/TextArea.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Toast.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Toast.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Toast.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Toast.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Tooltip.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Tooltip.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/Tooltip.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/Tooltip.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/components/UI/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/components/UI/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/config.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/config.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/config.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/config.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/crypto-service.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/crypto-service.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/crypto-service.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/crypto-service.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/double-ratchet.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/double-ratchet.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/double-ratchet.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/double-ratchet.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/key-store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/key-store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/key-store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/key-store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/message-store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/message-store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/message-store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/message-store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/primitives.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/primitives.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/primitives.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/primitives.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/crypto/x3dh.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/x3dh.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/crypto/x3dh.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/crypto/x3dh.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/index.css b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/index.css similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/index.css rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/index.css diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/index.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/index.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/index.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/index.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/pages/Chat.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Chat.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/pages/Chat.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Chat.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/pages/Home.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Home.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/pages/Home.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Home.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/pages/Login.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Login.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/pages/Login.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Login.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/pages/NotFound.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/NotFound.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/pages/NotFound.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/NotFound.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/pages/Register.tsx b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Register.tsx similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/pages/Register.tsx rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/pages/Register.tsx diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/services/auth.service.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/auth.service.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/services/auth.service.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/auth.service.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/services/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/services/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/services/room.service.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/room.service.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/services/room.service.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/services/room.service.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/auth.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/auth.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/auth.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/auth.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/messages.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/messages.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/messages.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/messages.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/presence.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/presence.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/presence.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/presence.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/rooms.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/rooms.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/rooms.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/rooms.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/session.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/session.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/session.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/session.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/settings.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/settings.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/settings.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/settings.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/typing.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/typing.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/typing.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/typing.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/stores/ui.store.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/ui.store.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/stores/ui.store.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/stores/ui.store.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/api.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/api.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/api.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/api.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/auth.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/auth.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/auth.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/auth.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/chat.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/chat.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/chat.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/chat.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/components.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/components.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/components.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/components.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/encryption.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/encryption.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/encryption.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/encryption.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/guards.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/guards.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/guards.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/guards.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/types/websocket.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/websocket.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/types/websocket.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/types/websocket.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/vite-env.d.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/vite-env.d.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/vite-env.d.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/vite-env.d.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/websocket/index.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/index.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/websocket/index.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/index.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/websocket/message-handlers.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/message-handlers.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/websocket/message-handlers.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/message-handlers.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/src/websocket/websocket-manager.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/websocket-manager.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/src/websocket/websocket-manager.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/src/websocket/websocket-manager.ts diff --git a/PROJECTS/encrypted-p2p-chat/frontend/tsconfig.json b/PROJECTS/advanced/encrypted-p2p-chat/frontend/tsconfig.json similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/tsconfig.json rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/tsconfig.json diff --git a/PROJECTS/encrypted-p2p-chat/frontend/vite.config.ts b/PROJECTS/advanced/encrypted-p2p-chat/frontend/vite.config.ts similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/vite.config.ts rename to PROJECTS/advanced/encrypted-p2p-chat/frontend/vite.config.ts diff --git a/PROJECTS/encrypted-p2p-chat/justfile b/PROJECTS/advanced/encrypted-p2p-chat/justfile similarity index 100% rename from PROJECTS/encrypted-p2p-chat/justfile rename to PROJECTS/advanced/encrypted-p2p-chat/justfile diff --git a/PROJECTS/caesar-cipher/.gitignore b/PROJECTS/beginner/caesar-cipher/.gitignore similarity index 100% rename from PROJECTS/caesar-cipher/.gitignore rename to PROJECTS/beginner/caesar-cipher/.gitignore diff --git a/PROJECTS/encrypted-p2p-chat/backend/.style.yapf b/PROJECTS/beginner/caesar-cipher/.style.yapf old mode 100755 new mode 100644 similarity index 100% rename from PROJECTS/encrypted-p2p-chat/backend/.style.yapf rename to PROJECTS/beginner/caesar-cipher/.style.yapf diff --git a/PROJECTS/caesar-cipher/Justfile b/PROJECTS/beginner/caesar-cipher/Justfile similarity index 100% rename from PROJECTS/caesar-cipher/Justfile rename to PROJECTS/beginner/caesar-cipher/Justfile diff --git a/PROJECTS/caesar-cipher/pyproject.toml b/PROJECTS/beginner/caesar-cipher/pyproject.toml similarity index 100% rename from PROJECTS/caesar-cipher/pyproject.toml rename to PROJECTS/beginner/caesar-cipher/pyproject.toml diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/__init__.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/__init__.py similarity index 99% rename from PROJECTS/caesar-cipher/src/caesar_cipher/__init__.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/__init__.py index b560c6b2..a042a8bd 100644 --- a/PROJECTS/caesar-cipher/src/caesar_cipher/__init__.py +++ b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/__init__.py @@ -28,5 +28,3 @@ from caesar_cipher.analyzer import FrequencyAnalyzer __version__ = "0.1.0" __all__ = ["CaesarCipher", "FrequencyAnalyzer"] - - diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/analyzer.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/analyzer.py similarity index 100% rename from PROJECTS/caesar-cipher/src/caesar_cipher/analyzer.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/analyzer.py diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/cipher.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/cipher.py similarity index 100% rename from PROJECTS/caesar-cipher/src/caesar_cipher/cipher.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/cipher.py diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/constants.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/constants.py similarity index 100% rename from PROJECTS/caesar-cipher/src/caesar_cipher/constants.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/constants.py diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/main.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/main.py similarity index 100% rename from PROJECTS/caesar-cipher/src/caesar_cipher/main.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/main.py diff --git a/PROJECTS/caesar-cipher/src/caesar_cipher/utils.py b/PROJECTS/beginner/caesar-cipher/src/caesar_cipher/utils.py similarity index 100% rename from PROJECTS/caesar-cipher/src/caesar_cipher/utils.py rename to PROJECTS/beginner/caesar-cipher/src/caesar_cipher/utils.py diff --git a/PROJECTS/caesar-cipher/tests/__init__.py b/PROJECTS/beginner/caesar-cipher/tests/__init__.py similarity index 100% rename from PROJECTS/caesar-cipher/tests/__init__.py rename to PROJECTS/beginner/caesar-cipher/tests/__init__.py diff --git a/PROJECTS/caesar-cipher/tests/test_analyzer.py b/PROJECTS/beginner/caesar-cipher/tests/test_analyzer.py similarity index 100% rename from PROJECTS/caesar-cipher/tests/test_analyzer.py rename to PROJECTS/beginner/caesar-cipher/tests/test_analyzer.py diff --git a/PROJECTS/caesar-cipher/tests/test_cipher.py b/PROJECTS/beginner/caesar-cipher/tests/test_cipher.py similarity index 100% rename from PROJECTS/caesar-cipher/tests/test_cipher.py rename to PROJECTS/beginner/caesar-cipher/tests/test_cipher.py diff --git a/PROJECTS/caesar-cipher/tests/test_cli.py b/PROJECTS/beginner/caesar-cipher/tests/test_cli.py similarity index 100% rename from PROJECTS/caesar-cipher/tests/test_cli.py rename to PROJECTS/beginner/caesar-cipher/tests/test_cli.py diff --git a/PROJECTS/caesar-cipher/uv.lock b/PROJECTS/beginner/caesar-cipher/uv.lock similarity index 100% rename from PROJECTS/caesar-cipher/uv.lock rename to PROJECTS/beginner/caesar-cipher/uv.lock diff --git a/PROJECTS/api-security-scanner/backend/.style.yapf b/PROJECTS/beginner/dns-lookup/.style.yapf similarity index 100% rename from PROJECTS/api-security-scanner/backend/.style.yapf rename to PROJECTS/beginner/dns-lookup/.style.yapf diff --git a/PROJECTS/dns-lookup/README.md b/PROJECTS/beginner/dns-lookup/README.md similarity index 100% rename from PROJECTS/dns-lookup/README.md rename to PROJECTS/beginner/dns-lookup/README.md diff --git a/PROJECTS/dns-lookup/dnslookup/__init__.py b/PROJECTS/beginner/dns-lookup/dnslookup/__init__.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/__init__.py rename to PROJECTS/beginner/dns-lookup/dnslookup/__init__.py diff --git a/PROJECTS/dns-lookup/dnslookup/__main__.py b/PROJECTS/beginner/dns-lookup/dnslookup/__main__.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/__main__.py rename to PROJECTS/beginner/dns-lookup/dnslookup/__main__.py diff --git a/PROJECTS/dns-lookup/dnslookup/cli.py b/PROJECTS/beginner/dns-lookup/dnslookup/cli.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/cli.py rename to PROJECTS/beginner/dns-lookup/dnslookup/cli.py diff --git a/PROJECTS/dns-lookup/dnslookup/output.py b/PROJECTS/beginner/dns-lookup/dnslookup/output.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/output.py rename to PROJECTS/beginner/dns-lookup/dnslookup/output.py diff --git a/PROJECTS/dns-lookup/dnslookup/resolver.py b/PROJECTS/beginner/dns-lookup/dnslookup/resolver.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/resolver.py rename to PROJECTS/beginner/dns-lookup/dnslookup/resolver.py diff --git a/PROJECTS/dns-lookup/dnslookup/whois_lookup.py b/PROJECTS/beginner/dns-lookup/dnslookup/whois_lookup.py similarity index 100% rename from PROJECTS/dns-lookup/dnslookup/whois_lookup.py rename to PROJECTS/beginner/dns-lookup/dnslookup/whois_lookup.py diff --git a/PROJECTS/dns-lookup/justfile b/PROJECTS/beginner/dns-lookup/justfile similarity index 100% rename from PROJECTS/dns-lookup/justfile rename to PROJECTS/beginner/dns-lookup/justfile diff --git a/PROJECTS/dns-lookup/pyproject.toml b/PROJECTS/beginner/dns-lookup/pyproject.toml similarity index 100% rename from PROJECTS/dns-lookup/pyproject.toml rename to PROJECTS/beginner/dns-lookup/pyproject.toml diff --git a/PROJECTS/dns-lookup/tests/__init__.py b/PROJECTS/beginner/dns-lookup/tests/__init__.py similarity index 100% rename from PROJECTS/dns-lookup/tests/__init__.py rename to PROJECTS/beginner/dns-lookup/tests/__init__.py diff --git a/PROJECTS/dns-lookup/tests/test_resolver.py b/PROJECTS/beginner/dns-lookup/tests/test_resolver.py similarity index 100% rename from PROJECTS/dns-lookup/tests/test_resolver.py rename to PROJECTS/beginner/dns-lookup/tests/test_resolver.py diff --git a/PROJECTS/dns-lookup/uv.lock b/PROJECTS/beginner/dns-lookup/uv.lock similarity index 100% rename from PROJECTS/dns-lookup/uv.lock rename to PROJECTS/beginner/dns-lookup/uv.lock diff --git a/PROJECTS/dns-lookup/.style.yapf b/PROJECTS/beginner/keylogger/.style.yapf similarity index 100% rename from PROJECTS/dns-lookup/.style.yapf rename to PROJECTS/beginner/keylogger/.style.yapf diff --git a/PROJECTS/keylogger/README.md b/PROJECTS/beginner/keylogger/README.md similarity index 100% rename from PROJECTS/keylogger/README.md rename to PROJECTS/beginner/keylogger/README.md diff --git a/PROJECTS/keylogger/justfile b/PROJECTS/beginner/keylogger/justfile similarity index 100% rename from PROJECTS/keylogger/justfile rename to PROJECTS/beginner/keylogger/justfile diff --git a/PROJECTS/keylogger/keylogger.py b/PROJECTS/beginner/keylogger/keylogger.py similarity index 100% rename from PROJECTS/keylogger/keylogger.py rename to PROJECTS/beginner/keylogger/keylogger.py diff --git a/PROJECTS/keylogger/pyproject.toml b/PROJECTS/beginner/keylogger/pyproject.toml similarity index 100% rename from PROJECTS/keylogger/pyproject.toml rename to PROJECTS/beginner/keylogger/pyproject.toml diff --git a/PROJECTS/keylogger/test_keylogger.py b/PROJECTS/beginner/keylogger/test_keylogger.py similarity index 100% rename from PROJECTS/keylogger/test_keylogger.py rename to PROJECTS/beginner/keylogger/test_keylogger.py diff --git a/PROJECTS/metadata-scrubber-tool/.github/workflows/publish.yml b/PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/publish.yml similarity index 93% rename from PROJECTS/metadata-scrubber-tool/.github/workflows/publish.yml rename to PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/publish.yml index 3359f907..e2a63dd6 100644 --- a/PROJECTS/metadata-scrubber-tool/.github/workflows/publish.yml +++ b/PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/publish.yml @@ -35,4 +35,4 @@ jobs: - name: Publish to PyPI # We use the official PyPA action for OIDC security - uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/PROJECTS/metadata-scrubber-tool/.github/workflows/test.yml b/PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/test.yml similarity index 94% rename from PROJECTS/metadata-scrubber-tool/.github/workflows/test.yml rename to PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/test.yml index f882d808..f56da150 100644 --- a/PROJECTS/metadata-scrubber-tool/.github/workflows/test.yml +++ b/PROJECTS/beginner/metadata-scrubber-tool/.github/workflows/test.yml @@ -26,4 +26,4 @@ jobs: run: uv sync --all-extras --dev - name: Run Tests - run: uv run pytest -x \ No newline at end of file + run: uv run pytest -x diff --git a/PROJECTS/metadata-scrubber-tool/.gitignore b/PROJECTS/beginner/metadata-scrubber-tool/.gitignore similarity index 99% rename from PROJECTS/metadata-scrubber-tool/.gitignore rename to PROJECTS/beginner/metadata-scrubber-tool/.gitignore index bcf0f9a4..b4905814 100644 --- a/PROJECTS/metadata-scrubber-tool/.gitignore +++ b/PROJECTS/beginner/metadata-scrubber-tool/.gitignore @@ -47,5 +47,3 @@ Thumbs.db # ============== Project Specific ============== # Output directory for processed images tests/assets/output/ - - diff --git a/PROJECTS/metadata-scrubber-tool/.python-version b/PROJECTS/beginner/metadata-scrubber-tool/.python-version similarity index 100% rename from PROJECTS/metadata-scrubber-tool/.python-version rename to PROJECTS/beginner/metadata-scrubber-tool/.python-version diff --git a/PROJECTS/metadata-scrubber-tool/.style.yapf b/PROJECTS/beginner/metadata-scrubber-tool/.style.yapf similarity index 100% rename from PROJECTS/metadata-scrubber-tool/.style.yapf rename to PROJECTS/beginner/metadata-scrubber-tool/.style.yapf diff --git a/PROJECTS/metadata-scrubber-tool/.yapfignore b/PROJECTS/beginner/metadata-scrubber-tool/.yapfignore similarity index 66% rename from PROJECTS/metadata-scrubber-tool/.yapfignore rename to PROJECTS/beginner/metadata-scrubber-tool/.yapfignore index b39b8d26..7ebb51bd 100644 --- a/PROJECTS/metadata-scrubber-tool/.yapfignore +++ b/PROJECTS/beginner/metadata-scrubber-tool/.yapfignore @@ -1,4 +1,4 @@ .venv/ venv/ env/ -typings/ \ No newline at end of file +typings/ diff --git a/PROJECTS/metadata-scrubber-tool/LICENSE b/PROJECTS/beginner/metadata-scrubber-tool/LICENSE similarity index 100% rename from PROJECTS/metadata-scrubber-tool/LICENSE rename to PROJECTS/beginner/metadata-scrubber-tool/LICENSE diff --git a/PROJECTS/metadata-scrubber-tool/README.md b/PROJECTS/beginner/metadata-scrubber-tool/README.md similarity index 99% rename from PROJECTS/metadata-scrubber-tool/README.md rename to PROJECTS/beginner/metadata-scrubber-tool/README.md index 2c4b74b4..9ea011b7 100644 --- a/PROJECTS/metadata-scrubber-tool/README.md +++ b/PROJECTS/beginner/metadata-scrubber-tool/README.md @@ -144,7 +144,7 @@ mst verify original.jpg ./out/processed_original.jpg ``` Comparing: test_canon.jpg → processed_test_canon.jpg - Verification Report + Verification Report ┏━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ ┃ Property ┃ Before ┃ After ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ diff --git a/PROJECTS/metadata-scrubber-tool/docker-compose.yml b/PROJECTS/beginner/metadata-scrubber-tool/docker-compose.yml similarity index 100% rename from PROJECTS/metadata-scrubber-tool/docker-compose.yml rename to PROJECTS/beginner/metadata-scrubber-tool/docker-compose.yml diff --git a/PROJECTS/metadata-scrubber-tool/docs/best-practices.md b/PROJECTS/beginner/metadata-scrubber-tool/docs/best-practices.md similarity index 100% rename from PROJECTS/metadata-scrubber-tool/docs/best-practices.md rename to PROJECTS/beginner/metadata-scrubber-tool/docs/best-practices.md diff --git a/PROJECTS/metadata-scrubber-tool/docs/metadata-risks.md b/PROJECTS/beginner/metadata-scrubber-tool/docs/metadata-risks.md similarity index 100% rename from PROJECTS/metadata-scrubber-tool/docs/metadata-risks.md rename to PROJECTS/beginner/metadata-scrubber-tool/docs/metadata-risks.md diff --git a/PROJECTS/metadata-scrubber-tool/pyproject.toml b/PROJECTS/beginner/metadata-scrubber-tool/pyproject.toml similarity index 99% rename from PROJECTS/metadata-scrubber-tool/pyproject.toml rename to PROJECTS/beginner/metadata-scrubber-tool/pyproject.toml index 0451e2ed..b56876e8 100644 --- a/PROJECTS/metadata-scrubber-tool/pyproject.toml +++ b/PROJECTS/beginner/metadata-scrubber-tool/pyproject.toml @@ -99,4 +99,3 @@ dev = [ "ruff>=0.14.11", "yapf>=0.43.0", ] - diff --git a/PROJECTS/metadata-scrubber-tool/pyrightconfig.json b/PROJECTS/beginner/metadata-scrubber-tool/pyrightconfig.json similarity index 79% rename from PROJECTS/metadata-scrubber-tool/pyrightconfig.json rename to PROJECTS/beginner/metadata-scrubber-tool/pyrightconfig.json index 848796cb..78b5e23e 100644 --- a/PROJECTS/metadata-scrubber-tool/pyrightconfig.json +++ b/PROJECTS/beginner/metadata-scrubber-tool/pyrightconfig.json @@ -4,5 +4,5 @@ "venvPath": ".", "venv": ".venv", "pythonVersion": "3.12", - "typeCheckingMode": "standard", + "typeCheckingMode": "standard" } diff --git a/PROJECTS/metadata-scrubber-tool/requirements.txt b/PROJECTS/beginner/metadata-scrubber-tool/requirements.txt similarity index 99% rename from PROJECTS/metadata-scrubber-tool/requirements.txt rename to PROJECTS/beginner/metadata-scrubber-tool/requirements.txt index 23f28d13208a86700aebc2783762dcc5cb77a850..b1ba4082cf6123665ea47eabc173aa7023aa0ea8 100644 GIT binary patch delta 9 Qcmcb?ev^H}4Q56z02J2)RsaA1 delta 7 Ocmcb~euI6(4Q2oiHv>xm diff --git a/PROJECTS/metadata-scrubber-tool/scripts/generate_png_tests.py b/PROJECTS/beginner/metadata-scrubber-tool/scripts/generate_png_tests.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/scripts/generate_png_tests.py rename to PROJECTS/beginner/metadata-scrubber-tool/scripts/generate_png_tests.py diff --git a/PROJECTS/metadata-scrubber-tool/src/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/src/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/src/commands/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/src/commands/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/commands/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/commands/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/src/commands/read.py b/PROJECTS/beginner/metadata-scrubber-tool/src/commands/read.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/commands/read.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/commands/read.py diff --git a/PROJECTS/metadata-scrubber-tool/src/commands/scrub.py b/PROJECTS/beginner/metadata-scrubber-tool/src/commands/scrub.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/commands/scrub.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/commands/scrub.py diff --git a/PROJECTS/metadata-scrubber-tool/src/commands/verify.py b/PROJECTS/beginner/metadata-scrubber-tool/src/commands/verify.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/commands/verify.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/commands/verify.py diff --git a/PROJECTS/metadata-scrubber-tool/src/core/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/src/core/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/core/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/core/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/src/core/jpeg_metadata.py b/PROJECTS/beginner/metadata-scrubber-tool/src/core/jpeg_metadata.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/core/jpeg_metadata.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/core/jpeg_metadata.py diff --git a/PROJECTS/metadata-scrubber-tool/src/core/png_metadata.py b/PROJECTS/beginner/metadata-scrubber-tool/src/core/png_metadata.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/core/png_metadata.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/core/png_metadata.py diff --git a/PROJECTS/metadata-scrubber-tool/src/main.py b/PROJECTS/beginner/metadata-scrubber-tool/src/main.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/main.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/main.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/batch_processor.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/batch_processor.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/batch_processor.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/batch_processor.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/excel_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/excel_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/excel_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/excel_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/image_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/image_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/image_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/image_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/metadata_factory.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/metadata_factory.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/metadata_factory.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/metadata_factory.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/metadata_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/metadata_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/metadata_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/metadata_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/pdf_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/pdf_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/pdf_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/pdf_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/powerpoint_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/powerpoint_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/powerpoint_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/powerpoint_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/report_generator.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/report_generator.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/report_generator.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/report_generator.py diff --git a/PROJECTS/metadata-scrubber-tool/src/services/worddoc_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/src/services/worddoc_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/services/worddoc_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/services/worddoc_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/display.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/display.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/display.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/display.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/exceptions.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/exceptions.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/exceptions.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/exceptions.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/formatter.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/formatter.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/formatter.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/formatter.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/get_target_files.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/get_target_files.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/get_target_files.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/get_target_files.py diff --git a/PROJECTS/metadata-scrubber-tool/src/utils/logger.py b/PROJECTS/beginner/metadata-scrubber-tool/src/utils/logger.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/src/utils/logger.py rename to PROJECTS/beginner/metadata-scrubber-tool/src/utils/logger.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_docx/file-sample_1MB.docx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_docx/file-sample_1MB.docx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_docx/file-sample_1MB.docx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_docx/file-sample_1MB.docx diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_docx/file-sample_500kB.docx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_docx/file-sample_500kB.docx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_docx/file-sample_500kB.docx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_docx/file-sample_500kB.docx diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_03.png b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_03.png similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_03.png rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_03.png diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_04.png b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_04.png similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_04.png rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_04.png diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_05.png b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_05.png similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_images/generated_test_05.png rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/generated_test_05.png diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_images/test_canon.jpg b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/test_canon.jpg similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_images/test_canon.jpg rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/test_canon.jpg diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_images/test_fuji.jpg b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/test_fuji.jpg similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_images/test_fuji.jpg rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_images/test_fuji.jpg diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_pdfs/file-example_PDF_1MB.pdf b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pdfs/file-example_PDF_1MB.pdf similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_pdfs/file-example_PDF_1MB.pdf rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pdfs/file-example_PDF_1MB.pdf diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_pdfs/sample.pdf b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pdfs/sample.pdf similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_pdfs/sample.pdf rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pdfs/sample.pdf diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_pptx/Extlst-test.pptx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pptx/Extlst-test.pptx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_pptx/Extlst-test.pptx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pptx/Extlst-test.pptx diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_pptx/sample3.pptx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pptx/sample3.pptx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_pptx/sample3.pptx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_pptx/sample3.pptx diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_1000.xlsx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_1000.xlsx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_1000.xlsx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_1000.xlsx diff --git a/PROJECTS/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_5000.xlsx b/PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_5000.xlsx similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_5000.xlsx rename to PROJECTS/beginner/metadata-scrubber-tool/tests/assets/test_xlsx/file_example_XLSX_5000.xlsx diff --git a/PROJECTS/metadata-scrubber-tool/tests/conftest.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/conftest.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/conftest.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/conftest.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/e2e/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/e2e/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/e2e/test_main.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_main.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/e2e/test_main.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_main.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/e2e/test_read_command.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_read_command.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/e2e/test_read_command.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_read_command.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/e2e/test_scrub_command.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_scrub_command.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/e2e/test_scrub_command.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_scrub_command.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/e2e/test_verify_command.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_verify_command.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/e2e/test_verify_command.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/e2e/test_verify_command.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/integration/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/integration/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/integration/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/integration/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/integration/test_metadata_factory.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/integration/test_metadata_factory.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/integration/test_metadata_factory.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/integration/test_metadata_factory.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/__init__.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/__init__.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/__init__.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/__init__.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/test_excel_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_excel_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/test_excel_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_excel_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/test_image_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_image_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/test_image_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_image_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/test_pdf_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_pdf_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/test_pdf_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_pdf_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/test_powerpoint_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_powerpoint_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/test_powerpoint_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_powerpoint_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/tests/unit/test_worddoc_handler.py b/PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_worddoc_handler.py similarity index 100% rename from PROJECTS/metadata-scrubber-tool/tests/unit/test_worddoc_handler.py rename to PROJECTS/beginner/metadata-scrubber-tool/tests/unit/test_worddoc_handler.py diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/__init__.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/__init__.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/__init__.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/__init__.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_common.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_common.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_common.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_common.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_dump.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_dump.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_dump.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_dump.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_exceptions.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_exceptions.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_exceptions.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_exceptions.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_exif.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_exif.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_exif.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_exif.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_insert.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_insert.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_insert.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_insert.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_load.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_load.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_load.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_load.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_remove.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_remove.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_remove.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_remove.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_transplant.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_transplant.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_transplant.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_transplant.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/_webp.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_webp.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/_webp.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/_webp.pyi diff --git a/PROJECTS/metadata-scrubber-tool/typings/piexif/helper.pyi b/PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/helper.pyi similarity index 100% rename from PROJECTS/metadata-scrubber-tool/typings/piexif/helper.pyi rename to PROJECTS/beginner/metadata-scrubber-tool/typings/piexif/helper.pyi diff --git a/PROJECTS/metadata-scrubber-tool/uv.lock b/PROJECTS/beginner/metadata-scrubber-tool/uv.lock similarity index 100% rename from PROJECTS/metadata-scrubber-tool/uv.lock rename to PROJECTS/beginner/metadata-scrubber-tool/uv.lock diff --git a/PROJECTS/simple-port-scanner/CMakeLists.txt b/PROJECTS/beginner/simple-port-scanner/CMakeLists.txt similarity index 100% rename from PROJECTS/simple-port-scanner/CMakeLists.txt rename to PROJECTS/beginner/simple-port-scanner/CMakeLists.txt diff --git a/PROJECTS/simple-port-scanner/README.md b/PROJECTS/beginner/simple-port-scanner/README.md similarity index 99% rename from PROJECTS/simple-port-scanner/README.md rename to PROJECTS/beginner/simple-port-scanner/README.md index bbfdbe84..988eb15b 100644 --- a/PROJECTS/simple-port-scanner/README.md +++ b/PROJECTS/beginner/simple-port-scanner/README.md @@ -31,4 +31,3 @@ make ```bash ./port_scanner -i 127.0.0.1 -p 1-1024 -t 100 -e 2 - diff --git a/PROJECTS/simple-port-scanner/main.cpp b/PROJECTS/beginner/simple-port-scanner/main.cpp similarity index 100% rename from PROJECTS/simple-port-scanner/main.cpp rename to PROJECTS/beginner/simple-port-scanner/main.cpp diff --git a/PROJECTS/simple-port-scanner/src/PortScanner.cpp b/PROJECTS/beginner/simple-port-scanner/src/PortScanner.cpp similarity index 99% rename from PROJECTS/simple-port-scanner/src/PortScanner.cpp rename to PROJECTS/beginner/simple-port-scanner/src/PortScanner.cpp index cc34e927..b7c8f429 100644 --- a/PROJECTS/simple-port-scanner/src/PortScanner.cpp +++ b/PROJECTS/beginner/simple-port-scanner/src/PortScanner.cpp @@ -190,4 +190,4 @@ void PortScanner::scan() { })); -} \ No newline at end of file +} diff --git a/PROJECTS/simple-port-scanner/src/PortScanner.hpp b/PROJECTS/beginner/simple-port-scanner/src/PortScanner.hpp similarity index 100% rename from PROJECTS/simple-port-scanner/src/PortScanner.hpp rename to PROJECTS/beginner/simple-port-scanner/src/PortScanner.hpp diff --git a/PROJECTS/simple-vulnerability-scanner/.gitignore b/PROJECTS/beginner/simple-vulnerability-scanner/.gitignore similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/.gitignore rename to PROJECTS/beginner/simple-vulnerability-scanner/.gitignore diff --git a/PROJECTS/simple-vulnerability-scanner/.golangci.yml b/PROJECTS/beginner/simple-vulnerability-scanner/.golangci.yml similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/.golangci.yml rename to PROJECTS/beginner/simple-vulnerability-scanner/.golangci.yml diff --git a/PROJECTS/simple-vulnerability-scanner/Justfile b/PROJECTS/beginner/simple-vulnerability-scanner/Justfile similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/Justfile rename to PROJECTS/beginner/simple-vulnerability-scanner/Justfile diff --git a/PROJECTS/simple-vulnerability-scanner/README.md b/PROJECTS/beginner/simple-vulnerability-scanner/README.md similarity index 96% rename from PROJECTS/simple-vulnerability-scanner/README.md rename to PROJECTS/beginner/simple-vulnerability-scanner/README.md index 4835cef4..3fa66113 100644 --- a/PROJECTS/simple-vulnerability-scanner/README.md +++ b/PROJECTS/beginner/simple-vulnerability-scanner/README.md @@ -2,17 +2,17 @@ ```ruby - █ ▀██ - ███ ▄▄ ▄▄▄ ▄▄▄ ▄ ▄▄▄▄ ██ ▄▄▄▄ - █ ██ ██ ██ ██ ██ ▄█▄▄▄██ ██ ▀▀ ▄██ - ▄▀▀▀▀█▄ ██ ██ █▀▀ ██ ██ ▄█▀ ██ -▄█▄ ▄██▄ ▄██▄ ██▄ ▀████▄ ▀█▄▄▄▀ ▄██▄ ▀█▄▄▀█▀ - ▄█▄▄▄▄▀ + █ ▀██ + ███ ▄▄ ▄▄▄ ▄▄▄ ▄ ▄▄▄▄ ██ ▄▄▄▄ + █ ██ ██ ██ ██ ██ ▄█▄▄▄██ ██ ▀▀ ▄██ + ▄▀▀▀▀█▄ ██ ██ █▀▀ ██ ██ ▄█▀ ██ +▄█▄ ▄██▄ ▄██▄ ██▄ ▀████▄ ▀█▄▄▄▀ ▄██▄ ▀█▄▄▀█▀ + ▄█▄▄▄▄▀ ``` ### *[Go Docs](https://pkg.go.dev/github.com/CarterPerez-dev/angela)* [![Go Version](https://img.shields.io/badge/Go-1.24+-00ADD8?style=flat&logo=go)](https://go.dev) -[![License: AGPLv3](https://img.shields.io/badge/License-AGPL_v3-purple.svg)](https://www.gnu.org/licenses/agpl-3.0) +[![License: AGPLv3](https://img.shields.io/badge/License-AGPL_v3-purple.svg)](https://www.gnu.org/licenses/agpl-3.0) [![Go Report Card](https://goreportcard.com/badge/github.com/CarterPerez-dev/angela)](https://goreportcard.com/report/github.com/CarterPerez-dev/angela) [![PyPI Compatible](https://img.shields.io/badge/PyPI-compatible-3775A9?style=flat&logo=pypi&logoColor=white)](https://pypi.org) [![OSV.dev](https://img.shields.io/badge/OSV.dev-integrated-4285F4?style=flat)](https://osv.dev) diff --git a/PROJECTS/simple-vulnerability-scanner/cmd/angela/main.go b/PROJECTS/beginner/simple-vulnerability-scanner/cmd/angela/main.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/cmd/angela/main.go rename to PROJECTS/beginner/simple-vulnerability-scanner/cmd/angela/main.go diff --git a/PROJECTS/simple-vulnerability-scanner/go.mod b/PROJECTS/beginner/simple-vulnerability-scanner/go.mod similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/go.mod rename to PROJECTS/beginner/simple-vulnerability-scanner/go.mod diff --git a/PROJECTS/simple-vulnerability-scanner/go.sum b/PROJECTS/beginner/simple-vulnerability-scanner/go.sum similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/go.sum rename to PROJECTS/beginner/simple-vulnerability-scanner/go.sum diff --git a/PROJECTS/simple-vulnerability-scanner/internal/cli/output.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/cli/output.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/cli/output.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/cli/output.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/cli/update.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/cli/update.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/cli/update.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/cli/update.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/config/config.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/config/config.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/config/config.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/config/config.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/osv/client.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/osv/client.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/osv/client.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/osv/client.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/osv/client_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/osv/client_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/osv/client_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/osv/client_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/cache.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/cache.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/cache.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/cache.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/cache_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/cache_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/cache_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/cache_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/client.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/client.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/client.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/client.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/client_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/client_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/client_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/client_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/version.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/version.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/version.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/version.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pypi/version_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/version_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pypi/version_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pypi/version_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pyproject/parser.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/parser.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pyproject/parser.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/parser.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pyproject/parser_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/parser_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pyproject/parser_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/parser_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pyproject/writer.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/writer.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pyproject/writer.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/writer.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/pyproject/writer_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/writer_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/pyproject/writer_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/pyproject/writer_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/requirements/parser.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/parser.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/requirements/parser.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/parser.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/requirements/parser_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/parser_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/requirements/parser_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/parser_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/requirements/writer.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/writer.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/requirements/writer.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/writer.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/requirements/writer_test.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/writer_test.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/requirements/writer_test.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/requirements/writer_test.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/ui/banner.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/banner.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/ui/banner.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/banner.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/ui/color.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/color.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/ui/color.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/color.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/ui/spinner.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/spinner.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/ui/spinner.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/spinner.go diff --git a/PROJECTS/simple-vulnerability-scanner/internal/ui/symbol.go b/PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/symbol.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/internal/ui/symbol.go rename to PROJECTS/beginner/simple-vulnerability-scanner/internal/ui/symbol.go diff --git a/PROJECTS/simple-vulnerability-scanner/learn/GO-CONCURRENCY-PATTERNS.md b/PROJECTS/beginner/simple-vulnerability-scanner/learn/GO-CONCURRENCY-PATTERNS.md similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/learn/GO-CONCURRENCY-PATTERNS.md rename to PROJECTS/beginner/simple-vulnerability-scanner/learn/GO-CONCURRENCY-PATTERNS.md diff --git a/PROJECTS/simple-vulnerability-scanner/learn/PEP440-VERSION-PARSING.md b/PROJECTS/beginner/simple-vulnerability-scanner/learn/PEP440-VERSION-PARSING.md similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/learn/PEP440-VERSION-PARSING.md rename to PROJECTS/beginner/simple-vulnerability-scanner/learn/PEP440-VERSION-PARSING.md diff --git a/PROJECTS/simple-vulnerability-scanner/learn/TOML-COMMENT-PRESERVATION.md b/PROJECTS/beginner/simple-vulnerability-scanner/learn/TOML-COMMENT-PRESERVATION.md similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/learn/TOML-COMMENT-PRESERVATION.md rename to PROJECTS/beginner/simple-vulnerability-scanner/learn/TOML-COMMENT-PRESERVATION.md diff --git a/PROJECTS/simple-vulnerability-scanner/pkg/types/types.go b/PROJECTS/beginner/simple-vulnerability-scanner/pkg/types/types.go similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/pkg/types/types.go rename to PROJECTS/beginner/simple-vulnerability-scanner/pkg/types/types.go diff --git a/PROJECTS/simple-vulnerability-scanner/testdata/pyproject.toml b/PROJECTS/beginner/simple-vulnerability-scanner/testdata/pyproject.toml similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/testdata/pyproject.toml rename to PROJECTS/beginner/simple-vulnerability-scanner/testdata/pyproject.toml diff --git a/PROJECTS/simple-vulnerability-scanner/testdata/requirements.txt b/PROJECTS/beginner/simple-vulnerability-scanner/testdata/requirements.txt similarity index 100% rename from PROJECTS/simple-vulnerability-scanner/testdata/requirements.txt rename to PROJECTS/beginner/simple-vulnerability-scanner/testdata/requirements.txt diff --git a/PROJECTS/api-security-scanner/.env.example b/PROJECTS/intermediate/api-security-scanner/.env.example similarity index 100% rename from PROJECTS/api-security-scanner/.env.example rename to PROJECTS/intermediate/api-security-scanner/.env.example diff --git a/PROJECTS/api-security-scanner/.gitignore b/PROJECTS/intermediate/api-security-scanner/.gitignore similarity index 100% rename from PROJECTS/api-security-scanner/.gitignore rename to PROJECTS/intermediate/api-security-scanner/.gitignore diff --git a/PROJECTS/api-security-scanner/.pre-commit-config.yaml b/PROJECTS/intermediate/api-security-scanner/.pre-commit-config.yaml similarity index 100% rename from PROJECTS/api-security-scanner/.pre-commit-config.yaml rename to PROJECTS/intermediate/api-security-scanner/.pre-commit-config.yaml diff --git a/PROJECTS/keylogger/.style.yapf b/PROJECTS/intermediate/api-security-scanner/backend/.style.yapf similarity index 100% rename from PROJECTS/keylogger/.style.yapf rename to PROJECTS/intermediate/api-security-scanner/backend/.style.yapf diff --git a/PROJECTS/api-security-scanner/backend/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/backend.just b/PROJECTS/intermediate/api-security-scanner/backend/backend.just similarity index 100% rename from PROJECTS/api-security-scanner/backend/backend.just rename to PROJECTS/intermediate/api-security-scanner/backend/backend.just diff --git a/PROJECTS/api-security-scanner/backend/config.py b/PROJECTS/intermediate/api-security-scanner/backend/config.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/config.py rename to PROJECTS/intermediate/api-security-scanner/backend/config.py diff --git a/PROJECTS/api-security-scanner/backend/core/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/core/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/core/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/core/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/core/database.py b/PROJECTS/intermediate/api-security-scanner/backend/core/database.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/core/database.py rename to PROJECTS/intermediate/api-security-scanner/backend/core/database.py diff --git a/PROJECTS/api-security-scanner/backend/core/dependencies.py b/PROJECTS/intermediate/api-security-scanner/backend/core/dependencies.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/core/dependencies.py rename to PROJECTS/intermediate/api-security-scanner/backend/core/dependencies.py diff --git a/PROJECTS/api-security-scanner/backend/core/enums.py b/PROJECTS/intermediate/api-security-scanner/backend/core/enums.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/core/enums.py rename to PROJECTS/intermediate/api-security-scanner/backend/core/enums.py diff --git a/PROJECTS/api-security-scanner/backend/core/security.py b/PROJECTS/intermediate/api-security-scanner/backend/core/security.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/core/security.py rename to PROJECTS/intermediate/api-security-scanner/backend/core/security.py diff --git a/PROJECTS/api-security-scanner/backend/factory.py b/PROJECTS/intermediate/api-security-scanner/backend/factory.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/factory.py rename to PROJECTS/intermediate/api-security-scanner/backend/factory.py diff --git a/PROJECTS/api-security-scanner/backend/main.py b/PROJECTS/intermediate/api-security-scanner/backend/main.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/main.py rename to PROJECTS/intermediate/api-security-scanner/backend/main.py diff --git a/PROJECTS/api-security-scanner/backend/models/Base.py b/PROJECTS/intermediate/api-security-scanner/backend/models/Base.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/models/Base.py rename to PROJECTS/intermediate/api-security-scanner/backend/models/Base.py diff --git a/PROJECTS/api-security-scanner/backend/models/Scan.py b/PROJECTS/intermediate/api-security-scanner/backend/models/Scan.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/models/Scan.py rename to PROJECTS/intermediate/api-security-scanner/backend/models/Scan.py diff --git a/PROJECTS/api-security-scanner/backend/models/TestResult.py b/PROJECTS/intermediate/api-security-scanner/backend/models/TestResult.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/models/TestResult.py rename to PROJECTS/intermediate/api-security-scanner/backend/models/TestResult.py diff --git a/PROJECTS/api-security-scanner/backend/models/User.py b/PROJECTS/intermediate/api-security-scanner/backend/models/User.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/models/User.py rename to PROJECTS/intermediate/api-security-scanner/backend/models/User.py diff --git a/PROJECTS/api-security-scanner/backend/models/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/models/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/models/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/models/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/pyproject.toml b/PROJECTS/intermediate/api-security-scanner/backend/pyproject.toml similarity index 100% rename from PROJECTS/api-security-scanner/backend/pyproject.toml rename to PROJECTS/intermediate/api-security-scanner/backend/pyproject.toml diff --git a/PROJECTS/api-security-scanner/backend/repositories/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/repositories/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/repositories/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/repositories/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/repositories/scan_repository.py b/PROJECTS/intermediate/api-security-scanner/backend/repositories/scan_repository.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/repositories/scan_repository.py rename to PROJECTS/intermediate/api-security-scanner/backend/repositories/scan_repository.py diff --git a/PROJECTS/api-security-scanner/backend/repositories/test_result_repository.py b/PROJECTS/intermediate/api-security-scanner/backend/repositories/test_result_repository.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/repositories/test_result_repository.py rename to PROJECTS/intermediate/api-security-scanner/backend/repositories/test_result_repository.py diff --git a/PROJECTS/api-security-scanner/backend/repositories/user_repository.py b/PROJECTS/intermediate/api-security-scanner/backend/repositories/user_repository.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/repositories/user_repository.py rename to PROJECTS/intermediate/api-security-scanner/backend/repositories/user_repository.py diff --git a/PROJECTS/api-security-scanner/backend/routes/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/routes/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/routes/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/routes/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/routes/auth.py b/PROJECTS/intermediate/api-security-scanner/backend/routes/auth.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/routes/auth.py rename to PROJECTS/intermediate/api-security-scanner/backend/routes/auth.py diff --git a/PROJECTS/api-security-scanner/backend/routes/scans.py b/PROJECTS/intermediate/api-security-scanner/backend/routes/scans.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/routes/scans.py rename to PROJECTS/intermediate/api-security-scanner/backend/routes/scans.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/auth_scanner.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/auth_scanner.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/auth_scanner.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/auth_scanner.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/base_scanner.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/base_scanner.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/base_scanner.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/base_scanner.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/idor_scanner.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/idor_scanner.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/idor_scanner.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/idor_scanner.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/payloads.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/payloads.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/payloads.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/payloads.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/rate_limit_scanner.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/rate_limit_scanner.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/rate_limit_scanner.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/rate_limit_scanner.py diff --git a/PROJECTS/api-security-scanner/backend/scanners/sqli_scanner.py b/PROJECTS/intermediate/api-security-scanner/backend/scanners/sqli_scanner.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/scanners/sqli_scanner.py rename to PROJECTS/intermediate/api-security-scanner/backend/scanners/sqli_scanner.py diff --git a/PROJECTS/api-security-scanner/backend/schemas/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/schemas/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/schemas/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/schemas/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/schemas/scan_schemas.py b/PROJECTS/intermediate/api-security-scanner/backend/schemas/scan_schemas.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/schemas/scan_schemas.py rename to PROJECTS/intermediate/api-security-scanner/backend/schemas/scan_schemas.py diff --git a/PROJECTS/api-security-scanner/backend/schemas/test_result_schemas.py b/PROJECTS/intermediate/api-security-scanner/backend/schemas/test_result_schemas.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/schemas/test_result_schemas.py rename to PROJECTS/intermediate/api-security-scanner/backend/schemas/test_result_schemas.py diff --git a/PROJECTS/api-security-scanner/backend/schemas/user_schemas.py b/PROJECTS/intermediate/api-security-scanner/backend/schemas/user_schemas.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/schemas/user_schemas.py rename to PROJECTS/intermediate/api-security-scanner/backend/schemas/user_schemas.py diff --git a/PROJECTS/api-security-scanner/backend/services/__init__.py b/PROJECTS/intermediate/api-security-scanner/backend/services/__init__.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/services/__init__.py rename to PROJECTS/intermediate/api-security-scanner/backend/services/__init__.py diff --git a/PROJECTS/api-security-scanner/backend/services/auth_service.py b/PROJECTS/intermediate/api-security-scanner/backend/services/auth_service.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/services/auth_service.py rename to PROJECTS/intermediate/api-security-scanner/backend/services/auth_service.py diff --git a/PROJECTS/api-security-scanner/backend/services/scan_service.py b/PROJECTS/intermediate/api-security-scanner/backend/services/scan_service.py similarity index 100% rename from PROJECTS/api-security-scanner/backend/services/scan_service.py rename to PROJECTS/intermediate/api-security-scanner/backend/services/scan_service.py diff --git a/PROJECTS/api-security-scanner/compose.yml b/PROJECTS/intermediate/api-security-scanner/compose.yml similarity index 100% rename from PROJECTS/api-security-scanner/compose.yml rename to PROJECTS/intermediate/api-security-scanner/compose.yml diff --git a/PROJECTS/api-security-scanner/conf/docker/dev/fastapi.docker b/PROJECTS/intermediate/api-security-scanner/conf/docker/dev/fastapi.docker similarity index 100% rename from PROJECTS/api-security-scanner/conf/docker/dev/fastapi.docker rename to PROJECTS/intermediate/api-security-scanner/conf/docker/dev/fastapi.docker diff --git a/PROJECTS/api-security-scanner/conf/docker/dev/vite.docker b/PROJECTS/intermediate/api-security-scanner/conf/docker/dev/vite.docker similarity index 100% rename from PROJECTS/api-security-scanner/conf/docker/dev/vite.docker rename to PROJECTS/intermediate/api-security-scanner/conf/docker/dev/vite.docker diff --git a/PROJECTS/api-security-scanner/conf/docker/prod/fastapi.docker b/PROJECTS/intermediate/api-security-scanner/conf/docker/prod/fastapi.docker similarity index 100% rename from PROJECTS/api-security-scanner/conf/docker/prod/fastapi.docker rename to PROJECTS/intermediate/api-security-scanner/conf/docker/prod/fastapi.docker diff --git a/PROJECTS/api-security-scanner/conf/docker/prod/vite.docker b/PROJECTS/intermediate/api-security-scanner/conf/docker/prod/vite.docker similarity index 100% rename from PROJECTS/api-security-scanner/conf/docker/prod/vite.docker rename to PROJECTS/intermediate/api-security-scanner/conf/docker/prod/vite.docker diff --git a/PROJECTS/api-security-scanner/conf/nginx/dev.nginx b/PROJECTS/intermediate/api-security-scanner/conf/nginx/dev.nginx similarity index 100% rename from PROJECTS/api-security-scanner/conf/nginx/dev.nginx rename to PROJECTS/intermediate/api-security-scanner/conf/nginx/dev.nginx diff --git a/PROJECTS/api-security-scanner/conf/nginx/http.conf b/PROJECTS/intermediate/api-security-scanner/conf/nginx/http.conf similarity index 100% rename from PROJECTS/api-security-scanner/conf/nginx/http.conf rename to PROJECTS/intermediate/api-security-scanner/conf/nginx/http.conf diff --git a/PROJECTS/api-security-scanner/conf/nginx/prod.nginx b/PROJECTS/intermediate/api-security-scanner/conf/nginx/prod.nginx similarity index 100% rename from PROJECTS/api-security-scanner/conf/nginx/prod.nginx rename to PROJECTS/intermediate/api-security-scanner/conf/nginx/prod.nginx diff --git a/PROJECTS/api-security-scanner/dev.compose.yml b/PROJECTS/intermediate/api-security-scanner/dev.compose.yml similarity index 100% rename from PROJECTS/api-security-scanner/dev.compose.yml rename to PROJECTS/intermediate/api-security-scanner/dev.compose.yml diff --git a/PROJECTS/api-security-scanner/frontend/.gitignore b/PROJECTS/intermediate/api-security-scanner/frontend/.gitignore similarity index 100% rename from PROJECTS/api-security-scanner/frontend/.gitignore rename to PROJECTS/intermediate/api-security-scanner/frontend/.gitignore diff --git a/PROJECTS/encrypted-p2p-chat/frontend/.prettierignore b/PROJECTS/intermediate/api-security-scanner/frontend/.prettierignore old mode 100644 new mode 100755 similarity index 100% rename from PROJECTS/encrypted-p2p-chat/frontend/.prettierignore rename to PROJECTS/intermediate/api-security-scanner/frontend/.prettierignore diff --git a/PROJECTS/api-security-scanner/frontend/.prettierrc.json b/PROJECTS/intermediate/api-security-scanner/frontend/.prettierrc.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/.prettierrc.json rename to PROJECTS/intermediate/api-security-scanner/frontend/.prettierrc.json diff --git a/PROJECTS/api-security-scanner/frontend/.stylelintrc.json b/PROJECTS/intermediate/api-security-scanner/frontend/.stylelintrc.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/.stylelintrc.json rename to PROJECTS/intermediate/api-security-scanner/frontend/.stylelintrc.json diff --git a/PROJECTS/api-security-scanner/frontend/eslint.config.js b/PROJECTS/intermediate/api-security-scanner/frontend/eslint.config.js similarity index 100% rename from PROJECTS/api-security-scanner/frontend/eslint.config.js rename to PROJECTS/intermediate/api-security-scanner/frontend/eslint.config.js diff --git a/PROJECTS/api-security-scanner/frontend/index.html b/PROJECTS/intermediate/api-security-scanner/frontend/index.html similarity index 100% rename from PROJECTS/api-security-scanner/frontend/index.html rename to PROJECTS/intermediate/api-security-scanner/frontend/index.html diff --git a/PROJECTS/api-security-scanner/frontend/package-lock.json b/PROJECTS/intermediate/api-security-scanner/frontend/package-lock.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/package-lock.json rename to PROJECTS/intermediate/api-security-scanner/frontend/package-lock.json diff --git a/PROJECTS/api-security-scanner/frontend/package.json b/PROJECTS/intermediate/api-security-scanner/frontend/package.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/package.json rename to PROJECTS/intermediate/api-security-scanner/frontend/package.json diff --git a/PROJECTS/api-security-scanner/frontend/public/android-chrome-192x192.png b/PROJECTS/intermediate/api-security-scanner/frontend/public/android-chrome-192x192.png similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/android-chrome-192x192.png rename to PROJECTS/intermediate/api-security-scanner/frontend/public/android-chrome-192x192.png diff --git a/PROJECTS/api-security-scanner/frontend/public/android-chrome-512x512.png b/PROJECTS/intermediate/api-security-scanner/frontend/public/android-chrome-512x512.png similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/android-chrome-512x512.png rename to PROJECTS/intermediate/api-security-scanner/frontend/public/android-chrome-512x512.png diff --git a/PROJECTS/api-security-scanner/frontend/public/apple-touch-icon.png b/PROJECTS/intermediate/api-security-scanner/frontend/public/apple-touch-icon.png similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/apple-touch-icon.png rename to PROJECTS/intermediate/api-security-scanner/frontend/public/apple-touch-icon.png diff --git a/PROJECTS/api-security-scanner/frontend/public/favicon-16x16.png b/PROJECTS/intermediate/api-security-scanner/frontend/public/favicon-16x16.png similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/favicon-16x16.png rename to PROJECTS/intermediate/api-security-scanner/frontend/public/favicon-16x16.png diff --git a/PROJECTS/api-security-scanner/frontend/public/favicon-32x32.png b/PROJECTS/intermediate/api-security-scanner/frontend/public/favicon-32x32.png similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/favicon-32x32.png rename to PROJECTS/intermediate/api-security-scanner/frontend/public/favicon-32x32.png diff --git a/PROJECTS/api-security-scanner/frontend/public/favicon.ico b/PROJECTS/intermediate/api-security-scanner/frontend/public/favicon.ico similarity index 100% rename from PROJECTS/api-security-scanner/frontend/public/favicon.ico rename to PROJECTS/intermediate/api-security-scanner/frontend/public/favicon.ico diff --git a/PROJECTS/bug-bounty-platform/frontend/public/assets/site.webmanifest b/PROJECTS/intermediate/api-security-scanner/frontend/public/site.webmanifest similarity index 96% rename from PROJECTS/bug-bounty-platform/frontend/public/assets/site.webmanifest rename to PROJECTS/intermediate/api-security-scanner/frontend/public/site.webmanifest index 45dc8a20..1dd91123 100644 --- a/PROJECTS/bug-bounty-platform/frontend/public/assets/site.webmanifest +++ b/PROJECTS/intermediate/api-security-scanner/frontend/public/site.webmanifest @@ -1 +1 @@ -{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} diff --git a/PROJECTS/api-security-scanner/frontend/src/App.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/App.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/App.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/App.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/auth/AuthForm.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/AuthForm.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/auth/AuthForm.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/AuthForm.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/auth/LoginForm.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/LoginForm.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/auth/LoginForm.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/LoginForm.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/auth/RegisterForm.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/RegisterForm.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/auth/RegisterForm.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/auth/RegisterForm.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/Button.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Button.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/Button.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Button.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/Button.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Button.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/Button.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Button.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/Input.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Input.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/Input.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Input.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/Input.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Input.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/Input.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/Input.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/LoadingOverlay.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/LoadingOverlay.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/LoadingOverlay.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/LoadingOverlay.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/LoadingOverlay.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/LoadingOverlay.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/LoadingOverlay.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/LoadingOverlay.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/common/ProtectedRoute.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/ProtectedRoute.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/common/ProtectedRoute.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/common/ProtectedRoute.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/NewScanForm.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/NewScanForm.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/NewScanForm.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/NewScanForm.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/ScanForm.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScanForm.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/ScanForm.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScanForm.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/ScansList.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScansList.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/ScansList.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScansList.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/ScansList.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScansList.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/ScansList.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/ScansList.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/TestResultCard.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/TestResultCard.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/TestResultCard.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/TestResultCard.css diff --git a/PROJECTS/api-security-scanner/frontend/src/components/scan/TestResultCard.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/TestResultCard.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/components/scan/TestResultCard.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/components/scan/TestResultCard.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/config/constants.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/config/constants.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/config/constants.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/config/constants.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/hooks/useAuth.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/hooks/useAuth.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/hooks/useAuth.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/hooks/useAuth.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/hooks/useScan.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/hooks/useScan.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/hooks/useScan.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/hooks/useScan.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/lib/api.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/lib/api.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/lib/api.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/lib/api.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/lib/errors.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/lib/errors.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/lib/errors.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/lib/errors.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/lib/queryClient.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/lib/queryClient.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/lib/queryClient.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/lib/queryClient.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/lib/utils.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/lib/utils.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/lib/utils.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/lib/utils.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/lib/validation.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/lib/validation.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/lib/validation.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/lib/validation.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/main.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/main.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/main.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/main.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/AuthPage.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/AuthPage.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/AuthPage.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/AuthPage.css diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/DashboardPage.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/DashboardPage.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/DashboardPage.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/DashboardPage.css diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/DashboardPage.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/DashboardPage.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/DashboardPage.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/DashboardPage.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/LoginPage.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/LoginPage.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/LoginPage.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/LoginPage.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/RegisterPage.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/RegisterPage.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/RegisterPage.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/RegisterPage.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/ScanResultsPage.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/ScanResultsPage.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/ScanResultsPage.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/ScanResultsPage.css diff --git a/PROJECTS/api-security-scanner/frontend/src/pages/ScanResultsPage.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/pages/ScanResultsPage.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/pages/ScanResultsPage.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/pages/ScanResultsPage.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/router.tsx b/PROJECTS/intermediate/api-security-scanner/frontend/src/router.tsx similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/router.tsx rename to PROJECTS/intermediate/api-security-scanner/frontend/src/router.tsx diff --git a/PROJECTS/api-security-scanner/frontend/src/services/authService.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/services/authService.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/services/authService.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/services/authService.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/services/scanService.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/services/scanService.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/services/scanService.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/services/scanService.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/store/authStore.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/store/authStore.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/store/authStore.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/store/authStore.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/store/uiStore.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/store/uiStore.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/store/uiStore.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/store/uiStore.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/styles/index.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/styles/index.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/styles/index.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/styles/index.css diff --git a/PROJECTS/api-security-scanner/frontend/src/styles/variables.css b/PROJECTS/intermediate/api-security-scanner/frontend/src/styles/variables.css similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/styles/variables.css rename to PROJECTS/intermediate/api-security-scanner/frontend/src/styles/variables.css diff --git a/PROJECTS/api-security-scanner/frontend/src/types/auth.types.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/types/auth.types.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/types/auth.types.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/types/auth.types.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/types/guards.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/types/guards.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/types/guards.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/types/guards.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/types/scan.types.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/types/scan.types.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/types/scan.types.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/types/scan.types.ts diff --git a/PROJECTS/api-security-scanner/frontend/src/vite-env.d.ts b/PROJECTS/intermediate/api-security-scanner/frontend/src/vite-env.d.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/src/vite-env.d.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/src/vite-env.d.ts diff --git a/PROJECTS/api-security-scanner/frontend/tsconfig.app.json b/PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.app.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/tsconfig.app.json rename to PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.app.json diff --git a/PROJECTS/bug-bounty-platform/frontend/tsconfig.json b/PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.json similarity index 100% rename from PROJECTS/bug-bounty-platform/frontend/tsconfig.json rename to PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.json diff --git a/PROJECTS/api-security-scanner/frontend/tsconfig.node.json b/PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.node.json similarity index 100% rename from PROJECTS/api-security-scanner/frontend/tsconfig.node.json rename to PROJECTS/intermediate/api-security-scanner/frontend/tsconfig.node.json diff --git a/PROJECTS/api-security-scanner/frontend/vite.config.ts b/PROJECTS/intermediate/api-security-scanner/frontend/vite.config.ts similarity index 100% rename from PROJECTS/api-security-scanner/frontend/vite.config.ts rename to PROJECTS/intermediate/api-security-scanner/frontend/vite.config.ts diff --git a/PROJECTS/api-security-scanner/justfile b/PROJECTS/intermediate/api-security-scanner/justfile similarity index 100% rename from PROJECTS/api-security-scanner/justfile rename to PROJECTS/intermediate/api-security-scanner/justfile diff --git a/PROJECTS/api-security-scanner/learn/architecture.md b/PROJECTS/intermediate/api-security-scanner/learn/architecture.md similarity index 100% rename from PROJECTS/api-security-scanner/learn/architecture.md rename to PROJECTS/intermediate/api-security-scanner/learn/architecture.md diff --git a/PROJECTS/api-security-scanner/learn/scanning.md b/PROJECTS/intermediate/api-security-scanner/learn/scanning.md similarity index 100% rename from PROJECTS/api-security-scanner/learn/scanning.md rename to PROJECTS/intermediate/api-security-scanner/learn/scanning.md diff --git a/PROJECTS/api-security-scanner/learn/vulnerabilities.md b/PROJECTS/intermediate/api-security-scanner/learn/vulnerabilities.md similarity index 100% rename from PROJECTS/api-security-scanner/learn/vulnerabilities.md rename to PROJECTS/intermediate/api-security-scanner/learn/vulnerabilities.md diff --git a/PROJECTS/api-security-scanner/package.json b/PROJECTS/intermediate/api-security-scanner/package.json similarity index 100% rename from PROJECTS/api-security-scanner/package.json rename to PROJECTS/intermediate/api-security-scanner/package.json diff --git a/PROJECTS/docker-security-audit/.gitignore b/PROJECTS/intermediate/docker-security-audit/.gitignore similarity index 100% rename from PROJECTS/docker-security-audit/.gitignore rename to PROJECTS/intermediate/docker-security-audit/.gitignore diff --git a/PROJECTS/docker-security-audit/.golangci.yml b/PROJECTS/intermediate/docker-security-audit/.golangci.yml similarity index 100% rename from PROJECTS/docker-security-audit/.golangci.yml rename to PROJECTS/intermediate/docker-security-audit/.golangci.yml diff --git a/PROJECTS/docker-security-audit/Dockerfile b/PROJECTS/intermediate/docker-security-audit/Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/Dockerfile rename to PROJECTS/intermediate/docker-security-audit/Dockerfile diff --git a/PROJECTS/docker-security-audit/LICENSE b/PROJECTS/intermediate/docker-security-audit/LICENSE similarity index 100% rename from PROJECTS/docker-security-audit/LICENSE rename to PROJECTS/intermediate/docker-security-audit/LICENSE diff --git a/PROJECTS/docker-security-audit/Makefile b/PROJECTS/intermediate/docker-security-audit/Makefile similarity index 100% rename from PROJECTS/docker-security-audit/Makefile rename to PROJECTS/intermediate/docker-security-audit/Makefile diff --git a/PROJECTS/docker-security-audit/README.md b/PROJECTS/intermediate/docker-security-audit/README.md similarity index 100% rename from PROJECTS/docker-security-audit/README.md rename to PROJECTS/intermediate/docker-security-audit/README.md diff --git a/PROJECTS/docker-security-audit/cmd/docksec/main.go b/PROJECTS/intermediate/docker-security-audit/cmd/docksec/main.go similarity index 100% rename from PROJECTS/docker-security-audit/cmd/docksec/main.go rename to PROJECTS/intermediate/docker-security-audit/cmd/docksec/main.go diff --git a/PROJECTS/docker-security-audit/go.mod b/PROJECTS/intermediate/docker-security-audit/go.mod similarity index 100% rename from PROJECTS/docker-security-audit/go.mod rename to PROJECTS/intermediate/docker-security-audit/go.mod diff --git a/PROJECTS/docker-security-audit/go.sum b/PROJECTS/intermediate/docker-security-audit/go.sum similarity index 100% rename from PROJECTS/docker-security-audit/go.sum rename to PROJECTS/intermediate/docker-security-audit/go.sum diff --git a/PROJECTS/docker-security-audit/internal/analyzer/analyzer.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/analyzer.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/analyzer.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/analyzer.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/compose.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/compose.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/compose.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/compose.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/container.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/container.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/container.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/container.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/container_test.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/container_test.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/container_test.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/container_test.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/daemon.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/daemon.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/daemon.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/daemon.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/dockerfile.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/dockerfile.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/dockerfile.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/dockerfile.go diff --git a/PROJECTS/docker-security-audit/internal/analyzer/image.go b/PROJECTS/intermediate/docker-security-audit/internal/analyzer/image.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/analyzer/image.go rename to PROJECTS/intermediate/docker-security-audit/internal/analyzer/image.go diff --git a/PROJECTS/docker-security-audit/internal/benchmark/controls.go b/PROJECTS/intermediate/docker-security-audit/internal/benchmark/controls.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/benchmark/controls.go rename to PROJECTS/intermediate/docker-security-audit/internal/benchmark/controls.go diff --git a/PROJECTS/docker-security-audit/internal/config/config.go b/PROJECTS/intermediate/docker-security-audit/internal/config/config.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/config/config.go rename to PROJECTS/intermediate/docker-security-audit/internal/config/config.go diff --git a/PROJECTS/docker-security-audit/internal/config/constants.go b/PROJECTS/intermediate/docker-security-audit/internal/config/constants.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/config/constants.go rename to PROJECTS/intermediate/docker-security-audit/internal/config/constants.go diff --git a/PROJECTS/docker-security-audit/internal/docker/client.go b/PROJECTS/intermediate/docker-security-audit/internal/docker/client.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/docker/client.go rename to PROJECTS/intermediate/docker-security-audit/internal/docker/client.go diff --git a/PROJECTS/docker-security-audit/internal/finding/finding.go b/PROJECTS/intermediate/docker-security-audit/internal/finding/finding.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/finding/finding.go rename to PROJECTS/intermediate/docker-security-audit/internal/finding/finding.go diff --git a/PROJECTS/docker-security-audit/internal/parser/compose.go b/PROJECTS/intermediate/docker-security-audit/internal/parser/compose.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/parser/compose.go rename to PROJECTS/intermediate/docker-security-audit/internal/parser/compose.go diff --git a/PROJECTS/docker-security-audit/internal/parser/dockerfile.go b/PROJECTS/intermediate/docker-security-audit/internal/parser/dockerfile.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/parser/dockerfile.go rename to PROJECTS/intermediate/docker-security-audit/internal/parser/dockerfile.go diff --git a/PROJECTS/docker-security-audit/internal/parser/visitor.go b/PROJECTS/intermediate/docker-security-audit/internal/parser/visitor.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/parser/visitor.go rename to PROJECTS/intermediate/docker-security-audit/internal/parser/visitor.go diff --git a/PROJECTS/docker-security-audit/internal/proc/capabilities.go b/PROJECTS/intermediate/docker-security-audit/internal/proc/capabilities.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/proc/capabilities.go rename to PROJECTS/intermediate/docker-security-audit/internal/proc/capabilities.go diff --git a/PROJECTS/docker-security-audit/internal/proc/proc.go b/PROJECTS/intermediate/docker-security-audit/internal/proc/proc.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/proc/proc.go rename to PROJECTS/intermediate/docker-security-audit/internal/proc/proc.go diff --git a/PROJECTS/docker-security-audit/internal/proc/security.go b/PROJECTS/intermediate/docker-security-audit/internal/proc/security.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/proc/security.go rename to PROJECTS/intermediate/docker-security-audit/internal/proc/security.go diff --git a/PROJECTS/docker-security-audit/internal/report/json.go b/PROJECTS/intermediate/docker-security-audit/internal/report/json.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/report/json.go rename to PROJECTS/intermediate/docker-security-audit/internal/report/json.go diff --git a/PROJECTS/docker-security-audit/internal/report/junit.go b/PROJECTS/intermediate/docker-security-audit/internal/report/junit.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/report/junit.go rename to PROJECTS/intermediate/docker-security-audit/internal/report/junit.go diff --git a/PROJECTS/docker-security-audit/internal/report/reporter.go b/PROJECTS/intermediate/docker-security-audit/internal/report/reporter.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/report/reporter.go rename to PROJECTS/intermediate/docker-security-audit/internal/report/reporter.go diff --git a/PROJECTS/docker-security-audit/internal/report/sarif.go b/PROJECTS/intermediate/docker-security-audit/internal/report/sarif.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/report/sarif.go rename to PROJECTS/intermediate/docker-security-audit/internal/report/sarif.go diff --git a/PROJECTS/docker-security-audit/internal/report/terminal.go b/PROJECTS/intermediate/docker-security-audit/internal/report/terminal.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/report/terminal.go rename to PROJECTS/intermediate/docker-security-audit/internal/report/terminal.go diff --git a/PROJECTS/docker-security-audit/internal/rules/capabilities.go b/PROJECTS/intermediate/docker-security-audit/internal/rules/capabilities.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/rules/capabilities.go rename to PROJECTS/intermediate/docker-security-audit/internal/rules/capabilities.go diff --git a/PROJECTS/docker-security-audit/internal/rules/paths.go b/PROJECTS/intermediate/docker-security-audit/internal/rules/paths.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/rules/paths.go rename to PROJECTS/intermediate/docker-security-audit/internal/rules/paths.go diff --git a/PROJECTS/docker-security-audit/internal/rules/secrets.go b/PROJECTS/intermediate/docker-security-audit/internal/rules/secrets.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/rules/secrets.go rename to PROJECTS/intermediate/docker-security-audit/internal/rules/secrets.go diff --git a/PROJECTS/docker-security-audit/internal/scanner/scanner.go b/PROJECTS/intermediate/docker-security-audit/internal/scanner/scanner.go similarity index 100% rename from PROJECTS/docker-security-audit/internal/scanner/scanner.go rename to PROJECTS/intermediate/docker-security-audit/internal/scanner/scanner.go diff --git a/PROJECTS/docker-security-audit/learn/architecture.md b/PROJECTS/intermediate/docker-security-audit/learn/architecture.md similarity index 100% rename from PROJECTS/docker-security-audit/learn/architecture.md rename to PROJECTS/intermediate/docker-security-audit/learn/architecture.md diff --git a/PROJECTS/docker-security-audit/learn/codebase-guide.md b/PROJECTS/intermediate/docker-security-audit/learn/codebase-guide.md similarity index 100% rename from PROJECTS/docker-security-audit/learn/codebase-guide.md rename to PROJECTS/intermediate/docker-security-audit/learn/codebase-guide.md diff --git a/PROJECTS/docker-security-audit/learn/security-concepts.md b/PROJECTS/intermediate/docker-security-audit/learn/security-concepts.md similarity index 100% rename from PROJECTS/docker-security-audit/learn/security-concepts.md rename to PROJECTS/intermediate/docker-security-audit/learn/security-concepts.md diff --git a/PROJECTS/docker-security-audit/tests/e2e/e2e_test.go b/PROJECTS/intermediate/docker-security-audit/tests/e2e/e2e_test.go similarity index 100% rename from PROJECTS/docker-security-audit/tests/e2e/e2e_test.go rename to PROJECTS/intermediate/docker-security-audit/tests/e2e/e2e_test.go diff --git a/PROJECTS/docker-security-audit/tests/integration/compose_test.go b/PROJECTS/intermediate/docker-security-audit/tests/integration/compose_test.go similarity index 100% rename from PROJECTS/docker-security-audit/tests/integration/compose_test.go rename to PROJECTS/intermediate/docker-security-audit/tests/integration/compose_test.go diff --git a/PROJECTS/docker-security-audit/tests/integration/dockerfile_test.go b/PROJECTS/intermediate/docker-security-audit/tests/integration/dockerfile_test.go similarity index 100% rename from PROJECTS/docker-security-audit/tests/integration/dockerfile_test.go rename to PROJECTS/intermediate/docker-security-audit/tests/integration/dockerfile_test.go diff --git a/PROJECTS/docker-security-audit/tests/testdata/README.md b/PROJECTS/intermediate/docker-security-audit/tests/testdata/README.md similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/README.md rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/README.md diff --git a/PROJECTS/docker-security-audit/tests/testdata/TEST-SUMMARY.md b/PROJECTS/intermediate/docker-security-audit/tests/testdata/TEST-SUMMARY.md similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/TEST-SUMMARY.md rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/TEST-SUMMARY.md diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-caps.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-caps.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-caps.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-caps.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-docker-socket.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-docker-socket.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-docker-socket.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-docker-socket.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-mounts.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-mounts.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-mounts.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-mounts.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-no-limits.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-no-limits.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-no-limits.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-no-limits.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-privileged.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-privileged.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-privileged.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-privileged.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/bad-secrets.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-secrets.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/bad-secrets.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/bad-secrets.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/compose/good-production.yml b/PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/good-production.yml similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/compose/good-production.yml rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/compose/good-production.yml diff --git a/PROJECTS/docker-security-audit/tests/testdata/containers/privileged-container.json b/PROJECTS/intermediate/docker-security-audit/tests/testdata/containers/privileged-container.json similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/containers/privileged-container.json rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/containers/privileged-container.json diff --git a/PROJECTS/docker-security-audit/tests/testdata/containers/secure-container.json b/PROJECTS/intermediate/docker-security-audit/tests/testdata/containers/secure-container.json similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/containers/secure-container.json rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/containers/secure-container.json diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-add-command.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-add-command.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-add-command.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-add-command.Dockerfile diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-privileged.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-privileged.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-privileged.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-privileged.Dockerfile diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-root-user.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-root-user.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-root-user.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-root-user.Dockerfile diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-secrets.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-secrets.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/bad-secrets.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/bad-secrets.Dockerfile diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/good-minimal.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/good-minimal.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/good-minimal.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/good-minimal.Dockerfile diff --git a/PROJECTS/docker-security-audit/tests/testdata/dockerfiles/good-security.Dockerfile b/PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/good-security.Dockerfile similarity index 100% rename from PROJECTS/docker-security-audit/tests/testdata/dockerfiles/good-security.Dockerfile rename to PROJECTS/intermediate/docker-security-audit/tests/testdata/dockerfiles/good-security.Dockerfile diff --git a/README.md b/README.md index 4ff18b22..5867f470 100644 --- a/README.md +++ b/README.md @@ -49,31 +49,31 @@ Big thanks to the current contributors! ❤️ -- [@deniskhud](https://github.com/deniskhud): [Simple Port Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/simple-port-scanner) -- [@Heritage-XioN](https://github.com/Heritage-XioN): [Metadata Scrubber Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/metadata-scrubber-tool) +- [@deniskhud](https://github.com/deniskhud): [Simple Port Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/simple-port-scanner) +- [@Heritage-XioN](https://github.com/Heritage-XioN): [Metadata Scrubber Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/metadata-scrubber-tool) --- -# Projects +# Projects ### *Each link to their brief instructions or source code* --- ## Beginner Projects -### *SOURCE CODE:* *[Simple Port Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/simple-port-scanner)* +### *SOURCE CODE:* *[Simple Port Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/simple-port-scanner)* Asynchronous TCP port scanner in C++ using boost::asio for concurrent port scanning with configurable ranges and timeouts. Implements service detection through banner grabbing and demonstrates async I/O patterns with TCP socket programming. -### *SOURCE CODE:* *[Keylogger](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/keylogger)* +### *SOURCE CODE:* *[Keylogger](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/keylogger)* Use Python's `pynput` library to capture keyboard events and log them to a local file with timestamps. Include a toggle key (like F12) to start/stop logging. **Important**: Add clear disclaimers and only test on systems you own. -### *SOURCE CODE:* *[Caesar Cipher](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/caesar-cipher)* +### *SOURCE CODE:* *[Caesar Cipher](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/caesar-cipher)* Create a CLI tool that shifts characters by a specified number (the "key") to encrypt/decrypt text. Implement both encryption and brute-force decryption (try all 26 possible shifts). Bonus: Add support for preserving spaces and punctuation. -### *SOURCE CODE:* *[DNS Lookup CLI Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/dns-lookup)* +### *SOURCE CODE:* *[DNS Lookup CLI Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/dns-lookup)* Use Python's `dnspython` library to query different DNS record types (A, AAAA, MX, TXT, NS, CNAME). Display results in a clean table format with color coding using `rich` and `typer` libraries. Add reverse DNS lookup functionality and WHOIS. ### [Simple Vulnerability Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/beginner/Simple.Vulnerability.Scanner.md) Build a script that checks installed software versions against a CVE database or uses `pip-audit` for Python packages. Parse system package managers (apt, yum, brew) to list installed software. Flag packages with known vulnerabilities and suggest updates. -### *SOURCE CODE:* *[Metadata Scrubber Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/metadata-scrubber-tool)* +### *SOURCE CODE:* *[Metadata Scrubber Tool](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/beginner/metadata-scrubber-tool)* CLI tool that removes privacy sensitive metadata (EXIF, GPS, author info) from images, PDFs, and Office documents using concurrent batch processing. Features read/scrub/verify commands with rich terminal output, supports dry-run previews, and generates detailed comparison reports showing exactly what metadata was removed. ### [Network Traffic Analyzer](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/beginner/Network.Traffic.Analyzer.md) @@ -143,7 +143,7 @@ Create a network monitor that detects traffic spikes using packet sniffing (Scap ### [Container Security Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/intermediate/Container.Security.Scanner.md) Scan Docker images by parsing Dockerfiles for insecure practices (running as root, hardcoded secrets) and checking base image versions against vulnerability databases. Use Docker API to inspect running containers for exposed ports and mounted volumes. Output findings in JSON with severity ratings. -### *SOURCE CODE:* *[Full Stack API Security Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/api-security-scanner)* +### *SOURCE CODE:* *[Full Stack API Security Scanner](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/intermediate/api-security-scanner)* Build an enterprise-grade automated API security scanner that performs deep vulnerability assessment across REST, GraphQL, and SOAP endpoints, detecting OWASP API Top 10 flaws through intelligent fuzzing, authentication bypass testing, broken object level authorization, mass assignment exploitation, and rate limiting analysis with ML-enhanced payload generation and comprehensive reporting dashboards. (FastAPI - React-Typescript - Vite - Nginx - Docker - CSS) ### [Wireless Deauth Detector](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/intermediate/Wireless.Deauth.Detector.md) @@ -185,17 +185,17 @@ Analyze Linux/Windows systems for potential privilege escalation vectors. Check ### [Network Baseline Monitor](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/intermediate/Network.Baseline.Monitor.md) Establish normal network behavior patterns (traffic volume, protocol distribution, top talkers). Alert on deviations that could indicate compromises or attacks. -### *SOURCE CODE:* *[Docker Security Audit](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/docker-security-audit)* +### *SOURCE CODE:* *[Docker Security Audit](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/intermediate/docker-security-audit)* Go CLI tool that scans Docker containers, images, Dockerfiles, and compose files for security misconfigurations. Checks against CIS Docker Benchmark v1.6.0 controls (privileged mode, dangerous capabilities, sensitive mounts, secrets in images, missing security profiles). Outputs findings with remediation guidance in terminal, JSON, SARIF, or JUnit formats. --- ## Advanced Projects -### *SOURCE CODE:* *[API Rate Limiter](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/api-rate-limiter)* +### *SOURCE CODE:* *[API Rate Limiter](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/advanced/api-rate-limiter)* Build middleware that implements token bucket or sliding window rate limiting for APIs. Support per-user, per-IP, and global limits. Include Redis backend for distributed rate limiting across multiple servers. -### *SOURCE CODE:* *[Encrypted Chat Application](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/encrypted-p2p-chat)* +### *SOURCE CODE:* *[Encrypted Chat Application](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/advanced/encrypted-p2p-chat)* Build a real time encrypted chat using WebSockets with Signal Protocol encryption (X3DH key exchange + Double Ratchet) for forward secrecy and break-in recovery. Implement passwordless authentication via WebAuthn/Passkeys. Backend uses FastAPI with PostgreSQL, SurrealDB live queries, and Redis. SolidJS TypeScript frontend with nanostores and 8-bit retro design using TailwindCSS. ### [Exploit Development Framework](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/advanced/Exploit.Development.Framework.md) @@ -204,7 +204,7 @@ Build a modular framework in Python where exploits are plugins (one file per vul ### [AI Threat Detection](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/advanced/AI.Threat.Detection.md) Train a machine learning model (Random Forest or LSTM) on network traffic data (CICIDS2017 dataset) to classify normal vs. malicious behavior. Use feature engineering on packet metadata (packet size, timing, protocols). Deploy model with FastAPI for real-time inference on live traffic. -### *SOURCE CODE:* *[Bug Bounty Platform](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/bug-bounty-platform)* +### *SOURCE CODE:* *[Bug Bounty Platform](https://github.com/CarterPerez-dev/Cybersecurity-Projects/tree/main/PROJECTS/advanced/bug-bounty-platform)* Create a web app with user roles (researchers, companies), vulnerability submission workflow, and reward management. Implement severity scoring (CVSS), status tracking, and encrypted communications. Use React frontend, FastAPI/Django backend, PostgreSQL database, and S3 for file uploads. ### [Cloud Security Posture Management](https://github.com/CarterPerez-dev/Cybersecurity-Projects/blob/main/SYNOPSES/advanced/Cloud.Security.Posture.Management.md) diff --git a/templates/fullstack-template b/templates/fullstack-template index 0eec274f..ecbb534e 160000 --- a/templates/fullstack-template +++ b/templates/fullstack-template @@ -1 +1 @@ -Subproject commit 0eec274fba59ddd373080ae961dd4497eaf2e454 +Subproject commit ecbb534e85e8e381e6e89aece4b786db8f7ad172