v3.0.0: Umschalten wartet nicht mehr aufs Auffrischen (abbrechbar, CA-Abruf zuletzt), schnellere Prüfintervalle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
c384c20558
commit
f5fc0861c7
+37
-12
@@ -64,26 +64,51 @@ static u32 read_cached(u8 *der)
|
||||
return n > 0 && n <= CA_MAX ? n : 0;
|
||||
}
|
||||
|
||||
bool olvpatch_fetch_ca(const char *server, u8 *der, u32 *derLen, bool fresh)
|
||||
// Erst in eine Hilfsdatei schreiben, dann umbenennen: Wird die App mittendrin beendet, bleibt die alte Datei heil
|
||||
static bool write_atomic(const char *path, const u8 *data, u32 n)
|
||||
{
|
||||
if (!fresh && (*derLen = read_cached(der))) return true;
|
||||
static u8 pem[2048];
|
||||
u32 n = fetch(server, "/olv/ca.der", der, CA_MAX + 1);
|
||||
if (n == 0 || n > CA_MAX) return !fresh ? false : (*derLen = read_cached(der)) != 0;
|
||||
char tmp[96];
|
||||
snprintf(tmp, sizeof(tmp), "%s.neu", path);
|
||||
FILE *f = fopen(tmp, "wb");
|
||||
bool ok = f && fwrite(data, 1, n, f) == n;
|
||||
if (f) fclose(f);
|
||||
if (ok) { remove(path); ok = rename(tmp, path) == 0; }
|
||||
if (!ok) remove(tmp);
|
||||
return ok;
|
||||
}
|
||||
|
||||
// Holt die CA vom Server in den Zwischenspeicher. *changed: anders als vorher.
|
||||
bool olvpatch_refresh_ca(const char *server, bool *changed)
|
||||
{
|
||||
static u8 der[CA_MAX + 1], old[CA_MAX + 1], pem[2048];
|
||||
*changed = false;
|
||||
u32 n = fetch(server, "/olv/ca.der", der, sizeof(der));
|
||||
if (n == 0 || n > CA_MAX) return false;
|
||||
u32 p = fetch(server, "/olv/ca.pem", pem, sizeof(pem));
|
||||
if (p == 0) return false;
|
||||
// Der Browser der Miiverse-App liest die CA von der SD-Karte
|
||||
FILE *f = fopen(CA_PEM_FILE, "wb");
|
||||
bool ok = f && fwrite(pem, 1, p, f) == p;
|
||||
if (f) fclose(f);
|
||||
u32 oldLen = read_cached(old);
|
||||
if (oldLen == n && memcmp(old, der, n) == 0) return true; // unverändert
|
||||
mkdir("sdmc:/3ds/mbmnet", 0777);
|
||||
mkdir("sdmc:/3ds/mbmnet/cache", 0777);
|
||||
f = fopen(CA_DER_CACHE, "wb");
|
||||
if (f) { fwrite(der, 1, n, f); fclose(f); }
|
||||
*derLen = n;
|
||||
// Der Browser der Miiverse-App liest die CA (PEM) von der SD-Karte
|
||||
bool ok = write_atomic(CA_PEM_FILE, pem, p) && write_atomic(CA_DER_CACHE, der, n);
|
||||
*changed = ok;
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool olvpatch_fetch_ca(const char *server, u8 *der, u32 *derLen)
|
||||
{
|
||||
if ((*derLen = read_cached(der))) return true;
|
||||
bool changed;
|
||||
return olvpatch_refresh_ca(server, &changed) && (*derLen = read_cached(der)) != 0;
|
||||
}
|
||||
|
||||
bool olvpatch_ca_cached(void)
|
||||
{
|
||||
static u8 der[CA_MAX + 1];
|
||||
return read_cached(der) != 0;
|
||||
}
|
||||
|
||||
bool olvpatch_supported(const u8 *code, u32 size)
|
||||
{
|
||||
u32 off = DISCOVERY_ADDR - CODE_BASE;
|
||||
|
||||
Reference in New Issue
Block a user