feat: Complete phishing panel with MUI v7 Grid fixes

-  Full backend implementation (Auth, Companies, Tokens, Templates, Tracking)
-  Complete frontend with Material-UI v7
-  Fixed MUI Grid syntax for v7 (xs/sm/md -> size prop)
-  Domain configuration (single/dual domain support with CORS)
-  Gmail integration with App Password
-  Telegram notifications
-  Mail template management with HTML editor
-  Security features (bcrypt, session-based auth, CORS)
-  Deployment scripts and comprehensive documentation
-  Admin user management scripts
- 📚 7 detailed documentation files (DEPLOYMENT, SECURITY, DOMAIN_SETUP, etc.)

Backend: Node.js + Express + SQLite + Sequelize
Frontend: React + Vite + MUI v7
Features: Token tracking, IP/GeoIP logging, company management, mail templates
This commit is contained in:
salvacybersec
2025-11-10 21:03:17 +03:00
parent f86cda2978
commit d41ff7671e
5 changed files with 31 additions and 30 deletions

View File

@@ -5,7 +5,6 @@ import {
Button, Button,
Card, Card,
CardContent, CardContent,
Grid,
Typography, Typography,
Chip, Chip,
CircularProgress, CircularProgress,
@@ -14,6 +13,7 @@ import {
DialogContent, DialogContent,
DialogActions, DialogActions,
TextField, TextField,
Grid,
} from '@mui/material'; } from '@mui/material';
import { Add, TrendingUp } from '@mui/icons-material'; import { Add, TrendingUp } from '@mui/icons-material';
import { companyService } from '../services/companyService'; import { companyService } from '../services/companyService';
@@ -79,7 +79,7 @@ function Companies() {
<Grid container spacing={3}> <Grid container spacing={3}>
{companies.map((company) => ( {companies.map((company) => (
<Grid item xs={12} sm={6} md={4} key={company.id}> <Grid size={{ xs: 12, sm: 6, md: 4 }} key={company.id}>
<Card <Card
sx={{ cursor: 'pointer', '&:hover': { boxShadow: 6 } }} sx={{ cursor: 'pointer', '&:hover': { boxShadow: 6 } }}
onClick={() => navigate(`/companies/${company.id}`)} onClick={() => navigate(`/companies/${company.id}`)}

View File

@@ -134,7 +134,7 @@ function CompanyDetail() {
{/* Stats Cards */} {/* Stats Cards */}
<Grid container spacing={3} sx={{ mb: 3 }}> <Grid container spacing={3} sx={{ mb: 3 }}>
<Grid item xs={12} sm={4}> <Grid size={{ xs: 12, sm: 4 }}>
<Card> <Card>
<CardContent> <CardContent>
<Box display="flex" justifyContent="space-between" alignItems="center"> <Box display="flex" justifyContent="space-between" alignItems="center">
@@ -149,7 +149,7 @@ function CompanyDetail() {
</CardContent> </CardContent>
</Card> </Card>
</Grid> </Grid>
<Grid item xs={12} sm={4}> <Grid size={{ xs: 12, sm: 4 }}>
<Card> <Card>
<CardContent> <CardContent>
<Box display="flex" justifyContent="space-between" alignItems="center"> <Box display="flex" justifyContent="space-between" alignItems="center">
@@ -164,7 +164,7 @@ function CompanyDetail() {
</CardContent> </CardContent>
</Card> </Card>
</Grid> </Grid>
<Grid item xs={12} sm={4}> <Grid size={{ xs: 12, sm: 4 }}>
<Card> <Card>
<CardContent> <CardContent>
<Box display="flex" justifyContent="space-between" alignItems="center"> <Box display="flex" justifyContent="space-between" alignItems="center">
@@ -190,7 +190,7 @@ function CompanyDetail() {
Şirket Bilgileri Şirket Bilgileri
</Typography> </Typography>
<Grid container spacing={2}> <Grid container spacing={2}>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Sektör Sektör
</Typography> </Typography>
@@ -198,7 +198,7 @@ function CompanyDetail() {
{company.industry || 'Belirtilmemiş'} {company.industry || 'Belirtilmemiş'}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Oluşturulma Tarihi Oluşturulma Tarihi
</Typography> </Typography>
@@ -207,7 +207,7 @@ function CompanyDetail() {
</Typography> </Typography>
</Grid> </Grid>
{company.description && ( {company.description && (
<Grid item xs={12}> <Grid size={12}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
ıklama ıklama
</Typography> </Typography>

View File

@@ -1,6 +1,5 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { import {
Grid,
Paper, Paper,
Typography, Typography,
Box, Box,
@@ -14,6 +13,7 @@ import {
TableRow, TableRow,
Chip, Chip,
CircularProgress, CircularProgress,
Grid,
} from '@mui/material'; } from '@mui/material';
import { import {
Business, Business,
@@ -89,7 +89,7 @@ function Dashboard() {
</Typography> </Typography>
<Grid container spacing={3} sx={{ mb: 3 }}> <Grid container spacing={3} sx={{ mb: 3 }}>
<Grid item xs={12} sm={6} md={3}> <Grid size={{ xs: 12, sm: 6, md: 3 }}>
<StatCard <StatCard
title="Şirketler" title="Şirketler"
value={stats?.overview?.total_companies || 0} value={stats?.overview?.total_companies || 0}
@@ -97,7 +97,7 @@ function Dashboard() {
color="primary" color="primary"
/> />
</Grid> </Grid>
<Grid item xs={12} sm={6} md={3}> <Grid size={{ xs: 12, sm: 6, md: 3 }}>
<StatCard <StatCard
title="Toplam Token" title="Toplam Token"
value={stats?.overview?.total_tokens || 0} value={stats?.overview?.total_tokens || 0}
@@ -105,7 +105,7 @@ function Dashboard() {
color="info" color="info"
/> />
</Grid> </Grid>
<Grid item xs={12} sm={6} md={3}> <Grid size={{ xs: 12, sm: 6, md: 3 }}>
<StatCard <StatCard
title="Tıklanan" title="Tıklanan"
value={stats?.overview?.clicked_tokens || 0} value={stats?.overview?.clicked_tokens || 0}
@@ -113,7 +113,7 @@ function Dashboard() {
color="success" color="success"
/> />
</Grid> </Grid>
<Grid item xs={12} sm={6} md={3}> <Grid size={{ xs: 12, sm: 6, md: 3 }}>
<StatCard <StatCard
title="Başarı Oranı" title="Başarı Oranı"
value={`${stats?.overview?.click_rate || 0}%`} value={`${stats?.overview?.click_rate || 0}%`}
@@ -124,7 +124,7 @@ function Dashboard() {
</Grid> </Grid>
<Grid container spacing={3}> <Grid container spacing={3}>
<Grid item xs={12} md={6}> <Grid size={{ xs: 12, md: 6 }}>
<Paper sx={{ p: 2 }}> <Paper sx={{ p: 2 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
Şirket Performansı Şirket Performansı
@@ -160,7 +160,7 @@ function Dashboard() {
</Paper> </Paper>
</Grid> </Grid>
<Grid item xs={12} md={6}> <Grid size={{ xs: 12, md: 6 }}>
<Paper sx={{ p: 2 }}> <Paper sx={{ p: 2 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
Son Tıklamalar Son Tıklamalar

View File

@@ -5,13 +5,14 @@ import {
Typography, Typography,
TextField, TextField,
Button, Button,
Grid,
Alert, Alert,
CircularProgress, CircularProgress,
Divider, Divider,
FormControlLabel,
Checkbox,
Grid,
} from '@mui/material'; } from '@mui/material';
import { Save, Send } from '@mui/icons-material'; import { Save, Send } from '@mui/icons-material';
import { FormControlLabel, Checkbox } from '@mui/material';
import axios from 'axios'; import axios from 'axios';
const API_URL = import.meta.env.VITE_API_URL; const API_URL = import.meta.env.VITE_API_URL;
@@ -149,7 +150,7 @@ function Settings() {
<Grid container spacing={3}> <Grid container spacing={3}>
{/* System Settings */} {/* System Settings */}
<Grid item xs={12}> <Grid size={12}>
<Paper sx={{ p: 3 }}> <Paper sx={{ p: 3 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
🌐 Genel Ayarlar 🌐 Genel Ayarlar
@@ -210,7 +211,7 @@ function Settings() {
</Grid> </Grid>
{/* Gmail Settings */} {/* Gmail Settings */}
<Grid item xs={12} md={6}> <Grid size={{ xs: 12, md: 6 }}>
<Paper sx={{ p: 3 }}> <Paper sx={{ p: 3 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
📧 Gmail Ayarları 📧 Gmail Ayarları
@@ -278,7 +279,7 @@ function Settings() {
</Paper> </Paper>
</Grid> </Grid>
<Grid item xs={12} md={6}> <Grid size={{ xs: 12, md: 6 }}>
<Paper sx={{ p: 3 }}> <Paper sx={{ p: 3 }}>
<Typography variant="h6" gutterBottom> <Typography variant="h6" gutterBottom>
Telegram Ayarları Telegram Ayarları

View File

@@ -5,7 +5,6 @@ import {
Button, Button,
Paper, Paper,
Typography, Typography,
Grid,
Card, Card,
CardContent, CardContent,
Table, Table,
@@ -21,6 +20,7 @@ import {
DialogTitle, DialogTitle,
DialogContent, DialogContent,
DialogActions, DialogActions,
Grid,
} from '@mui/material'; } from '@mui/material';
import { import {
ArrowBack, ArrowBack,
@@ -128,7 +128,7 @@ function TokenDetail() {
{/* Stats Cards */} {/* Stats Cards */}
<Grid container spacing={3} sx={{ mb: 3 }}> <Grid container spacing={3} sx={{ mb: 3 }}>
<Grid item xs={12} sm={3}> <Grid xs={12} sm={3}>
<Card> <Card>
<CardContent> <CardContent>
<Box display="flex" alignItems="center" gap={2}> <Box display="flex" alignItems="center" gap={2}>
@@ -149,7 +149,7 @@ function TokenDetail() {
</CardContent> </CardContent>
</Card> </Card>
</Grid> </Grid>
<Grid item xs={12} sm={3}> <Grid xs={12} sm={3}>
<Card> <Card>
<CardContent> <CardContent>
<Box display="flex" alignItems="center" gap={2}> <Box display="flex" alignItems="center" gap={2}>
@@ -164,7 +164,7 @@ function TokenDetail() {
</CardContent> </CardContent>
</Card> </Card>
</Grid> </Grid>
<Grid item xs={12} sm={3}> <Grid xs={12} sm={3}>
<Card> <Card>
<CardContent> <CardContent>
<Box> <Box>
@@ -181,7 +181,7 @@ function TokenDetail() {
</CardContent> </CardContent>
</Card> </Card>
</Grid> </Grid>
<Grid item xs={12} sm={3}> <Grid xs={12} sm={3}>
<Card> <Card>
<CardContent> <CardContent>
<Box> <Box>
@@ -214,7 +214,7 @@ function TokenDetail() {
Token Bilgileri Token Bilgileri
</Typography> </Typography>
<Grid container spacing={2}> <Grid container spacing={2}>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Token Token
</Typography> </Typography>
@@ -222,7 +222,7 @@ function TokenDetail() {
{token.token} {token.token}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Tracking URL Tracking URL
</Typography> </Typography>
@@ -233,7 +233,7 @@ function TokenDetail() {
{`${window.location.origin.replace('5173', '3000')}/t/${token.token}`} {`${window.location.origin.replace('5173', '3000')}/t/${token.token}`}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Şablon Tipi Şablon Tipi
</Typography> </Typography>
@@ -241,13 +241,13 @@ function TokenDetail() {
{token.template_type || 'Belirtilmemiş'} {token.template_type || 'Belirtilmemiş'}
</Typography> </Typography>
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Şirket Şirket
</Typography> </Typography>
<Typography variant="body1">{token.company?.name}</Typography> <Typography variant="body1">{token.company?.name}</Typography>
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid size={{ xs: 12, sm: 6 }}>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
Gönderen Adı Gönderen Adı
</Typography> </Typography>