v3.1.6: Admin-Freischaltung per Geräte-Schlüssel und Code (ohne Konto-Dienst), Y löst gezielt den MBMNET-Platz

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-10-26 21:31:47 +01:00
co-authored by Claude Opus 5.5
parent 39ed683c95
commit 7d49f1f342
4 changed files with 126 additions and 117 deletions
+26 -9
View File
@@ -351,8 +351,6 @@ static void maintenance_worker(void *arg)
char ignore[96];
// 1. Patches auffrischen (Miiverse-CA aus dem Zwischenspeicher; nur beim allerersten Mal vom Server)
bool hadCa = olvpatch_ca_cached();
// 0. Admin? Zuerst, damit die Werkzeuge nicht vom Rest abhängen (act ist hier noch frei)
if (!switchRequested) admin_check();
patch_progress = maint_step;
maint_step("Patches");
refresh_patches();
@@ -559,17 +557,28 @@ static bool run(int action, char *msg, size_t msglen)
case BTN_DISABLE: return disable(confirmed, msg, msglen);
case BTN_DIAG: patch_diagnose(msg, msglen); return false;
case BTN_UNLINK: {
// Verknüpfte NNID nur auf dem 3DS lösen (ohne Server) - z. B. wenn das Konto gelöscht wurde
// Verknüpfte ID nur auf dem 3DS lösen (ohne Server). Bei aktivem MBMNET gezielt den MBMNET-Platz -
// nicht den, auf dem act gerade steht (der war nach einem Soft-Reboot manchmal noch der Pretendo-Platz).
char id[20];
if (!nnid_linked(id, sizeof(id))) { snprintf(msg, msglen, "Hier ist keine ID verknüpft."); return false; }
bool mbmnet = patch_state() == STATE_MBMNET && frdswitch_current() == FRIEND_ACCOUNT_MBMNET;
u8 slot = mbmnet ? frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET) : 0;
bool linked = slot ? frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id)) : nnid_linked(id, sizeof(id));
if (!linked) { snprintf(msg, msglen, "Hier ist keine ID verknüpft."); return false; }
if (!confirmed) {
armed = BTN_UNLINK;
snprintf(msg, msglen, "\"%s\" vom 3DS lösen?\nNur auf dem 3DS, das Konto selbst bleibt unberührt.\n"
"Zum Bestätigen nochmal Y drücken.", id);
snprintf(msg, msglen, "\"%s\"%s vom 3DS lösen?\nNur auf dem 3DS, das Konto selbst bleibt unberührt.\n"
"Zum Bestätigen nochmal Y drücken.", id, slot ? " (MBMNET-Platz)" : "");
return false;
}
if (!nnid_unlink(msg, msglen)) return false;
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach kannst du eine andere ID verknüpfen.", id);
if (slot ? !nnid_unlink_slot(slot, msg, msglen) : !nnid_unlink(msg, msglen)) return false;
if (slot) {
char hint[160];
remember_mbmnet_id(id);
link_hint(hint, sizeof(hint));
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach neu verknüpfen:\n%s", id, hint);
} else {
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach kannst du eine andere ID verknüpfen.", id);
}
return true;
}
case BTN_FTP:
@@ -656,6 +665,7 @@ int main(int argc, char **argv)
u8 mslot = frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET);
admin_prepare(server, st == STATE_MBMNET && frdswitch_current() == FRIEND_ACCOUNT_MBMNET && mslot
&& frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, mid, sizeof(mid)), mslot);
admin_check_async(); // Freigabe der Konsole beim Server erfragen (Hintergrund)
}
// Ein SpotPass-Test von früher (App mitten im Test verlassen) darf nicht weiterlaufen
spotpass_test_cancel();
@@ -685,6 +695,7 @@ int main(int argc, char **argv)
int selected = st == STATE_MBMNET ? BTN_DISABLE : BTN_ENABLE;
bool toolsToggled = false;
bool showWhy = false; // Meldung zur Freischaltung der Werkzeuge anzeigen (nach SELECT)
int queued = -1; // Aktion, die nach dem nächsten Bild läuft (damit sofort etwas passiert)
while (aptMainLoop()) {
@@ -699,7 +710,13 @@ int main(int argc, char **argv)
}
bool wasTools = toolsToggled;
if (down & KEY_SELECT && admin_is()) toolsToggled = !toolsToggled;
else if (down & KEY_SELECT) snprintf(msg, sizeof(msg), "%s\n(Auffrischen: %s)", admin_why(), maintStep);
else if (down & KEY_SELECT) {
admin_check_async(); // nach dem Freischalten auf der Webseite: gleich nochmal fragen
showWhy = true;
}
// Stand der Freischaltung live anzeigen, bis etwas anderes passiert
if (showWhy && (admin_is() || down & (KEY_A | KEY_B | KEY_Y | KEY_TOUCH))) { showWhy = false; if (admin_is()) msg[0] = 0; }
if (showWhy) snprintf(msg, sizeof(msg), "%s", admin_why());
if (down & KEY_B && toolsToggled) toolsToggled = false;
if (!admin_is()) toolsToggled = false; // Werkzeuge nur für Admins (Server hat es bestätigt)
// Werkzeuge nur mit SELECT, beim Öffnen immer aus