feat(apk): generateur de mot de passe, erreurs du depot affichees dans les reglages

- de sur le champ mot de passe (nouvelle entree et modification), tirage
  crypto.getRandomValues avec rejet
- Download vault sans reglages ouvre les reglages
- 404/401 tranches (jeton refuse, utilisateur ou depot inexistant, fichier
  absent) et mauvais mot de passe de synchro : les reglages s'ouvrent avec
  le message en rouge

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-18 10:18:47 +01:00
parent 3eb26e23e5
commit ba8c4205f9
3 changed files with 132 additions and 7 deletions
+55
View File
@@ -73,6 +73,12 @@ type
/// n'y ressemble pas est de toute facon inutilisable.
function IsGitea: Boolean;
/// POURQUOI UN 404 OU UN 401, en clair pour l'utilisateur. Gitea repond 404
/// aussi bien pour un fichier absent que pour un depot ou un proprietaire
/// inexistant : deux requetes de plus tranchent - le depot, puis
/// l'utilisateur. Vide si rien de plus precis n'a pu etre etabli.
function Diagnose(AHttpCode: Integer): string;
/// Publie un conteneur. ASha est celui du fichier qu'on a lu : Gitea s'en
/// sert pour refuser (409) une ecriture si quelqu'un d'autre a publie
/// entre-temps. Vide = creation d'un fichier qui n'existait pas.
@@ -99,6 +105,55 @@ begin
Result := FBaseUrl.ToLower.Contains('/api/v1/repos/');
end;
function TSyncClient.Diagnose(AHttpCode: Integer): string;
var
LHttp: THTTPClient;
LApi, LOwner, LRepo: string;
LParts: TArray<string>;
LP: Integer;
function CodeOf(const AUrl: string): Integer;
begin
try
Result := LHttp.Get(AUrl).StatusCode;
except
Result := 0;
end;
end;
begin
Result := '';
if AHttpCode = 401 then
Exit('Token refused - expired, revoked or mistyped');
if (AHttpCode <> 404) or not IsGitea then Exit;
// https://hote/api/v1/repos/OWNER/REPO/contents/FICHIER
LP := Pos('/api/v1/repos/', LowerCase(FBaseUrl));
LApi := Copy(FBaseUrl, 1, LP + Length('/api/v1/') - 1);
LParts := Copy(FBaseUrl, LP + Length('/api/v1/repos/'), MaxInt).Split(['/']);
if Length(LParts) < 2 then Exit;
LOwner := LParts[0];
LRepo := LParts[1];
LHttp := THTTPClient.Create;
try
LHttp.ConnectionTimeout := FTimeoutMs;
LHttp.ResponseTimeout := FTimeoutMs;
LHttp.HandleRedirects := False;
LHttp.CustomHeaders['Authorization'] := 'token ' + FToken;
case CodeOf(LApi + 'repos/' + LOwner + '/' + LRepo) of
200: Result := 'No vault in this repository yet - sync from the PC first';
401: Result := 'Token refused - expired, revoked or mistyped';
404:
if CodeOf(LApi + 'users/' + LOwner) = 404 then
Result := 'User "' + LOwner + '" does not exist'
else
Result := 'Repository "' + LOwner + '/' + LRepo +
'" not found, or this token cannot see it';
end;
finally
LHttp.Free;
end;
end;
/// Le sha du fichier ecrit, tire de la reponse au PUT : Gitea rend
/// { "content": { "sha": ... }, "commit": { ... } }. Vide si la forme change -
/// l'appelant relira, ce qui coute un appel mais ne perd rien.