├── app ├── loading.tsx ├── .DS_Store ├── dashboard │ └── loading.tsx ├── api │ ├── .DS_Store │ ├── upload │ │ └── route.ts │ ├── auth │ │ ├── logout │ │ │ └── route.ts │ │ ├── get-user │ │ │ └── route.ts │ │ ├── check-users │ │ │ └── route.ts │ │ ├── login │ │ │ └── route.ts │ │ ├── change-password │ │ │ └── route.ts │ │ └── register-first-user │ │ │ └── route.ts │ ├── settings │ │ ├── batch │ │ │ └── route.ts │ │ ├── upload │ │ │ └── route.ts │ │ └── route.ts │ ├── upload-chunk-status │ │ └── route.ts │ ├── upload-logs │ │ └── route.ts │ ├── device-info │ │ └── route.ts │ ├── device-machine-info │ │ └── route.ts │ ├── device-software │ │ └── route.ts │ ├── software-analysis │ │ └── route.ts │ ├── upload-chunk │ │ └── route.ts │ ├── device-credentials │ │ └── route.ts │ ├── device-files │ │ └── route.ts │ └── analytics │ │ └── performance │ │ └── route.ts ├── animation-demo │ └── page.tsx ├── components │ └── logout-button.tsx └── domain-search │ └── page.tsx ├── public ├── .DS_Store ├── images │ ├── logo.png │ ├── favicon.png │ └── logo-light.png ├── placeholder.jpg ├── placeholder-logo.png ├── placeholder-user.jpg ├── placeholder-logo.svg └── placeholder.svg ├── .gitignore ├── images ├── Bron-Vault-Dashboard.png ├── Bron-Vault-Search-1.png ├── Bron-Vault-Search-2.png ├── Bron-Vault-Search-3.png ├── Bron-Vault-Search-4.png ├── Bron-Vault-Device-Overview.png ├── Bron-Vault-Host-Information.png └── Bron-Vault-Domain-Keyword-Search.png ├── postcss.config.mjs ├── components ├── ui │ ├── aspect-ratio.tsx │ ├── skeleton.tsx │ ├── collapsible.tsx │ ├── use-mobile.tsx │ ├── textarea.tsx │ ├── label.tsx │ ├── progress.tsx │ ├── input.tsx │ ├── separator.tsx │ ├── toaster.tsx │ ├── sonner.tsx │ ├── checkbox.tsx │ ├── badge.tsx │ ├── slider.tsx │ ├── switch.tsx │ ├── tooltip.tsx │ ├── hover-card.tsx │ ├── popover.tsx │ ├── avatar.tsx │ ├── radio-group.tsx │ ├── alert.tsx │ ├── toggle.tsx │ ├── scroll-area.tsx │ ├── resizable.tsx │ ├── card.tsx │ ├── button.tsx │ ├── toggle-group.tsx │ ├── tabs.tsx │ ├── accordion.tsx │ ├── input-otp.tsx │ ├── calendar.tsx │ ├── table.tsx │ ├── breadcrumb.tsx │ ├── pagination.tsx │ ├── drawer.tsx │ ├── sheet.tsx │ └── dialog.tsx ├── theme-provider.tsx ├── force-refresh-wrapper.tsx ├── auth-guard.tsx ├── client-layout-with-sidebar.tsx ├── animated-stat-card.tsx ├── recon │ ├── ReconSummaryCards.tsx │ └── TimelineChart.tsx ├── app-header.tsx ├── search │ ├── TypingEffect.tsx │ └── SearchInterface.tsx ├── file │ └── FileContentDialog.tsx ├── animated-counter.tsx ├── error-boundary.tsx └── animated-software-list.tsx ├── AUTHORS.md ├── next-env.d.ts ├── components.json ├── hooks ├── use-mobile.tsx ├── useAuth.ts ├── useStats.ts └── useSearch.ts ├── tsconfig.json ├── lib ├── system-information-parser │ ├── types.ts │ └── parsers │ │ ├── ailurophile.parser.ts │ │ ├── exelastealer.parser.ts │ │ └── blank-grabber.parser.ts ├── utils.ts ├── upload │ └── upload-handler.ts ├── upload-connections.ts ├── logger.ts └── auth.ts ├── Dockerfile.setup ├── next.config.mjs ├── middleware.ts ├── Dockerfile ├── docker-status.sh ├── .env.example ├── scripts └── 006_add_performance_indexes.sql ├── styles └── globals.css ├── package.json └── docker-start.sh /app/loading.tsx: -------------------------------------------------------------------------------- 1 | export default function Loading() { 2 | return null 3 | } 4 | -------------------------------------------------------------------------------- /app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/app/.DS_Store -------------------------------------------------------------------------------- /app/dashboard/loading.tsx: -------------------------------------------------------------------------------- 1 | export default function Loading() { 2 | return null 3 | } 4 | -------------------------------------------------------------------------------- /public/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/.DS_Store -------------------------------------------------------------------------------- /app/api/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/app/api/.DS_Store -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/images/logo.png -------------------------------------------------------------------------------- /public/placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/placeholder.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | .env.local 3 | node_modules/* 4 | .next/* 5 | uploads/* 6 | clickhouse-data 7 | mysql-data -------------------------------------------------------------------------------- /public/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/images/favicon.png -------------------------------------------------------------------------------- /public/images/logo-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/images/logo-light.png -------------------------------------------------------------------------------- /public/placeholder-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/placeholder-logo.png -------------------------------------------------------------------------------- /public/placeholder-user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/public/placeholder-user.jpg -------------------------------------------------------------------------------- /images/Bron-Vault-Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Dashboard.png -------------------------------------------------------------------------------- /images/Bron-Vault-Search-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Search-1.png -------------------------------------------------------------------------------- /images/Bron-Vault-Search-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Search-2.png -------------------------------------------------------------------------------- /images/Bron-Vault-Search-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Search-3.png -------------------------------------------------------------------------------- /images/Bron-Vault-Search-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Search-4.png -------------------------------------------------------------------------------- /images/Bron-Vault-Device-Overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Device-Overview.png -------------------------------------------------------------------------------- /images/Bron-Vault-Host-Information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Host-Information.png -------------------------------------------------------------------------------- /images/Bron-Vault-Domain-Keyword-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ITSEC-Research/bron-vault/HEAD/images/Bron-Vault-Domain-Keyword-Search.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 4 | 5 | const AspectRatio = AspectRatioPrimitive.Root 6 | 7 | export { AspectRatio } 8 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | # Authors 2 | 3 | Broń Vault OSS Project was originally created by: 4 | 5 | - [YoKo Kho](https://x.com/YoKoAcc) 6 | - [Tomi Ashari](https://x.com/mastomii) 7 | 8 | Additional contributors may join and improve the project over time. -------------------------------------------------------------------------------- /app/api/upload/route.ts: -------------------------------------------------------------------------------- 1 | import { type NextRequest } from "next/server" 2 | import { handleUploadRequest } from "@/lib/upload/upload-handler" 3 | 4 | export async function POST(request: NextRequest) { 5 | return handleUploadRequest(request) 6 | } 7 | 8 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. 6 | -------------------------------------------------------------------------------- /components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /components/theme-provider.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import * as React from 'react' 4 | import { 5 | ThemeProvider as NextThemesProvider, 6 | type ThemeProviderProps, 7 | } from 'next-themes' 8 | 9 | export function ThemeProvider({ children, ...props }: ThemeProviderProps) { 10 | return {children} 11 | } 12 | -------------------------------------------------------------------------------- /components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" 4 | 5 | const Collapsible = CollapsiblePrimitive.Root 6 | 7 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger 8 | 9 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent 10 | 11 | export { Collapsible, CollapsibleTrigger, CollapsibleContent } 12 | -------------------------------------------------------------------------------- /app/api/auth/logout/route.ts: -------------------------------------------------------------------------------- 1 | import { NextRequest, NextResponse } from "next/server"; 2 | import { getSecureCookieOptions } from "@/lib/auth"; 3 | 4 | export async function POST(request: NextRequest) { 5 | const response = NextResponse.json({ success: true }); 6 | 7 | // Clear the auth cookie with consistent secure options 8 | response.cookies.set("auth", "", { 9 | ...getSecureCookieOptions(), 10 | maxAge: 0, // Override maxAge to 0 to clear the cookie 11 | }); 12 | 13 | return response; 14 | } -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "neutral", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /hooks/use-mobile.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | const MOBILE_BREAKPOINT = 768 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState(undefined) 7 | 8 | React.useEffect(() => { 9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 | const onChange = () => { 11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 | } 13 | mql.addEventListener("change", onChange) 14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 | return () => mql.removeEventListener("change", onChange) 16 | }, []) 17 | 18 | return !!isMobile 19 | } 20 | -------------------------------------------------------------------------------- /components/ui/use-mobile.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | const MOBILE_BREAKPOINT = 768 4 | 5 | export function useIsMobile() { 6 | const [isMobile, setIsMobile] = React.useState(undefined) 7 | 8 | React.useEffect(() => { 9 | const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) 10 | const onChange = () => { 11 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 12 | } 13 | mql.addEventListener("change", onChange) 14 | setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) 15 | return () => mql.removeEventListener("change", onChange) 16 | }, []) 17 | 18 | return !!isMobile 19 | } 20 | -------------------------------------------------------------------------------- /app/animation-demo/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { AnimationDemo } from "@/components/animation-demo" 4 | 5 | export default function AnimationDemoPage() { 6 | return ( 7 |
8 |
9 |
10 |

11 | 🎬 Dashboard Animation Demo 12 |

13 |

14 | Animation demonstration that has been added to the broń Vault dashboard 15 |

16 |
17 | 18 | 19 |
20 |
21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "target": "ES6", 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /app/components/logout-button.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { Button } from "@/components/ui/button"; 3 | import { useRouter } from "next/navigation"; 4 | import { useState } from "react"; 5 | 6 | export default function LogoutButton() { 7 | const router = useRouter(); 8 | const [loading, setLoading] = useState(false); 9 | 10 | const handleLogout = async () => { 11 | setLoading(true); 12 | await fetch("/api/auth/logout", { 13 | method: "POST", 14 | credentials: "include", 15 | }); 16 | setLoading(false); 17 | router.replace("/login"); 18 | }; 19 | 20 | return ( 21 | 24 | ); 25 | } -------------------------------------------------------------------------------- /components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |