# Decompiled with PyLingual (https://pylingual.io) # Internal filename: main_unified_separated.py # Bytecode version: 3.9.0beta5 (3425) # Source timestamp: 1970-01-01 00:00:00 UTC (0) """ PASSWORD ATWAN FORTEX - الواجهة الموحدة (بدون مولد المفاتيح) أداة شاملة لإنشاء كلمات مرور قوية مع نظام الحماية """ import tkinter as tk from tkinter import ttk, filedialog, messagebox, scrolledtext import string import random import secrets import hashlib import uuid import psutil import platform import os import json from datetime import datetime, timedelta import threading import time import re COLORS = {'primary': '#2E3440', 'secondary': '#3B4252', 'accent': '#5E81AC', 'success': '#A3BE8C', 'warning': '#EBCB8B', 'danger': '#BF616A', 'text': '#ECEFF4', 'text_dark': '#2E3440', 'bg_light': '#E5E9F0', 'bg_card': '#D8DEE9'} class AdvancedPasswordGenerator: """مولد كلمات المرور المتقدم""" def __init__(self): self.character_sets = {'uppercase': string.ascii_uppercase, 'lowercase': string.ascii_lowercase, 'numbers': string.digits, 'basic_symbols': '!@#$%^&*()', 'extended_symbols': '!@#$%^&*()_+-=[]{}|;:,.<>?', 'brackets': '()[]{}<>', 'math_symbols': '+-*/=', 'currency': '$€£¥₹', 'spaces': ' ', 'underscores': '_', 'hyphens': '-', 'dots': '.', 'quotes': '\'"', 'slashes': '/\\', 'custom': ''} def generate_password(self, length=25, selected_sets=None, pattern='random', exclude_chars='', include_chars='', min_each_type=1, avoid_ambiguous=False, pronounceable=False): """إنتاج كلمة مرور متقدمة""" if selected_sets is None: selected_sets = ['uppercase', 'lowercase', 'numbers', 'basic_symbols'] charset = '' type_chars = {} for set_name in selected_sets: if set_name in self.character_sets and self.character_sets[set_name]: chars = self.character_sets[set_name] if exclude_chars: chars = ''.join((c for c in chars if c not in exclude_chars)) charset += chars type_chars[set_name] = chars if include_chars: charset += include_chars type_chars['custom'] = include_chars if avoid_ambiguous: ambiguous = '0O1lI|' charset = ''.join((c for c in charset if c not in ambiguous)) for key in type_chars: type_chars[key] = ''.join((c for c in type_chars[key] if c not in ambiguous)) if not charset: return '' if pattern == 'alternating': return self._generate_alternating(length, type_chars) if pattern == 'grouped': return self._generate_grouped(length, type_chars) if pattern == 'start_letter': return self._generate_start_letter(length, type_chars) if pattern == 'end_number': return self._generate_end_number(length, type_chars) if pattern == 'no_consecutive': return self._generate_no_consecutive(length, charset) if pronounceable: return self._generate_pronounceable(length, type_chars) return self._generate_random(length, charset, type_chars, min_each_type) def _generate_random(self, length, charset, type_chars, min_each_type): """إنتاج كلمة مرور عشوائية""" password = [] for char_type, chars in type_chars.items(): if chars and min_each_type > 0: for _ in range(min(min_each_type, length // len(type_chars))): password.append(secrets.choice(chars)) while len(password) < length: password.append(secrets.choice(charset)) random.shuffle(password) return ''.join(password) def _generate_alternating(self, length, type_chars): """إنتاج كلمة مرور متناوبة""" password = [] char_types = list(type_chars.keys()) for i in range(length): char_type = char_types[i % len(char_types)] if type_chars[char_type]: password.append(secrets.choice(type_chars[char_type])) return ''.join(password) def _generate_grouped(self, length, type_chars): """إنتاج كلمة مرور مجمعة""" password = [] group_size = length // len(type_chars) remainder = length % len(type_chars) for i, (char_type, chars) in enumerate(type_chars.items()): if chars: size = group_size + (1 if i < remainder else 0) for _ in range(size): password.append(secrets.choice(chars)) return ''.join(password) def _generate_start_letter(self, length, type_chars): """إنتاج كلمة مرور تبدأ بحرف""" password = [] letters = type_chars.get('uppercase', '') + type_chars.get('lowercase', '') if letters: password.append(secrets.choice(letters)) all_chars = ''.join(type_chars.values()) while len(password) < length: password.append(secrets.choice(all_chars)) return ''.join(password) def _generate_end_number(self, length, type_chars): """إنتاج كلمة مرور تنتهي برقم""" password = [] all_chars = ''.join(type_chars.values()) while len(password) < length - 1: password.append(secrets.choice(all_chars)) numbers = type_chars.get('numbers', '0123456789') if numbers: password.append(secrets.choice(numbers)) else: password.append(secrets.choice(all_chars)) return ''.join(password) def _generate_no_consecutive(self, length, charset): """إنتاج كلمة مرور بدون أحرف متتالية متشابهة""" password = [] for _ in range(length): while True: char = secrets.choice(charset) if not password or char != password[-1]: password.append(char) break return ''.join(password) def _generate_pronounceable(self, length, type_chars): """إنتاج كلمة مرور قابلة للنطق""" vowels = 'aeiou' consonants = 'bcdfghjklmnpqrstvwxyz' password = [] for i in range(length): if i % 2 == 0: password.append(secrets.choice(consonants)) else: password.append(secrets.choice(vowels)) return ''.join(password) class HWIDProtection: """نظام حماية HWID""" def __init__(self): self.hwid = self.get_hwid() def get_hwid(self): """الحصول على HWID فريد للجهاز""" try: mac = ':'.join(['{:02x}'.format(uuid.getnode() >> elements & 255) for elements in range(0, 12, 2)][::-1]) system_info = platform.system() + platform.machine() cpu_info = str(psutil.cpu_count()) combined = f'{mac}-{system_info}-{cpu_info}' hwid = hashlib.sha256(combined.encode()).hexdigest()[:16] return hwid.upper() except: return 'UNKNOWN-HWID' def verify_license(self, license_key): """التحقق من صحة المفتاح""" try: parts = license_key.split('-') if len(parts) != 4: return False encoded_hwid = parts[0] + parts[1] if encoded_hwid != self.hwid[:8]: return False check_sum = parts[2] + parts[3] expected = hashlib.md5((encoded_hwid + 'ATWAN').encode()).hexdigest()[:8].upper() return check_sum == expected except: return False class PasswordAtvanFortexSeparated: """التطبيق الموحد بدون مولد المفاتيح""" def __init__(self): self.root = tk.Tk() self.hwid_protection = HWIDProtection() self.password_generator = AdvancedPasswordGenerator() self.is_licensed = False self.setup_styles() self.setup_ui() self.check_license() def setup_styles(self): """إعداد الأنماط والألوان""" self.root.configure(bg=COLORS['bg_light']) style = ttk.Style() style.theme_use('clam') style.configure('Title.TLabel', background=COLORS['bg_light'], foreground=COLORS['primary'], font=('Arial', 16, 'bold')) style.configure('Accent.TButton', background=COLORS['accent'], foreground=COLORS['text'], font=('Arial', 10, 'bold')) style.configure('Success.TButton', background=COLORS['success'], foreground=COLORS['text_dark'], font=('Arial', 10, 'bold')) style.configure('Warning.TButton', background=COLORS['warning'], foreground=COLORS['text_dark'], font=('Arial', 10, 'bold')) style.configure('Danger.TButton', background=COLORS['danger'], foreground=COLORS['text'], font=('Arial', 10, 'bold')) def setup_ui(self): """إعداد واجهة المستخدم الموحدة""" self.root.title('PASSWORD ATWAN FORTEX - مولد كلمات المرور المتقدم') self.root.geometry('1000x1000') self.root.resizable(True, True) main_container = tk.Frame(self.root, bg=COLORS['bg_light']) main_container.pack(fill=tk.BOTH, expand=True, padx=20, pady=20) header_frame = tk.Frame(main_container, bg=COLORS['primary'], height=80) header_frame.pack(fill=tk.X, pady=(0, 20)) header_frame.pack_propagate(False) title_label = tk.Label(header_frame, text='🔐 PASSWORD ATWAN FORTEX 🔐', bg=COLORS['primary'], fg=COLORS['text'], font=('Arial', 20, 'bold')) title_label.pack(expand=True) subtitle_label = tk.Label(header_frame, text='مولد كلمات المرور المتقدم مع نظام الحماية', bg=COLORS['primary'], fg=COLORS['warning'], font=('Arial', 12)) subtitle_label.pack() notebook = ttk.Notebook(main_container) notebook.pack(fill=tk.BOTH, expand=True) password_frame = tk.Frame(notebook, bg=COLORS['bg_light']) notebook.add(password_frame, text='🔑 مولد كلمات المرور') self.setup_password_tab(password_frame) settings_frame = tk.Frame(notebook, bg=COLORS['bg_light']) notebook.add(settings_frame, text='⚙️ الإعدادات والحماية') self.setup_settings_tab(settings_frame) results_frame = tk.Frame(notebook, bg=COLORS['bg_light']) notebook.add(results_frame, text='📊 النتائج والإحصائيات') self.setup_results_tab(results_frame) self.setup_status_bar(main_container) def setup_password_tab(self, parent): """إعداد تبويب مولد كلمات المرور""" control_frame = tk.Frame(parent, bg=COLORS['bg_light']) control_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) left_frame = tk.Frame(control_frame, bg=COLORS['bg_card'], relief=tk.RAISED, bd=2) left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=(0, 10)) settings_header = tk.Label(left_frame, text='⚙️ إعدادات كلمة المرور', bg=COLORS['accent'], fg=COLORS['text'], font=('Arial', 14, 'bold'), pady=10) settings_header.pack(fill=tk.X) settings_content = tk.Frame(left_frame, bg=COLORS['bg_card']) settings_content.pack(fill=tk.BOTH, expand=True, padx=15, pady=15) length_frame = tk.LabelFrame(settings_content, text='📏 طول كلمة المرور', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold')) length_frame.pack(fill=tk.X, pady=(0, 15)) length_control = tk.Frame(length_frame, bg=COLORS['bg_card']) length_control.pack(fill=tk.X, padx=10, pady=10) tk.Label(length_control, text='الطول:', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 10)).pack(side=tk.LEFT) self.length_var = tk.StringVar(value='25') length_spinbox = ttk.Spinbox(length_control, from_=4, to=1000, width=8, textvariable=self.length_var, font=('Arial', 10)) length_spinbox.pack(side=tk.LEFT, padx=5) tk.Label(length_control, text='(حتى 1000 حرف)', bg=COLORS['bg_card'], fg=COLORS['accent'], font=('Arial', 9)).pack(side=tk.LEFT, padx=5) count_frame = tk.LabelFrame(settings_content, text='🔢 عدد كلمات المرور', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold')) count_frame.pack(fill=tk.X, pady=(0, 15)) count_control = tk.Frame(count_frame, bg=COLORS['bg_card']) count_control.pack(fill=tk.X, padx=10, pady=10) tk.Label(count_control, text='العدد:', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 10)).pack(side=tk.LEFT) self.count_var = tk.StringVar(value='10') count_spinbox = ttk.Spinbox(count_control, from_=1, to=1000, width=8, textvariable=self.count_var, font=('Arial', 10)) count_spinbox.pack(side=tk.LEFT, padx=5) chars_frame = tk.LabelFrame(settings_content, text='🔤 أنواع الأحرف', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold')) chars_frame.pack(fill=tk.X, pady=(0, 15)) chars_content = tk.Frame(chars_frame, bg=COLORS['bg_card']) chars_content.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) self.char_vars = {} char_options = [('uppercase', '🔠 أحرف كبيرة (A-Z)', COLORS['success']), ('lowercase', '🔡 أحرف صغيرة (a-z)', COLORS['success']), ('numbers', '🔢 أرقام (0-9)', COLORS['accent']), ('basic_symbols', '⚡ رموز أساسية (!@#$)', COLORS['warning']), ('extended_symbols', '🎯 رموز موسعة', COLORS['warning']), ('currency', '💰 رموز عملة ($€£)', COLORS['danger']), ('spaces', '⬜ مسافات', COLORS['secondary']), ('brackets', '📐 أقواس ()[]{}<>', COLORS['accent'])] for i, (key, text, color) in enumerate(char_options): default_value = key in ['uppercase', 'lowercase', 'numbers', 'basic_symbols'] self.char_vars[key] = tk.BooleanVar(value=default_value) cb_frame = tk.Frame(chars_content, bg=color, relief=tk.RAISED, bd=1) cb_frame.grid(row=i // 2, column=i % 2, sticky=tk.W + tk.E, padx=2, pady=2) cb = tk.Checkbutton(cb_frame, text=text, variable=self.char_vars[key], bg=color, fg=COLORS['text'] if color != COLORS['warning'] else COLORS['text_dark'], font=('Arial', 9), selectcolor=color) cb.pack(padx=5, pady=3) chars_content.columnconfigure(0, weight=1) chars_content.columnconfigure(1, weight=1) pattern_frame = tk.LabelFrame(settings_content, text='🎨 نمط كلمة المرور', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold')) pattern_frame.pack(fill=tk.X, pady=(0, 15)) pattern_content = tk.Frame(pattern_frame, bg=COLORS['bg_card']) pattern_content.pack(fill=tk.X, padx=10, pady=10) self.pattern_var = tk.StringVar(value='random') patterns = [('random', '🎲 عشوائي تماماً'), ('alternating', '🔄 تناوب بين الأنواع'), ('start_letter', '📝 البدء بحرف'), ('no_consecutive', '🚫 منع التكرار المتتالي')] for value, text in patterns: rb = tk.Radiobutton(pattern_content, text=text, variable=self.pattern_var, value=value, bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 9), selectcolor=COLORS['accent']) rb.pack(anchor=tk.W, pady=1) buttons_frame = tk.Frame(settings_content, bg=COLORS['bg_card']) buttons_frame.pack(fill=tk.X, pady=15) self.generate_button = tk.Button(buttons_frame, text='🚀 إنتاج كلمات المرور', command=self.generate_passwords, bg=COLORS['success'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold'), pady=8) self.generate_button.pack(fill=tk.X, pady=2) clear_button = tk.Button(buttons_frame, text='🗑️ مسح النتائج', command=self.clear_results, bg=COLORS['warning'], fg=COLORS['text_dark'], font=('Arial', 10), pady=5) clear_button.pack(fill=tk.X, pady=2) save_button = tk.Button(buttons_frame, text='💾 حفظ النتائج', command=self.save_results, bg=COLORS['accent'], fg=COLORS['text'], font=('Arial', 10), pady=5) save_button.pack(fill=tk.X, pady=2) right_frame = tk.Frame(control_frame, bg=COLORS['bg_card'], relief=tk.RAISED, bd=2) right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) preview_header = tk.Label(right_frame, text='👁️ معاينة سريعة', bg=COLORS['secondary'], fg=COLORS['text'], font=('Arial', 14, 'bold'), pady=10) preview_header.pack(fill=tk.X) preview_content = tk.Frame(right_frame, bg=COLORS['bg_card']) preview_content.pack(fill=tk.BOTH, expand=True, padx=15, pady=15) self.preview_text = scrolledtext.ScrolledText(preview_content, height=15, width=40, font=('Courier', 10), bg=COLORS['primary'], fg=COLORS['text'], insertbackground=COLORS['text']) self.preview_text.pack(fill=tk.BOTH, expand=True) preview_button = tk.Button(preview_content, text='🔍 معاينة سريعة', command=self.quick_preview, bg=COLORS['accent'], fg=COLORS['text'], font=('Arial', 10, 'bold'), pady=5) preview_button.pack(fill=tk.X, pady=(10, 0)) def setup_settings_tab(self, parent): """إعداد تبويب الإعدادات والحماية""" main_frame = tk.Frame(parent, bg=COLORS['bg_light']) main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20) system_frame = tk.LabelFrame(main_frame, text='💻 معلومات النظام', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')) system_frame.pack(fill=tk.X, pady=(0, 20)) system_content = tk.Frame(system_frame, bg=COLORS['bg_card']) system_content.pack(fill=tk.X, padx=20, pady=15) hwid_display_frame = tk.Frame(system_content, bg=COLORS['primary'], relief=tk.RAISED, bd=2) hwid_display_frame.pack(fill=tk.X, pady=(0, 10)) tk.Label(hwid_display_frame, text='🆔 HWID الحالي:', bg=COLORS['primary'], fg=COLORS['text'], font=('Arial', 11, 'bold')).pack(anchor=tk.W, padx=10, pady=(10, 5)) hwid_text = tk.Label(hwid_display_frame, text=self.hwid_protection.hwid, bg=COLORS['primary'], fg=COLORS['warning'], font=('Courier', 12, 'bold')) hwid_text.pack(anchor=tk.W, padx=10, pady=(0, 10)) hwid_buttons = tk.Frame(system_content, bg=COLORS['bg_card']) hwid_buttons.pack(fill=tk.X, pady=5) copy_hwid_button = tk.Button(hwid_buttons, text='📋 نسخ HWID', command=self.copy_hwid, bg=COLORS['accent'], fg=COLORS['text'], font=('Arial', 10, 'bold')) copy_hwid_button.pack(side=tk.LEFT, padx=(0, 10)) note_frame = tk.Frame(system_content, bg=COLORS['warning'], relief=tk.RAISED, bd=2) note_frame.pack(fill=tk.X, pady=10) note_label = tk.Label(note_frame, text='💡 لإنتاج مفتاح التفعيل، استخدم مولد المفاتيح المنفصل (key_generator.py)', bg=COLORS['warning'], fg=COLORS['text_dark'], font=('Arial', 10, 'bold'), pady=10, wraplength=600) note_label.pack() license_frame = tk.LabelFrame(main_frame, text='🔐 حالة التفعيل', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')) license_frame.pack(fill=tk.X, pady=(0, 20)) license_content = tk.Frame(license_frame, bg=COLORS['bg_card']) license_content.pack(fill=tk.X, padx=20, pady=15) self.license_status_frame = tk.Frame(license_content, bg=COLORS['danger'], relief=tk.RAISED, bd=2) self.license_status_frame.pack(fill=tk.X, pady=(0, 15)) self.license_status_label = tk.Label(self.license_status_frame, text='❌ نسخة تجريبية', bg=COLORS['danger'], fg=COLORS['text'], font=('Arial', 12, 'bold'), pady=10) self.license_status_label.pack() activation_frame = tk.Frame(license_content, bg=COLORS['bg_card']) activation_frame.pack(fill=tk.X, pady=(0, 10)) tk.Label(activation_frame, text='أدخل مفتاح التفعيل:', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 11)).pack(anchor=tk.W, pady=(0, 5)) self.license_key_var = tk.StringVar() license_entry = tk.Entry(activation_frame, textvariable=self.license_key_var, font=('Courier', 11), width=50, bg=COLORS['primary'], fg=COLORS['text'], insertbackground=COLORS['text']) license_entry.pack(fill=tk.X, pady=(0, 10)) activate_button = tk.Button(activation_frame, text='✅ تفعيل البرنامج', command=self.activate_license, bg=COLORS['success'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold'), pady=8) activate_button.pack(fill=tk.X) app_settings_frame = tk.LabelFrame(main_frame, text='⚙️ إعدادات التطبيق', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')) app_settings_frame.pack(fill=tk.BOTH, expand=True) app_settings_content = tk.Frame(app_settings_frame, bg=COLORS['bg_card']) app_settings_content.pack(fill=tk.BOTH, expand=True, padx=20, pady=15) settings_buttons = tk.Frame(app_settings_content, bg=COLORS['bg_card']) settings_buttons.pack(fill=tk.X, pady=(0, 15)) save_settings_button = tk.Button(settings_buttons, text='💾 حفظ الإعدادات', command=self.save_settings, bg=COLORS['accent'], fg=COLORS['text'], font=('Arial', 10, 'bold')) save_settings_button.pack(side=tk.LEFT, padx=(0, 10)) load_settings_button = tk.Button(settings_buttons, text='📂 تحميل الإعدادات', command=self.load_settings, bg=COLORS['warning'], fg=COLORS['text_dark'], font=('Arial', 10, 'bold')) load_settings_button.pack(side=tk.LEFT) info_text = tk.Text(app_settings_content, height=6, width=70, font=('Arial', 10), bg=COLORS['primary'], fg=COLORS['text'], state=tk.DISABLED) info_text.pack(fill=tk.BOTH, expand=True) info_content = '\n💡 نصائح الاستخدام:\n• استخدم النسخة المُفعلة للحصول على خيارات غير محدودة\n• احفظ إعداداتك المفضلة لإعادة الاستخدام السريع\n• استخدم أنماط مختلفة لكلمات المرور حسب احتياجاتك\n• لإنتاج مفاتيح التفعيل، استخدم key_generator.py المنفصل\n ' info_text.config(state=tk.NORMAL) info_text.insert(tk.END, info_content) info_text.config(state=tk.DISABLED) def setup_results_tab(self, parent): """إعداد تبويب النتائج والإحصائيات""" main_frame = tk.Frame(parent, bg=COLORS['bg_light']) main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20) progress_frame = tk.Frame(main_frame, bg=COLORS['bg_card'], relief=tk.RAISED, bd=2) progress_frame.pack(fill=tk.X, pady=(0, 20)) progress_content = tk.Frame(progress_frame, bg=COLORS['bg_card']) progress_content.pack(fill=tk.X, padx=20, pady=15) tk.Label(progress_content, text='📊 تقدم العملية', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')).pack(anchor=tk.W, pady=(0, 10)) self.progress = ttk.Progressbar(progress_content, mode='determinate', length=400) self.progress.pack(fill=tk.X) results_frame = tk.LabelFrame(main_frame, text='🔑 كلمات المرور المُنتجة', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')) results_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 20)) results_content = tk.Frame(results_frame, bg=COLORS['bg_card']) results_content.pack(fill=tk.BOTH, expand=True, padx=15, pady=15) self.results_text = scrolledtext.ScrolledText(results_content, height=20, width=80, font=('Courier', 10), bg=COLORS['primary'], fg=COLORS['text'], insertbackground=COLORS['text']) self.results_text.pack(fill=tk.BOTH, expand=True) stats_frame = tk.LabelFrame(main_frame, text='📈 الإحصائيات', bg=COLORS['bg_card'], fg=COLORS['text_dark'], font=('Arial', 12, 'bold')) stats_frame.pack(fill=tk.X) stats_content = tk.Frame(stats_frame, bg=COLORS['success']) stats_content.pack(fill=tk.X, padx=15, pady=15) self.stats_label = tk.Label(stats_content, text='لم يتم إنتاج كلمات مرور بعد', bg=COLORS['success'], fg=COLORS['text_dark'], font=('Arial', 11, 'bold'), pady=10) self.stats_label.pack() def setup_status_bar(self, parent): """إعداد شريط الحالة""" status_frame = tk.Frame(parent, bg=COLORS['secondary'], height=30) status_frame.pack(fill=tk.X, side=tk.BOTTOM) status_frame.pack_propagate(False) self.status_label = tk.Label(status_frame, text='🟢 جاهز للاستخدام', bg=COLORS['secondary'], fg=COLORS['text'], font=('Arial', 10)) self.status_label.pack(side=tk.LEFT, padx=10, pady=5) version_label = tk.Label(status_frame, text='v2.1 - النسخة المنفصلة', bg=COLORS['secondary'], fg=COLORS['warning'], font=('Arial', 9)) version_label.pack(side=tk.RIGHT, padx=10, pady=5) def quick_preview(self): """معاينة سريعة لكلمة مرور واحدة""" try: length = min(int(self.length_var.get()), 50 if not self.is_licensed else 1000) selected_sets = [key for key, var in self.char_vars.items() if var.get()] if not selected_sets: self.preview_text.delete(1.0, tk.END) self.preview_text.insert(tk.END, '❌ يجب اختيار نوع واحد على الأقل من الأحرف!') return password = self.password_generator.generate_password(length=length, selected_sets=selected_sets, pattern=self.pattern_var.get()) self.preview_text.delete(1.0, tk.END) self.preview_text.insert(tk.END, '🔍 معاينة سريعة:\n') self.preview_text.insert(tk.END, f"{'========================================'}\n") self.preview_text.insert(tk.END, f'الطول: {len(password)} حرف\n') self.preview_text.insert(tk.END, f'النمط: {self.pattern_var.get()}\n') self.preview_text.insert(tk.END, f"{'========================================'}\n\n") self.preview_text.insert(tk.END, f'🔑 {password}\n\n') strength = self.analyze_password_strength(password) self.preview_text.insert(tk.END, f'💪 قوة كلمة المرور: {strength}\n') except Exception as e: self.preview_text.delete(1.0, tk.END) self.preview_text.insert(tk.END, f'❌ خطأ: {str(e)}') def generate_passwords(self): """إنتاج كلمات المرور""" if not self.is_licensed: max_count = 5 max_length = 50 else: max_count = int(self.count_var.get()) max_length = int(self.length_var.get()) try: length = min(int(self.length_var.get()), max_length) count = min(int(self.count_var.get()), max_count) if length < 1: messagebox.showerror('خطأ', 'طول كلمة المرور يجب أن يكون أكبر من 0!') return selected_sets = [key for key, var in self.char_vars.items() if var.get()] if not selected_sets: messagebox.showerror('خطأ', 'يجب اختيار نوع واحد على الأقل من الأحرف!') return self.generate_button.config(state=tk.DISABLED) self.status_label.config(text='🔄 جاري إنتاج كلمات المرور...') self.results_text.delete(1.0, tk.END) passwords = [] for i in range(count): password = self.password_generator.generate_password(length=length, selected_sets=selected_sets, pattern=self.pattern_var.get()) passwords.append(password) self.results_text.insert(tk.END, f'{i + 1:3d}. {password}\n') self.results_text.see(tk.END) self.progress['value'] = (i + 1) * 100 / count self.root.update() time.sleep(0.05) self.update_statistics(passwords) self.status_label.config(text='✅ تم إنتاج كلمات المرور بنجاح') if not self.is_licensed: messagebox.showinfo('نسخة تجريبية', f'النسخة التجريبية محدودة بـ {max_count} كلمات مرور وطول أقصى {max_length} حرف.\nللحصول على الإصدار الكامل، يرجى التفعيل.') except ValueError: messagebox.showerror('خطأ', 'يرجى إدخال قيم صحيحة!') except Exception as e: messagebox.showerror('خطأ', f'حدث خطأ: {str(e)}') finally: pass self.generate_button.config(state=tk.NORMAL) self.progress['value'] = 0 self.generate_button.config(state=tk.NORMAL) self.progress['value'] = 0 self.generate_button.config(state=tk.NORMAL) self.progress['value'] = 0 def copy_hwid(self): """نسخ HWID الحالي""" try: self.root.clipboard_clear() self.root.clipboard_append(self.hwid_protection.hwid) self.status_label.config(text='📋 تم نسخ HWID إلى الحافظة') messagebox.showinfo('تم', 'تم نسخ HWID إلى الحافظة!') except Exception as e: messagebox.showerror('خطأ', f'فشل في نسخ HWID: {str(e)}') def activate_license(self): """تفعيل الترخيص""" license_key = self.license_key_var.get().strip() if not license_key: messagebox.showerror('خطأ', 'يرجى إدخال مفتاح التفعيل!') return if self.hwid_protection.verify_license(license_key): try: with open('license.dat', 'w') as f: f.write(license_key) self.is_licensed = True self.license_status_frame.config(bg=COLORS['success']) self.license_status_label.config(text='✅ مُفعل بنجاح', bg=COLORS['success'], fg=COLORS['text_dark']) self.status_label.config(text='✅ تم تفعيل البرنامج بنجاح') messagebox.showinfo('نجح التفعيل', '🎉 تم تفعيل البرنامج بنجاح!\nيمكنك الآن الاستفادة من جميع المميزات.') except Exception as e: messagebox.showerror('خطأ', f'فشل في حفظ الترخيص: {str(e)}') else: messagebox.showerror('خطأ', '❌ مفتاح التفعيل غير صحيح!') def check_license(self): """فحص حالة الترخيص""" try: if os.path.exists('license.dat'): with open('license.dat', 'r') as f: license_key = f.read().strip() if self.hwid_protection.verify_license(license_key): self.is_licensed = True self.license_status_frame.config(bg=COLORS['success']) self.license_status_label.config(text='✅ مُفعل', bg=COLORS['success'], fg=COLORS['text_dark']) return except: pass self.license_status_frame.config(bg=COLORS['danger']) self.license_status_label.config(text='❌ نسخة تجريبية', bg=COLORS['danger'], fg=COLORS['text']) def analyze_password_strength(self, password): """تحليل قوة كلمة المرور""" score = 0 if len(password) >= 8: score += 1 if len(password) >= 12: score += 1 if len(password) >= 16: score += 1 if any((c.isupper() for c in password)): score += 1 if any((c.islower() for c in password)): score += 1 if any((c.isdigit() for c in password)): score += 1 if any((c in '!@#$%^&*()_+-=[]{}|;:,.<>?' for c in password)): score += 1 if score <= 3: return 'ضعيفة 🔴' if score <= 5: return 'متوسطة 🟡' if score <= 6: return 'قوية 🟢' return 'قوية جداً 🟢🟢' def update_statistics(self, passwords): """تحديث الإحصائيات""" if not passwords: return total = len(passwords) avg_length = sum((len(p) for p in passwords)) / total strong_count = 0 for password in passwords: strength = self.analyze_password_strength(password) if 'قوية' in strength: strong_count += 1 stats_text = f'📊 العدد: {total} | 📏 متوسط الطول: {avg_length:.1f} | 💪 قوية: {strong_count}/{total} | 🎯 النجاح: {strong_count / total * 100:.1f}%' self.stats_label.config(text=stats_text) def clear_results(self): """مسح النتائج""" self.results_text.delete(1.0, tk.END) self.stats_label.config(text='لم يتم إنتاج كلمات مرور بعد') self.status_label.config(text='🗑️ تم مسح النتائج') def save_results(self): """حفظ النتائج""" content = self.results_text.get(1.0, tk.END).strip() if not content: messagebox.showwarning('تحذير', 'لا توجد نتائج لحفظها!') return filename = filedialog.asksaveasfilename(defaultextension='.txt', filetypes=[('Text files', '*.txt'), ('All files', '*.*')]) if filename: try: with open(filename, 'w', encoding='utf-8') as f: f.write('🔐 PASSWORD ATWAN FORTEX - النتائج\n') f.write('============================================================\n\n') f.write(content) f.write(f"\n\n📅 تم الإنتاج في: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") f.write('💻 تم الإنتاج بواسطة: PASSWORD ATWAN FORTEX - النسخة المنفصلة\n') self.status_label.config(text='💾 تم حفظ النتائج بنجاح') messagebox.showinfo('تم', 'تم حفظ النتائج بنجاح!') except Exception as e: messagebox.showerror('خطأ', f'فشل في حفظ الملف: {str(e)}') def save_settings(self): """حفظ الإعدادات""" settings = {'length': self.length_var.get(), 'count': self.count_var.get(), 'pattern': self.pattern_var.get(), 'char_vars': {key: var.get() for key, var in self.char_vars.items()}} try: with open('settings.json', 'w', encoding='utf-8') as f: json.dump(settings, f, ensure_ascii=False, indent=2) self.status_label.config(text='💾 تم حفظ الإعدادات') messagebox.showinfo('تم', 'تم حفظ الإعدادات بنجاح!') except Exception as e: messagebox.showerror('خطأ', f'فشل في حفظ الإعدادات: {str(e)}') def load_settings(self): """تحميل الإعدادات""" try: with open('settings.json', 'r', encoding='utf-8') as f: settings = json.load(f) self.length_var.set(settings.get('length', '25')) self.count_var.set(settings.get('count', '10')) self.pattern_var.set(settings.get('pattern', 'random')) char_settings = settings.get('char_vars', {}) for key, var in self.char_vars.items(): var.set(char_settings.get(key, False)) self.status_label.config(text='📂 تم تحميل الإعدادات') messagebox.showinfo('تم', 'تم تحميل الإعدادات بنجاح!') except FileNotFoundError: messagebox.showwarning('تحذير', 'لم يتم العثور على ملف الإعدادات!') except Exception as e: messagebox.showerror('خطأ', f'فشل في تحميل الإعدادات: {str(e)}') def run(self): """تشغيل التطبيق""" self.root.mainloop() if __name__ == '__main__': app = PasswordAtvanFortexSeparated() app.run()