v3.0.6: Admin-Prüfung im Auffrischen nach dem Konto-Abgleich, Wiederholung bei ungültigem Zustand

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-10-26 20:37:39 +01:00
co-authored by Claude Opus 5.5
parent 072b19d227
commit f7590a939e
4 changed files with 35 additions and 27 deletions
+25 -22
View File
@@ -16,13 +16,15 @@
static char CLIENT_ID[] = "87cd32617f1985439ea608c2746e4610";
static volatile bool isAdmin;
static Thread thread;
static char server[64];
static char why[96] = "Werkzeuge: kein MBMNET-Konto angemeldet."; // warum (noch) keine Werkzeuge
static Result lastAct; // letzter Fehler von act (für die Wiederholung)
static bool wanted; // MBMNET-Konto angemeldet: prüfen
static void worker(void *arg)
// Holt den Nachweis und lässt ihn prüfen. Läuft im Auffrischen-Thread (main.c) direkt nach dem Konto-Abgleich:
// act bearbeitet nur eine Server-Anfrage auf einmal, gleichzeitig gab es "ungültiger Zustand" (C8A14F4B).
static void check_once(void)
{
(void)arg;
// 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;
@@ -33,7 +35,8 @@ static void worker(void *arg)
Result rc = ACT_AcquireIndependentServiceToken(0xFE, CLIENT_ID, 0, false, true, pid, done);
Result wait = R_SUCCEEDED(rc) ? svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000) : rc;
svcCloseHandle(done);
if (wait != 0) { snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis nicht erhalten (%08lX).", (unsigned long)wait); return; }
lastAct = 0;
if (wait != 0) { lastAct = wait; 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;
@@ -42,10 +45,8 @@ static void worker(void *arg)
// 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));
lastAct = R_FAILED(result) ? result : rc;
snprintf(why, sizeof(why), "Werkzeuge: kein Anmelde-Nachweis vom Server (%08lX).", (unsigned long)lastAct);
return;
}
@@ -64,25 +65,27 @@ static void worker(void *arg)
const char *admin_why(void) { return why; }
void admin_start(const char *srv, bool mbmnetLoggedIn)
void admin_prepare(const char *srv, bool mbmnetLoggedIn)
{
isAdmin = false;
snprintf(why, sizeof(why), "Werkzeuge: nur bei aktivem MBMNET mit angemeldetem Admin-Konto.");
wanted = mbmnetLoggedIn;
snprintf(why, sizeof(why), mbmnetLoggedIn ? "Werkzeuge: Server prüft noch ..."
: "Werkzeuge: nur bei aktivem MBMNET mit angemeldetem Admin-Konto.");
remove(OLD_CACHE_FILE);
if (!mbmnetLoggedIn) return;
snprintf(server, sizeof(server), "%s", srv);
s32 prio = 0x30;
svcGetThreadPriority(&prio, CUR_THREAD_HANDLE);
thread = threadCreate(worker, NULL, 16 * 1024, prio + 1, -2, false);
}
void admin_check(void)
{
if (!wanted) return;
// act noch mit etwas anderem beschäftigt ("ungültiger Zustand"): kurz warten und noch einmal
for (int attempt = 0; attempt < 4; attempt++) {
check_once();
if (isAdmin || !lastAct || ((lastAct >> 21) & 0x3F) != 5) break; // 5 = InvalidState
svcSleepThread(1000ULL * 1000 * 1000);
}
}
bool admin_is(void) { return isAdmin; }
bool admin_finish(void)
{
if (!thread) return true;
if (R_FAILED(threadJoin(thread, 100ULL * 1000 * 1000))) return false; // läuft noch
threadFree(thread);
thread = NULL;
return true;
}
bool admin_finish(void) { return true; } // kein eigener Thread mehr (läuft im Auffrischen)