from fastapi import FastAPI, Request, Depends, HTTPException, status from fastapi.responses import HTMLResponse from fastapi.security import HTTPBasic, HTTPBasicCredentials import uvicorn import asyncio import socket import threading import logging from rich.console import Console from rich.panel import Panel import struct import select import secrets # إعداد تسجيل الأخطاء logging.basicConfig( filename='socks5.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s' ) console = Console() app = FastAPI(title="TzX Team SOCKS5 Server") # إعداد المصادقة الأساسية security = HTTPBasic() USERNAME = "admin" # يمكنك تغييره PASSWORD = "TzX2999" # يمكنك تغييره # التحقق من اسم المستخدم وكلمة المرور def verify_credentials(credentials: HTTPBasicCredentials = Depends(security)): correct_username = secrets.compare_digest(credentials.username, USERNAME) correct_password = secrets.compare_digest(credentials.password, PASSWORD) if not (correct_username and correct_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="اسم المستخدم أو كلمة المرور غير صحيحة", headers={"WWW-Authenticate": "Basic"}, ) return credentials.username # حالة الخادوم server_running = False server_thread = None server_instance = None # HTML للواجهة الفاخرة html_content = """ TzX Team - Future Coding 2999
SOCKS5 Server: Stopped

الأوامر:

""" class SOCKS5Server: def __init__(self, host='127.0.0.1', port=1081, max_connections=100): self.host = host self.port = port self.max_connections = max_connections self.server_socket = None self.running = False def setup_socket(self): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind((self.host, self.port)) self.server_socket.listen(self.max_connections) console.print(Panel(f"SOCKS5 Server started on {self.host}:{self.port} | TzX Team", style="bold cyan")) async def handle_auth(self, client_socket, addr): try: loop = asyncio.get_running_loop() data = await loop.sock_recv(client_socket, 1024) if not data or data[0] != 0x05: return False nmethods = data[1] methods = data[2:2 + nmethods] if 0x00 not in methods: await loop.sock_sendall(client_socket, b'\x05\xff') return False await loop.sock_sendall(client_socket, b'\x05\x00') return True except Exception as e: logging.error(f"Client {addr}: Auth error - {e}") return False async def handle_request(self, client_socket, addr): try: loop = asyncio.get_running_loop() data = await loop.sock_recv(client_socket, 1024) if not data or data[0] != 0x05: return False cmd, _, atype = data[1:4] if cmd != 0x01: await loop.sock_sendall(client_socket, b'\x05\x07\x00\x01\x00\x00\x00\x00\x00\x00') return False if atype == 0x01: # IPv4 dest_addr = socket.inet_ntoa(data[4:8]) dest_port = struct.unpack('>H', data[8:10])[0] elif atype == 0x03: # Domain name addr_len = data[4] dest_addr = data[5:5 + addr_len].decode() dest_port = struct.unpack('>H', data[5 + addr_len:7 + addr_len])[0] else: await loop.sock_sendall(client_socket, b'\x05\x08\x00\x01\x00\x00\x00\x00\x00\x00') return False target_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: target_socket.connect((dest_addr, dest_port)) await loop.sock_sendall(client_socket, b'\x05\x00\x00\x01' + socket.inet_aton('0.0.0.0') + b'\x00\x00') return target_socket except Exception as e: await loop.sock_sendall(client_socket, b'\x05\x04\x00\x01\x00\x00\x00\x00\x00\x00') logging.error(f"Client {addr}: Connection to {dest_addr}:{dest_port} failed - {e}") return False except Exception as e: logging.error(f"Client {addr}: Request error - {e}") return False async def relay_data(self, client_socket, target_socket, addr): try: loop = asyncio.get_running_loop() while True: r, _, _ = await loop.run_in_executor(None, select.select, [client_socket, target_socket], [], []) if client_socket in r: data = await loop.sock_recv(client_socket, 4096) if not data: break await loop.sock_sendall(target_socket, data) if target_socket in r: data = await loop.sock_recv(target_socket, 4096) if not data: break await loop.sock_sendall(client_socket, data) except Exception as e: logging.error(f"Client {addr}: Relay error - {e}") finally: client_socket.close() target_socket.close() async def handle_client(self, client_socket, addr): try: if not await self.handle_auth(client_socket, addr): return target_socket = await self.handle_request(client_socket, addr) if target_socket: console.print(f"[green]Client {addr}: Connected to target | TzX Team[/green]") await self.relay_data(client_socket, target_socket, addr) else: console.print(f"[red]Client {addr}: Connection failed | TzX Team[/red]") except Exception as e: logging.error(f"Client {addr}: General error - {e}") finally: client_socket.close() async def accept_connections(self): loop = asyncio.get_running_loop() while self.running: try: client_socket, addr = await loop.sock_accept(self.server_socket) loop.create_task(self.handle_client(client_socket, addr)) except Exception as e: if self.running: logging.error(f"Accept error: {e}") def start(self): if not self.running: self.running = True self.setup_socket() asyncio.run(self.accept_connections()) def stop(self): if self.running: self.running = False if self.server_socket: self.server_socket.close() console.print("[yellow]SOCKS5 Server stopped | TzX Team[/yellow]") @app.get("/", response_class=HTMLResponse) async def root(username: str = Depends(verify_credentials)): return HTMLResponse(content=html_content) @app.post("/start_server") async def start_server(username: str = Depends(verify_credentials)): global server_running, server_thread, server_instance if not server_running: server_instance = SOCKS5Server() server_thread = threading.Thread(target=server_instance.start, daemon=True) server_thread.start() server_running = True return {"message": "SOCKS5 Server: Running | Port: 1081"} return {"message": "SOCKS5 Server: Already Running"} @app.post("/stop_server") async def stop_server(username: str = Depends(verify_credentials)): global server_running, server_thread, server_instance if server_running: server_instance.stop() server_running = False server_thread = None server_instance = None return {"message": "SOCKS5 Server: Stopped"} return {"message": "SOCKS5 Server: Already Stopped"} if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=1080, log_level="error")