-
1.0.8-rc18
Pre-releasereleased this
2026-09-26 01:51:28 +01:00 | 65 commits to main since this releaseAccès aux fichiers personnels PostIt rendu fonctionnel de bout en bout
(arbre de stockage indexé par le login, pas par lesub), boutons
d'action des listes réparés (binding$parent), revendicationname
enfin présente dans les access tokens (branchement duProfileService),
et négociation HTTP/3 côté client PostIt.Added
- [PostIt] Négociation HTTP/3 (QUIC) pour les appels API Yavsc :
DefaultRequestVersion = 3.0,DefaultVersionPolicy = RequestVersionOrLowersur leHttpClientpartagé deYavscApiClient,
avec repli h2/h1.1 où QUIC n'est pas disponible (WASM fetch, Android/
desktop sans libmsquic). - [Tests]
MyFilesPageHeadlessTests: monteMyFilesPagevia
NavigationPage+Window.Show()et vérifie que chaque bouton de
ligne (Télécharger / Supprimer) a saCommandliée, est armé
(CanExecute) et déclenche l'appel API au clic. - [Tests]
Remoting.PasswordToken_carries_name_claim_equal_to_login:
mint un vrai JWT via le token endpoint IdentityServer (password grant,
openid profile) et asserte que l'access token portename=login et
queGetUserName()résout vers ce login. - [Tests]
FileSystemApiTests.Get_fs_lists_files_stored_under_the_user_login:
découplesubet login, téléverse sous le login, et asserte que
GET /api/v1/fsretourne le fichier (et que le répertoire nommé d'après
lesubn'existe pas).
Changed
- [Yavsc.Org] Branchement du
ProfileServicecustom
(AddProfileService<ProfileService>()après
AddAspNetIdentity<ApplicationUser>()). La classe était du code mort :
IdentityServer8 retombait sur son profile service par défaut, qui
n'émet que les claims listés dans lesUserClaimsdes API resources.
namen'en faisait jamais partie, donc tout access token était sans
nameetGetUserName()résolvait ànullsur les hosts ressources
(Blogs/Api) — cause du 500 sur l'upload MyFiles et du
User.Identity.Nameinjoignable. Le service émet désormais
name=user.UserName,emailet les rôles pour tout client dont
lesAllowedScopescontiennentprofile, indépendamment du caller. - [Yavsc.Server]
ServiceExtensions:NameClaimType = JwtClaimTypes.Name,MapInboundClaims = false(conserver les noms
courts de claims tels qu'émis). - [Yavsc.Blogs]
FileSystemHelpers.EnsureDestinationDirectoryutilise
GetUserName()(claimname) au lieu deUser.Identity.Namepour
la racine de stockage par utilisateur. - [Tests]
WebServerFixture:AccessTokenType = 0(Jwt dans IS8 ;
1 = Reference, l'inverse de Duende) ;openid+profilesur le client
de test ; réensemencement des identity resources openid/profile dans
ReseedAuthTestData(unResetAndMigrateDatabasevide le store
in-memory partagé et les laissait absentes →invalid_scope). - [Tests]
TestTokenIssuer.Issuegagne un paramètrenameoptionnel
(défaut = subject) pour refléter la forme production où
sub(GUID) ≠name(login). - [Tests]
BillingServiceTests:[Collection("Yavsc Server")]pour
sérialiser avec le build d'hôte qui mute les registres statiques
BillingService/Config(race parallèle pré-existante).
Fixed
- [Yavsc.Blogs] La liste
GET /api/v1/fscherchait sous
{Blog}/{sub-GUID}(User.GetUserId()), alors que l'arbre de
stockage perso est indexé par le login partout ailleurs
(EnsureDestinationDirectoryécrit sous{Blog}/{name-claim},
le endpoint de téléchargement et les avatars utilisent
user.UserName). Une fois l'upload corrigé, les fichiers
atterrissaient sous{Blog}/{login}tandis que la liste cherchait
sous{Blog}/{GUID}— un arbre vide — d'où la page PostIt
« Mes fichiers » qui ne listait rien.GetDirrésout désormais
l'utilisateur en base et liste soususer.UserName.
UploadedFile.OwnerIdrestesub, doncEnrichWithFileIds
interpole toujours paruid. - [PostIt] Boutons d'action des lignes de liste grisés et inactifs au
clic (Télécharger / Supprimer / Joindre sur MyFiles ; download/detach
sur les listes de pièces jointes deBillingQueryDetailsPageet
EstimateEditionPage). Le binding$parent[vm:XxxViewModel].Cmd
cherchait un ancêtre CONTRÔLE de typeXxxViewModel— un viewmodel,
pas un contrôle — donc résolvait ànullet leButtonrestait
désactivé (grisé) et inerte au clic. Corrigé en
$parent[ContentPage].((vm:XxxViewModel)DataContext).Cmd(syntaxe
déjà en vigueur dansCirclesPage/EstimateListPage). - [PostIt] Les messages de la barre de statut (
StatusBar) n'étaient
pas sélectionnables/copiables : le texte était unTextBlock(non
sélectionnable dans Avalonia). Remplacé parSelectableTextBlock. - [Yavsc.Blogs] La suppression d'un fichier (
DELETE api/v1/fs/{name})
renvoyait un 40x alors que le fichier était bien supprimé du disque.
DeleteUserDirOrFile(etDeleteUserFile) lisaient
FileInfo.Lengthaprèsfi.Delete(); orFileInfo.Length
lèveFileNotFoundExceptionune fois le fichier disparu — lecatch
du contrôleur transformait cette exception en 400, d'où le message
perçu « le fichier n'existe pas sur le serveur » tandis que la
suppression avait réussi. La taille est désormais capturée avant la
suppression. - PostIt default settings
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
2 downloads
- [PostIt] Négociation HTTP/3 (QUIC) pour les appels API Yavsc :