T.ME/BIBIL_0DAY
CasperSecurity


Server : Apache/2
System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64
User : gositeme ( 1004)
PHP Version : 8.2.29
Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname
Directory :  /home/gositeme/domains/lavocat.ca/private_html/src/pages/admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.ca/private_html/src/pages/admin/options.tsx
import { useState } from 'react';
import LayoutWithSidebar from '@/components/LayoutWithSidebar';

const AdminOptions = () => {
  const [backupStatus, setBackupStatus] = useState('');
  const [restoreStatus, setRestoreStatus] = useState('');
  const [restoreFile, setRestoreFile] = useState<File | null>(null);

  const handleBackup = async () => {
    setBackupStatus('Backing up...');
    try {
      const res = await fetch('/api/admin/backup');
      if (!res.ok) throw new Error('Backup failed');
      const blob = await res.blob();
      const url = window.URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = 'backup.zip';
      a.click();
      setBackupStatus('Backup complete!');
    } catch (err) {
      setBackupStatus('Backup failed.');
    }
  };

  const handleRestore = async () => {
    if (!restoreFile) return;
    setRestoreStatus('Restoring...');
    const formData = new FormData();
    formData.append('file', restoreFile);
    try {
      const res = await fetch('/api/admin/restore', {
        method: 'POST',
        body: formData,
      });
      if (!res.ok) throw new Error('Restore failed');
      setRestoreStatus('Restore complete!');
    } catch (err) {
      setRestoreStatus('Restore failed.');
    }
  };

  return (
    <LayoutWithSidebar>
      <div className="max-w-2xl mx-auto py-12">
        <h1 className="text-3xl font-bold mb-8">Admin Options</h1>
        <div className="bg-white rounded-xl shadow p-6 mb-8">
          <h2 className="text-xl font-semibold mb-4">Backup</h2>
          <button onClick={handleBackup} className="px-6 py-2 bg-primary text-white rounded-lg font-bold">Backup All Data & Files</button>
          {backupStatus && <div className="mt-2 text-sm text-gray-600">{backupStatus}</div>}
        </div>
        <div className="bg-white rounded-xl shadow p-6">
          <h2 className="text-xl font-semibold mb-4">Restore</h2>
          <input type="file" accept=".zip" onChange={e => setRestoreFile(e.target.files?.[0] || null)} className="mb-4" />
          <button onClick={handleRestore} className="px-6 py-2 bg-primary text-white rounded-lg font-bold" disabled={!restoreFile}>Restore from Backup</button>
          {restoreStatus && <div className="mt-2 text-sm text-gray-600">{restoreStatus}</div>}
        </div>
      </div>
    </LayoutWithSidebar>
  );
};

export default AdminOptions; 

CasperSecurity Mini