v3.0.5: Anmelde-Nachweis für die Admin-Prüfung geteilt anfordern, Ergebnis von act prüfen, Zwischenspeicher als Notlösung

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-10-26 20:34:31 +01:00
co-authored by Claude Opus 5.5
parent d1f5f5add3
commit 072b19d227
2 changed files with 16 additions and 7 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ SOURCES := source
INCLUDES := source INCLUDES := source
# Bei jedem Release erhöhen - das Auto-Update vergleicht diese Nummer # Bei jedem Release erhöhen - das Auto-Update vergleicht diese Nummer
VERSION := 3.0.4 VERSION := 3.0.5
APP_TITLE := MBMNET APP_TITLE := MBMNET
APP_DESCRIPTION := Dein eigenes 3DS-Netzwerk APP_DESCRIPTION := Dein eigenes 3DS-Netzwerk
+15 -6
View File
@@ -23,20 +23,29 @@ static char why[96] = "Werkzeuge: kein MBMNET-Konto angemeldet."; // warum (no
static void worker(void *arg) static void worker(void *arg)
{ {
(void)arg; (void)arg;
// 1. Anmelde-Nachweis vom Konto-Dienst (für das gerade angemeldete Konto) // 1. Anmelde-Nachweis vom Konto-Dienst (für das gerade angemeldete Konto). "shared": danach für jeden
// Prozess abholbar - nur für diesen Prozess angefordert, gab act ihn nicht heraus (E0A14CCE).
Handle done; Handle done;
snprintf(why, sizeof(why), "Werkzeuge: Server prüft noch ..."); snprintf(why, sizeof(why), "Werkzeuge: Server prüft noch ...");
if (R_FAILED(svcCreateEvent(&done, RESET_ONESHOT))) return; if (R_FAILED(svcCreateEvent(&done, RESET_ONESHOT))) return;
u32 pid = 0; u32 pid = 0;
svcGetProcessId(&pid, CUR_PROCESS_HANDLE); svcGetProcessId(&pid, CUR_PROCESS_HANDLE);
Result rc = ACT_AcquireIndependentServiceToken(0xFE, CLIENT_ID, 0, false, false, pid, done); Result rc = ACT_AcquireIndependentServiceToken(0xFE, CLIENT_ID, 0, false, true, pid, done);
if (R_SUCCEEDED(rc)) rc = svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000); Result wait = R_SUCCEEDED(rc) ? svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000) : rc;
svcCloseHandle(done); svcCloseHandle(done);
if (rc != 0) { snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis nicht erhalten (%08lX).", (unsigned long)rc); return; } if (wait != 0) { snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis nicht erhalten (%08lX).", (unsigned long)wait); return; }
// Ergebnis der Anfrage beim Account-Server (z. B. abgelehnt oder keine Verbindung)
Result result = ACT_GetLastResponseResult();
static IndependentServiceTokenV1 tok; static IndependentServiceTokenV1 tok;
memset(&tok, 0, sizeof(tok)); memset(&tok, 0, sizeof(tok));
if (R_FAILED(rc = ACT_GetIndependentServiceToken(&tok)) || !tok.token[0]) { rc = ACT_GetIndependentServiceToken(&tok);
snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis leer (%08lX).", (unsigned long)rc); // Notlösung: aus dem Zwischenspeicher von act (gerade eben geholt)
if (R_FAILED(rc) || !tok.token[0]) rc = ACT_GetCachedIndependentServiceToken(&tok, 0xFE, CLIENT_ID, 3600, false, true);
if (R_FAILED(rc) || !tok.token[0]) {
Result shown = R_FAILED(result) ? result : rc;
Result code = ACT_ResultToErrorCode(shown); // 022-XXXX wie in den Einstellungen
snprintf(why, sizeof(why), "Werkzeuge: kein Anmelde-Nachweis vom Server\n(%08lX, Fehler %03lu-%04lu).",
(unsigned long)shown, (unsigned long)(code / 10000), (unsigned long)(code % 10000));
return; return;
} }