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,
Card,
CardContent,
Grid,
Typography,
Chip,
CircularProgress,
@@ -14,6 +13,7 @@ import {
DialogContent,
DialogActions,
TextField,
Grid,
} from '@mui/material';
import { Add, TrendingUp } from '@mui/icons-material';
import { companyService } from '../services/companyService';
@@ -79,7 +79,7 @@ function Companies() {
<Grid container spacing={3}>
{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
sx={{ cursor: 'pointer', '&:hover': { boxShadow: 6 } }}
onClick={() => navigate(`/companies/${company.id}`)}

View File

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

View File

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

View File

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

View File

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