Changelog
Ce qui est nouveau.
Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.
· SecurityService
Enregistrer les lecteurs de plomb et refuser les exportations non vérifiables
HIPAA 164,312 b) pour le service de sécurité. La plateforme enregistre chaque exemple CHANGE (LeadHistory) et chaque login (SystemAccessLog) et les enregistrements non Lire du tout, donc "qui a regardé cet emprunteur" - la première question a L'évaluation de la violation par le paragraphe 164,402 demande l'absence de réponse. PhiAccessAuditor organise des événements à partir de la carte de session OTK/- le point d'extrémité déjà résolu, de sorte que l'identité dans la ligne d'audit est la même l'identité qui a autorisé la demande. Le client IP provient X-Forwarded-Ford-For; derrière Traefik, remoteAddr enregistre la barre d'entrée et est sans valeur pour la détection. Les dénis sont également enregistrés - sonder, c'est ce que la détection recherche - et un appelant sans session atterrit sur une org sentinelle plutôt que d'être abandonnés. Lire la suite: guichet unique de plomb et de VEW, grille et un événement LIST par plomb en fait expédiés (exposés des DTO projetés, donc une sonde filtrée par VOIR-UNASSIGNED-LEADS n'apparaît jamais comme un seul qui a été lu). 401/403/404 tous enregistrent un démenti. Les exportations échouent fermées et le CSV d'accès, HMDA LAR, le corps de formation du contrôle de la qualité et le corpus d'extraction à l'échelle de la plate-forme. Chaque enregistrement est un événement par AVANT que le fichier soit construit, et un échec d'écriture d'audit retourne 503: "nous avons distribué les données mais perdu l'enregistrement" est la seule réponse que ne peut pas être rebroché. Le corpus de l'échelle de la plate-forme traverse tous les locataires, donc chaque enregistrement est attribué à l'organe qui le possède, et non à celui de l'opérateur. Seuls les identifiants sont enregistrés, jamais de contenu. membreId) a disparu: une exportation a maintenant de tenir ses rangées pour enregistrer qui était en eux.
· kamo-signer-monorepo
Citation/estimation publique de marque à l'adresse suivante:
La surface orientée vers le client pour le système de cotations commerciales. Serveur rendu de manière à ce que Le marquage d'org est dans la première peinture - un flash non marqué sur un document commercial c'est exactement ce que cela ne doit pas faire, et c'est pourquoi la page émet des marques personnalisées propriétés en ligne via QuoteBrandVars plutôt que de les échanger après l'hydratation. Vivit en kamo-signer parce que cette application a déjà la vitesse HostRegexp, autocert couverture, alias DNS et le paquet de thèmes avec hostnameOverride - et parce que le signe électronique est alors un saut, puisque EsignGenericEnvelope lie n'importe quel enregistrement via (context-type, context-id). Réutiliser n'était viable qu'une fois le site i18n travail atterri; les 31 chaînes sont des clés de traduction provenant du dictionnaire. Forme de l'argent et des dates jusqu'à l'utilisation de la monnaie de la cotation et de la monnaie fuseau temporel résolu par le serveur (membre du groupement - . . . . . . . . . . . . . . . . . . . . . . Une expiration rendue dans la mauvaise zone peut indiquer une date à laquelle l'offre est déjà morts. Ajoute le premier bloc d'impression réel de la plate-forme. "facture imprimée" en kimo-interne a toujours imprimé l'application entière chrome parce qu'il n'existait pas de règle d'impression multimédia n'importe où; ici, les mêmes impressions de balisage qu'un document de lettre propre avec la marque accent conservé (ajustement en couleur papier: exact - une citation incolore se lit comme un brouillon), la barre d'action supprimée, et page-break-inside: éviter les lignes et les totaux. Les états terminaux sont délibérément asymétriques : EXPIRED obtient une page de marque honnête en cliquant sur le fait que l'appelant les coordonnées et les coordonnées de l'organisation, c'est-à-dire la date et les coordonnées de l'organisation, c'est-à-dire la sécurité possession avérée d'un jeton de 256 bits; inconnue/revoquée/wrong-org tous effondrement en un une page générique de sorte que la surface ne peut pas être sondée. La liste blanche du client en est la raison avant le rendu. Le jeton ne se déplace jamais dans une URL - la résolution côté serveur le poste dans un le BFF transmet explicitement le client réel IP parce que les timbres APIService X-Forwarded-Forwarded-Ford-For de sa propre demande entrante, qui autrement mettrait toutes les spectateur dans un compartiment de limite de débit à la dose IP de la nacelle. Ajoute SÉURITYSERVICE-URL à la configmap (vérifié: le service russo-secueil existe dans l'espace de noms kamo).
· SecurityService
Cité de la surface REST et de la gestion du personnel et des liens avec le public
Critères d'évaluation de l'état-major à /api/security/commerce/quotes et un résolveur non authentifié à /api/sécurité/public/quotes. QuoteController étend BaseLosCluleur plutôt que la copie de POSController préambule: CallerSessionResolver accepte l'attribut X-OTK, le X-z-toyen L'en-tête ET le biscuit, où le cookie privé de POSController getOrgId ne lit que le Attribut OTK. Tout gestionnaire est protégé par les droits (VIEW/MANAGE/SEND-QUOTES). La plupart des La surface de commerce n'est que de session - tout membre authentifié de tout org peut muter les ordres - et cela n'est délibérément pas répété ici, parce qu'une citation engage la l'orgge à un prix devant un client. Le contrôleur public n'a pas besoin de dispositif de protection: la chaîne de printemps est anyRequest().permitAll() et OTKPreAuthFilter n'agit que sur un en-tête X-OTK, qui un navigateur suivant un lien par courrier électronique n'envoie jamais. Points de conception: - Le jeton arrive dans le corps POST, jamais une URL. Demande de logs APIAppAppforward() des lignes, et un titre de porteur sur un chemin atterrirait dans ces grumes. - Pas un oracle d'énumération : jetons inconnus, révoqués et mal appariés Retourner une défaillance générique indiscernable. Seul EXPIRED obtient un élément spécifique, une réponse honnête, qui est en sécurité parce que l'appelant a déjà prouvé la possession d'un Jeton de 256 bits. - L'orge dérivée de l'hôte de la demande est vérifiée par rapport à l'orge sur la ligne de liaison. Sans elle, un lien valide pour l'organisation A ouverte sous l'hôte d'org B serait rendre le prix de A portant la marque de B - un phishing primitif. - no-store / Referrer-Policy: no-referrer / X-Robots-Tag: noindex sur tous les la réponse. La page charge les logos à partir de thème.org, et un référent aurait le lien entre le jeton déconnecté. PublicLinkRateLimiter est redéplômé parce que SecurityService est multi-replica les compteurs en cours de traitement seraient un limiteur de nom uniquement. Il s'agit explicitement d'un système de données d'entreprise et protection contre l'hygiène log, PAS le témoin anti-engagement: 256 bits d'entropie le sont. Les échecs sont comptés beaucoup plus durement que les succès, puisqu'un bureau ouvre une La citation transmise cinquante fois est la normale alors que cinquante échecs ne l'est pas. Il échoue à ouvrir, donc a Redis out off ne peut pas prendre la page de citation en baisse. QuoteEmailClient refait à nouveau le chemin transactionnel EmailService (X-Internal-Auth, Modèle de QUOTE-SENT) et n'envoie que le titre plus le lien - jamais le une tarification détaillée, de sorte qu'un courrier électronique transmis n'est pas en soi la divulgation. Défaillances de test préexistantes inchangées par cet engagement (vérifiées par la calage de ces travaux) et re-réactives sur la TELLE-TRÉE propre) : NPE sur un zéro EntityManager, et l'héritage com.retval SecurityServiceApplicationTests manquant a Configuration de la botte de printemps. REQUISE un KamoInitializerService exécuté avant que ces critères d'évaluation ne fonctionnent: les tableaux de guillemets sont nouveaux et ddl-auto n'est pas ici, donc les bottes de service normalement et seulement la citation les critères 500 sur une relation manquante jusqu'à ce que KI ait couru.
· kamo-shared-library
Citation/estimation du domaine et des entités, moteur de tarification, liaisons de partage
Ajoute une citation de première classe aux côtés de la colonne vertébrale commerciale existante. Le préexistant "ServiceQuote" est une intention plus un blob JSON portant une offrande et un appartement le montant, sans récipiendaire, sans expiration et sans UI; ce n'est pas une base. Prolongation L'intention a été rejetée également: les entreprises commerciales sont partagées par LOAN-APPLICATION, RENTAL-REQUEST, SUBSCRIPTION-SIGNUP et ACHECHASE-REQUEST, donc colonnes de citations mettraient des NULL permanents sur les chemins hypothécaires et locatifs. Entités Citation liée à l'engagement, version, valide - valide - valable - pour les jours QuoteLineItem instantanés nom/sku/prix donc une citation envoyée ne re-prix jamais re-prix QuoteShareLink ofsidents, SHA-256 au repos, révoquer/expiry/view count QuoteLinkView audit par ouverture (ip, utilisateur-agent) CitationEvent emplacement de la piste du cycle de vie réservé Les totaux sont autorisés par serveur. QuoteTotals est l'écrivain unique de chaque argent Les DTO ne portent aucun total - délibérément différent createRetailOrder, qui prend le sous-total/impôt/total mot mot et peut être remis à un ordre de fond avec un total de 0. Des rabais sur les lignes s'appliquent avant le niveau de cotation discount, les rabais ne peuvent jamais dépasser leur base, les maths intermédiaires restent à l'échelle 4 et seulement le tour total de l'unité mineure de la monnaie. Partager les jetons: 32 octets de SecureRandom en 43 cascs de base64url (256 bits). Même entropie comme le jeton du signataire de l'e-sign mais 21 chars plus courts, en gardant l'URL envoyée par courriel dans le cadre de la limite d'emballage en caractères simples de 76 voitures. Seul le SHA-256 persiste. La taxe est honnête plutôt que inventée: la plate-forme n'a pas de moteur fiscal (TaxClass/ Taxe/TaxRate estimenti et lu en l'absence de calcul), donc mode MOTEUR signale que la création d'un chiffre sur un document commercial est contraire à la "Non" au lieu de fabriquer une figure. QuoteLineItem.taxClassId est UUID, en correspondance avec TaxClassClass's real's est long contre une table à clé UUID et est structurellement insoluble. Aussi: droits 178-180 (VIEW/MANAGE/SEND-QUOTES) et le courrier électronique canonique QUOTE-SENT modèle, enregistré dans CANONICAL-KEYS (absent, c'est-à-dire un titulaire permanent 404). 35 essais portant sur le moteur de tarification et l'hygiène des jetons. Suite complète: 896 pass. Schema note: il s'agit de nouveaux tableaux. KamoInitializerService doit courir avant SecurityService sert les points d'extrémité de la cotation - ddl-auto n'y en a pas, donc le les démarrages de service fin et les critères d'évaluation 500 sur une relation manquante jusqu'à ce qu'elle le fasse.
· KlusterServices
Réence en période de crègre pour le résolveur d'avatars, en tant que CiliumNetworkPolicy
Renauque ce que 8f6c672 est retourné, sous la seule forme qui fonctionne réellement ici. La tentative précédente a échoué parce qu'une cybernétique NetworkPolicy ne peut pas exprimer cette la topologie du groupe. Trois des quatre dépendances critiques de SecurityService vivent le nœud, non dans le réseau de gousses - cockroachdb-0 et nats-k1m1-0 run hostNetwork, et MinIO est un processus hôte - donc un podSelector ne peut jamais les égaler. Le une partie non évidente, et la raison pour laquelle la première tentative de patch a également échoué, est qu'un ipBlock pour le sous-réseau ne le fixe pas non plus: Cilium classe le noeud comme l'identité réservée d'hôte/noeud de distance et les règles de la CIDR ne correspondent pas délibérément les identités réservées. à l'Entities est la seule construction qui l'exprime. Les deux modes de défaillance ont été reproduits contre un canary pod jetable avant d'écrire Cela plutôt que contre la production. Le canari portait la même règle énoncée sous une étiquette distincte, qui est la façon dont la version ipBlock a été prise en train de bloquer silencieusement CockroachDB, NATS et MinIO tout en ayant l'air parfaitement raisonnable. Vérifié sur le canari, puis confirmé sur SecurityService sans redémarrage et non erreurs de connexion: ALLOW dns, crdb:26257, nats:4222, minio:9000, redis:6379, frères et sœurs:80, monde:443 Noeud BLOCK:22, noeud:443, kube-api:443, redis-via-node:6379, 169.254.169.254, loopback:9000 Les quatre derniers sont le point: un SSRF dans le résolveur n'a plus nulle part où aller. Le la garde-code reste la commande principale - c'est la seule couche qui comprend DNS reliure - et c'est la défense derrière elle. L'en-tête porte la procédure canari. Quiconque change cela devrait plutôt le refaire que la raison à son sujet; le modèle d'identité de Cilium ne se comporte pas comme simple L'intuition de NetworkPolicy suggère, et il n'y a pas d'environnement d'étape.
· kamo-internal
Montrer un visage pour les conversations de groupe
Un fil avec cinq personnes était représenté par un visage arbitraire, qui Il est dit un message d'une personne. Jusqu'à trois participants se chevauchent maintenant, de sorte qu'ils "plusieurs personnes" est lisible en un coup d'oeil sans avoir besoin d'analyser la ligne de nom. Cappée à trois: au-delà du fait que les cercles se rétractent en dessous de la reconnaissance et de la rangée devient texture plutôt que l'information, et le reste est déjà indiqué dans le texte "et N autres" à côté. Le lecteur est filtré hors de sa propre liste de fils, et l'autre partie mène faces lire gauche à droite, de sorte que le correspondant primaire doit être le plus à gauche et celui portant le badge non lu. Chaque face obtient un anneau dans la rangée couleur de fond; sans elle, une pile de photos similaires se confond en une forme. La résolution couvre désormais les premiers participants, et non seulement le chef de file, sinon les deuxième et troisième faces s'assoient en tant que monogrammes en permanence.
· SecurityService
Instrumenter la chaîne, récolter les entrées périmées, consignes d'enregistrement
Chaque mode de défaillance dans cette fonctionnalité est silencieux. Un disjoncteur à serrure, un travailleur mise en attente rejetant chaque tâche, un fournisseur qui a commencé à restituer le HTML et chaque apparence exactement comme "ce correspondant n'a pas de photo", ce qui est aussi ce qui est correct le comportement ressemble à. Il n'y a pas de différence visible entre le travail et le travail complètement mort, il faut donc le mesurer. Métrique (Prométhée était déjà câblé, donc c'est surtout la dénomination): cache hit rapport, durée de chaîne étiquetée par le niveau qui a répondu, per-provider hit/miss, la profondeur de la file d'attente des travailleurs, et un total de tâches rejetées. Ce dernier a précédemment utilisé DiscardPolicy, qui tombe silencieusement par conception; elle incrémente maintenant un compteur, et le compteur est déclaré avant l'exécuteur parce que les initialiseurs de champ sont mis en L'ordre de la source et le fait de s'appuyer sur une capture paresseuse briseraient un réordonneur inoffensif. Les informations sont communiquées à leur propre bûche. Seul le niveau d'identité est un niveau personnel la divulgation - les niveaux de domaine transmettent le côté droit d'une adresse, qui n'identifie personne - et il est enregistré avant l'appel plutôt qu'après, de sorte que Une trail existe même lorsque la demande échoue. L'adresse est rédigée en totalité et délibérément: le but est de répondre "qui était les données de cette personne avec lesquelles elle était partagée", et un hachage ne peut pas répondre à cela. La moissonneuse ferme une fuite: supprimerExpiredBevee existait et rien ne l'appelait, donc l'identité de l'expéditeur a grandi pour toujours. Une boîte aux lettres chargée touche des milliers de correspondants une fois chacun et laisse une rangée négative derrière pour chacun. Les tests couvrent le fetcher contre une vraie douille, parce que les cas intéressants sont tous les comportements de fournisseur plutôt que logique: a 404 portant une image valide (DuckDuckGo), un doux de type 404 servant HTML, une origine sous-estimant la longueur du contenu, a 1x1 stub, et une redirection visée dans le réseau de la gousse. Le client de production ne peut être pointé sur un serveur de test de bouclage - sa broche DNS refuse de résoudre quoi que ce soit privé, qui est le point entier - donc ceux courent contre un client détendu et le L'épingle est présentée séparément.
· kamo-internal
Promouvoir une matrice LLPA ingérée en ajustements à partir de la console
Le panneau d'ingestion ne pouvait publier qu'une feuille de taux. Pour une source de LLPA-MATRIX document il montre maintenant une carte "Promouvoir en tant que FACL": choisir l'existant version de la feuille de taux des aires métropolitaines ajustées (groupe facultatif) et chacune approuvée Le compartiment FICO/LTV devient un ajustement conditionnel des prix. Le résultat indique comment Beaucoup ont été écrits et, honnêtement, combien de rangées ont été sautées parce qu'un seau ne pouvait pas être lu en toute sécurité ou était déjà présent. ingestionApi.promoteAjustments des messages au nouveau relais de passerelle.
· SecurityService
Relais de passerelle pour promouvoir une matrice LLPA en ajustements conditionnels
- Acquérir des ajustements de promotion, en miroir promote-rate-sheet relais: porte éligible à la god, organisationId server-solap sur la charge utile via l'écriture(), en aval 4xx relayé mot pour mot. Laisse un steward tourner a a examiné la matrice de la LLPA en ajustements réels des prix par scénario à partir de la console.
· VOIPService
Enregistrement de l'enregistrement des appels, de la messagerie vocale et de l
L'enregistrement de la lecture n'a laissé aucune trace. Un appel enregistré est le PHI le plus dense la plate-forme stocke - la conversation insouciée - et "qui a écouté cela call" était inconvenant, ce qui est la première question d'une violation de 164,402 euros. demande une évaluation. Wires CallRecordingAuditor dans chaque lecture qui le divulgue: - ENREGISTREMENT/Enregistrements/-id-/URCAL-RECORDING/DÉTÉTÉ - APPRÉCALisation/TÉLÉCHARGEMENT D'APPEL - ENREGISTREMENT/Enregistrements/EAU D'ACTION ET DE L'EXTÉRIEUR ET DE LA VUE - APPRÉCALisation/TÉLÉCHARGEMENT D'APPEL - GET/instances/-id-/voix-/voix/LIST, par ligne La transcription est celle qui se cache. Ce n'est pas un téléchargement de médias; il fait des courses à l'intérieur des métadonnées JSON et à l'intérieur de chaque ligne de messagerie vocale, et c'est la même PHI comme l'audio sous une forme qui greps. Il obtient son propre événement parce qu'un La comptabilité des informations est constituée par ressource. Le service de l'octet est fermé, de sorte que PhiAuditAvailabilityAdvice devient un indgable lire dans un 503 plutôt qu'un 500 - la demande était bonne, nous décodrons pour Servir PHI nous ne pouvions pas rendre compte. Les refus sont également enregistrés; le sondage est Qu'est-ce que la détection recherche. Ferme également une lacune d'autorisation trouvée en câblant ceci: POST /enregistrements/lookup a pris un casId de l'organe de demande et jamais a vérifié que l'ordre de l'appelant est propriétaire, de sorte qu'il a résolu le fournisseur d'un autre locataire; appeler ids à leurs ids d'enregistrement. Tous les autres critères d'évaluation de la portée d'une instance dans le Le service passe déjà par findByIdAndOrgId; celui-ci le fait maintenant aussi. L'autorisation de lecture de l'enregistrement est laissée en place et doit être documentée: la propriété est le seul contrôle, de sorte que tout membre peut lire n'importe quel enregistrement dans leur gen. Si l'on le compare, c'est décider si la "propre extension" est et qui le fait de le soulever - c'est-à-dire une décision de produit, pas une devinez que vous faites ici, et chaque accès est au moins enregistré maintenant.
· AIService
Enregistrer l'accès PHI sur chaque enregistrement de l'historique de conversations d'IA stocké
Fillage de la colonne vertébrale partagée de la colonne vertébrale de la crocha dans les chemins qui ont persisté les invites et les achèvements. L'assistant est le module de l'évaluation de la conformité OUTES à L'EXTÉRIEUR de la frontière - incite les fournisseurs extérieurs à l'exclusion des fournisseurs de services d'exclusion financière et sont alors conservées indéfiniment - donc les lires de ce magasin sont les informations les plus en besoin d'une piste, et ils n'en avaient pas. Audité: la liste des sessions et la recherche d'historique (un événement par conversation, non une par demande), les métadonnées d'une seule conversation et ses messages, le public widget en relevroulant sa propre transcription, et le paquet de transfert. Les refus sont a été enregistrée également - sonder les guidés d'une autre organisation est ce que la détection recherche - et un Une tentative non authentifiée est attribuée à l'orge sentinelle plutôt qu'à la chute, puisque l'enregistreur rejette ce qu'il ne peut pas attribuer et c'est l'événement le plus vaut la peine d'être gardée. Le faisceau de décharge est un DISCLOSE, et non un VUE: il porte un visiteur Conversation hors d'AIService et devant un humain dans un autre produit. Que nature faillir, de sorte qu'un enregistrement perdu retnit maintenant la transcription et répond 503 plutôt que de servir les données qu'il ne peut pas rendre compte. Identifiants seulement. Jamais un corps de message, un titre ou le terme de recherche - un membre la recherche de leur historique d'assistants y tape le nom de l'emprunteur, et une une piste d'audit qui reproduisait l'invite aurait simplement déplacé le PHI dans la flux log. Achève la d428ee3, qu'une session simultanée a balayé le changement de milieu: l'auditeur Il manque à DeniedInternalView, et le nouveau publicAiChatCat's new L'argument du constructeur n'avait pas atteint son test.
· MediaService
Enregistrer le message de discussion se lise sur les points d'extrémité qui renvoient les corps
L'envoi d'un message a laissé une rangée; lire une rien. Chaque discussion, soutien et le thread social sur la plate-forme produit à partir d'une poignée de points d'extrémité ici, et aucun d'entre eux ont enregistré quoi que ce soit, donc "qui a lu cette conversation" n'avait pas de réponse - qui est la première question à laquelle une évaluation de la violation formulée 164.402 pose. ChatMessageAccessAuditor émet un PhiAccessEvent (CHAT-MESSAGE) des cinq les chemins qui donnent un texte de message de l'appelant: GET ET LISTE GET /api/media/sessions/chat LIST POST - VUE GET ET LISTE POST - VUE Un événement par message, pas un par demande. "Ils ont ouvert le fil" n'est pas un répondre à "le message de cet individu était-il divulgué", et les identificateurs de message sont déjà en cours sur chaque site d'appel, donc une rangée en forme de demande aurait été un le choix plutôt qu'une limitation. La lecture du fil d'exécution enregistre après le filtre muet, Ainsi une rangée signifie un corps que l'appelant a été remis. La liste de discussion est de portée car chaque ligne transporte jusqu'à 140 caractères du le dernier message du thread - c'est-à-dire le contenu, pas les métadonnées. Lignes avec un aperçu vide n'enregistre rien. NE PAS enregistrer délibérément: nombres non lus, présence, dernier en dernier lieu, frappe, lecture reçus, listes de membres de session, muets, détails du billet (métadonnées plus état l'historique, pas d'organes) et l'appui aux agrégats de rapports. Une piste n'est utile que si une Ligne signifie que quelqu'un a vu du contenu; des rangées qui ne représentent rien enterrer ceux qui le font. Les refus sont également enregistrés, contre le filetage, et aucun message n'existe encore à le point de refus, et les refus répétés contre les guids de fil est la forme le sondage a été le cas. Un lecteur non authentifié est attribué à un org sentinelle plutôt qu'à un lièvre a chuté: l'enregistreur rejette les événements inattributs, et c'est le plus unique un événement intéressant que cette piste peut tenir. Client IP vient de X-Forwarded-For avec remoteAddr comme repli - tout Arrive par Traefik, donc remoteAddr enregistre à lui seul la gousse d'entrée. Chat public prend un deuxième saut à travers APIService, qui met X-Forwarded-For à l'intention du visiteur Adresser et déplacer l'agent utilisateur-agent du navigateur vers X-Original-User-Agent, donc le auditeur préfère cet en-tête; l'utilisateur-agent littéral sur ce saut est APIService posséder un client HTTP et n'identifier personne. Les lectures du visiteur sont attribuées à l'orge de X-Public-Chat-Org-Id sans membre id: un visiteur n'a pas d'identité de membre Le leur, mais l'orge est propriétaire des dossiers, de sorte que la lecture reste attribuable. Identifiants uniquement, ne jamais envoyer de texte. Une piste d'audit qui reproduit le message Il a juste copié le PHI dans le flux de log. Achève aussi eed3817, qui a balayé ce travail en milieu d'edit et a quitté MediaController référence à PhiAccessKind avant l'importation - que la révision n'est pas compiler. Celui-ci est le test mvn -o vert 16/16.
· DocsService
Enregistrer l'accès des octets sur les quatre chemins de documents qui n'ont rien enregistré
/download déjà enregistré Le seul site d'injection de la plate-forme d'accès octet. Les critères d'évaluation des frères et sœurs desservent le Exactement les mêmes octets /stream, /bulk-download, le modèle converti-PDF et le rognon de page de modèle - n'a rien enregistré, donc quiconque veut des octets de document sans laisser de trace n'a eu qu'à choisir une URL différente. Tous les quatre émettent maintenant un PhiAccessEvent à l'endroit de l'accès a été vérifié et le Les octets sont sur le point d'être servis. Le téléchargement en gros émet un événement par document plutôt qu'un par demande. "Ils exporté 400 documents" n'est pas une réponse à "est-ce que c'est le cas Les lignes de documentation divulguées" et les lignes per-document sont ce qui rend cette question responsable six ans plus tard Moins de 164,528 euros. Client IP vient de X-Forwarded-For avec remoteAddr en tant que repli: chaque demande arrive par Traefik, donc remoteAddr seul enregistrerait la dose de charge pour tout accès et être sans valeur pour la détection. Une tentative non authentifiée est attribuée à une organisation sentinelle plutôt qu'à une organisation sentinelle. Lâché - l'enregistreur rejette les événements inattributs, et une demande de document octets sans session est exactement l'événement qui vaut la peine d'être gardé. Cela se situe à côté des lignes ImgLogDownload existantes plutôt que de les remplacer: ce sont des enregistrements de domaine d'imagerie, c'est la piste de fond de les informations sont assemblées à partir de. Note ImgLogService, qui lit ces lignes, toujours n'a nulle part dans la plate-forme.
· KlusterServices
Contient des sorties du résolveur de l'avatar; notez le groupe d'expulsion de Redis
SecurityService exécute maintenant un fetcher dont l'URL cible est choisie par un non-confiant partie - un enregistrement BIMI est un contenu DNS publié par quiconque possède un domaine d'envoi, et n'importe qui devient un domaine d'envoi en envoyant un locataire par courriel. Rien dans ce groupe contraintes lorsqu'une telle demande pourrait aller: Redis répond sans authentifié le 6379, MinIO sur 9000 avec des justificatifs racines, CockroachDB sur 26257, et les métadonnées des nœuds le point d'extrémité est joignable à partir de n'importe quelle dosette. Le résolveur applique ses propres contrôles en code, et ceux-ci restent les principaux la défense parce qu'ils sont la seule couche qui comprend la reliure du DNS. C'est le second, donc un bogue là-bas ne peut toujours pas atteindre une adresse privée. Permettre délibérément la liste la plus large plutôt que la liste d'autorisations. Ces services atteignent légitimement hôtes, donc les destinations énuméreres seraient instaurables et cassent Silencieusement. Au lieu de cela, il permet à l'internet public avec toutes les gammes privées exceptées, puis répermet les ports spécifiques en grappe réellement nécessaires. Porté aux gousses qui effectuent des friches non fiables - l'appliquer à l'échelle de l'espace de noms" serait coupé les services dont la sortie n'a jamais fait l'objet d'un audit. Le changement Redis est un commentaire et une barre de bases de données, et non un changement de comportement. Il enregistre les raisons pour lesquelles la cache expéditeur-avatar ne stocke que de courtes chaînes de métadonnées: maxmemory 2gb avec allkeys-lru evicts dans tout l'instance, et DB 0 tient tous les jours vivants session, donc un cache d'octets en vrac ici signerait les utilisateurs à la pression aléatoire et être mal diagnostiqués pendant des jours.
· kamo-internal
Photos de l'expéditeur et du destinataire
La boîte aux lettres a rendu une seule lettre sur un seul gradient partagé pour tout le monde, donc chaque rangée ressemblait de la même chose et le cercle ne transportait aucune information. Il montre maintenant le photo réelle du correspondant lorsqu'on en est connu, et un monogramme à deux lettres quand il Ce n'est pas le cas. Un SenderAvatar remplace sept cercles de initiales laminés à la main. Cela importait pour plus que la cohérence: chacun a porté sa propre idée de la manière de diviser une adresse, et le cache d'avatar est mis à la clé sur cette scission, donc tout désaccord entre la liste et la feuille de lecture diviserait silencieusement le taux de succès et montrerait la même personne deux différentes manières sur un écran. parseAddress est maintenant le seul endroit un RFC 5322 l'adresse est démontée. La liste et les vues de fil cessent également d'imprimer des en-têtes bruts comme "Jane Doe -jane-acme.com" et montrez le nom. L'identité vit dans son propre magasin, par adresse, jamais sur les objets de message. Les deux listes publient un sondage de vues toutes les 30 et sur chaque notification de websocket, à chaque fois remplacer leur réseau de messages en gros - tout ce qui est fusionné sur un message serait essuyé deux fois par minute, de sorte qu'une boîte de réception inactive scellerait la photo en monogramme et le dos pour toujours. La clé à l'adresse signifie également qu'une réponse florissante tardive ne peut pas peindre sur la mauvaise ligne, parce que les lignes ne sont pas ce qu'elle est cloquée. Les demandes sont regroupées en un lot par écran: cinquante rangées demandant indépendamment seraient cinquante demandes, et puisque chaque appel à ce service ment une clé unique en première position, En fait une centaine. Un échec est ré-demandé une fois après 45s, parce que côté serveur la résolution est biphasée et une adresse inconnue n'est pas résolue à une réponse ultérieure. ConversationListView est maintenant virtualisé. Il fécupère 50 rangées par page et re-repliement tous à l'intérieur d'une AnimatePresence avec un décalage per-index sur chaque sondage; l'ajout d'une image à chacun d'elles en faisait la surface la plus lourde de la boîte aux lettres. Les expéditeurs sans réponse et mailer-daemon obtiennent une marque neutre plutôt qu'un monogramme face à un rebond est activement trompeuse. Les photos sont décoratives parce que le nom est toujours visible à côté d'eux, et porte référencerpolicy - "No-referrer" donc un identifiant de thread n'atteint jamais un hôte d'image. Chaque avatar est servi de notre propre origine et des images tierces sont récupérées. a validé et réhébergé côté serveur - ce qui permet la nouvelle per-request la politique img-src reste ancrée dans les domaines du locataire. Cette politique est intégrée le proxy plutôt que next.config parce que cette plate-forme est marquée en blanc: a Une politique statique devrait nommer un locataire et casser des images pour le reste. Il ferme également un vecteur de suivi-pixel préexistant, depuis Contact.photoUrl est un URL en texte libre rendu directement en plusieurs «img src». next/image n'accepte plus SVG à distance. Il s'agissait d'un risque acceptable lorsque le seul Les SVG étaient nos propres logos de thème; ce n'est pas maintenant que la plate-forme ingeste marque publié dans un tiers DNS. Les utilisateurs de contacts tombent sur l'ORG-ID 'ID'1 et le paramètre de requête orgId, correspondant au changement d'arrière-plan qui dérive le bail de la session.
· EmailService
Critères d'évaluation de l'avatar ; fixer une joignabilité non authentifiée et une natance de contact
Ajoute la face mail de la boîte aux lettres des avatars de l'expéditeur, et fixe trois trous préexistants D'autre part, les travaux se seraient construits au-dessus de. AUTORISATION. OTKPreAuthFilter utilisé pour rejeter un OTK mais traiter OTK comme anonymes et autorisés, tombant droit jusqu'à la chaîne de filtres et Spring Security chain ici est anyRequest().permitAll(). Chaque boîte aux lettres, contact et le critère d'évaluation du calendrier était donc lisible par tout ce qui pouvait atteindre ClusterIP. Les préfixes protégés échouent maintenant. La durée de vie fixe dans le filtre plutôt que dans la chaîne de sécurité délibérément: remodeler la chaîne toucherait trente surfaces sans rapport à la fois, y compris deux servlets et les critères d'évaluation du DAV. Le la liste exemptée est l'ensemble complet de points d'entrée véritablement sans session - CAN-SPAM opt-out link, la cible de redirection OAuth où le locataire se rend dans le paramètre d'état signé, et les surfaces serveur-serveur qui s'authentifient avec X-Autoth-Internal-Auth. TENANCY DE CONTACT. Chaque point d'extrémité de contact a pris orgId en tant que paramètre de requête, ou a atteint un livre par id sans contrôle de propriété du tout, donc en changeant un numéro dans le URL lise les contacts d'un autre locataire - noms, adresses, numéros de téléphone, notes. Le l'org vient maintenant de la session et chaque opération de lecture ou de groupe s'avère la cible lui appartient. Absent les objectifs retour 404 au lieu de 403 donc un id dans Un autre locataire n'est pas confirmé qu'il existe. orgId est toujours accepté sur la liste les critères d'évaluation et ignorés, de sorte que les clients ne se brisent pas au milieu du déploiement. Ce changement fixe également un bogue silencieux: searchContacts derived orgId from bookId et passé nul quand aucun livre n'a été sélectionné, dans une requête dont le premier prédicat est contactBook.organization.id:orgId. La recherche sans livre est donc toujours revenue Rien - ce qui est exactement la façon dont le destinataire du courrier l'appelle automatiquement. EMAILLOGOSERVICE. Il a cherché une URL fournie par l'opérateur sans schéma ni adresse vérifier, et transcodé le résultat sur un Batik qui résout les références externes par par défaut. Un logo SVG contenant « l'image » ont été déréférencées de l'intérieur du cluster. Maintenant gardé aux deux extrémités. MESSAGEINDEXER. resolveMemberIdFromEmail a tiré la table des membres dans la table ailé et le filtre en Java, une fois par message indexé, sur une dosette de 1Gi et le code a-t-il dit dans un TODO. Même sémantique, une requête indexée. La surface de l'avatar est un critère d'évaluation par lots plutôt qu'un champ sur le message. DTO. Les deux énumèrent les sondages de visualisation tous les 30 et remplacent leur réseau de messages en gros, donc un avatar porté sur un message serait effacé deux fois par minute et l'UI serait flicker forever; et EmailMessage est partagé par la liste de dossiers, la feuille de lecture, Une vue et une recherche en fil de fer, donc changer sa forme les toucherait tous à la fois. Le point d'extrémité de l'annuaire-photo est serveur-serveur uniquement - exposé à un navigateur, il serait un oracle de dénombrement pour le locataire.
· SecurityService
Chaîne de résolution expéditeur-avatar pour la boîte aux lettres
Résout l'adresse e-mail d'un correspondant à une photo, travaillant à partir de quoi Kamo sait déjà: photo du membre, puis une photo de quelqu'un attaché à un contact, puis le répertoire Microsoft/Google connecté du locataire, puis le domaine d'émetteur BIMI marque, puis son favicon, puis Gravatar. Tout ce qui n'a pas été résolu rend une monogramme, donc la chaîne se termine toujours localement. Le niveau d'annuaire vaut la peine d'être appelé: les flux de connexion ici demandent déjà admin.directory.user (Google) et User.ReadWrite.All et Directory.Read.All (Microsoft) aux côtés des champs de courrier, donc pour Workspace et 365 locataires renvoie des photos faisant autorité sans aucun consentement de ré-consentement et aucun tiers impliqué. Il devrait battre quoi que ce soit sur l'internet public et le fera généralement. Deux phases, jamais une. Une demande lit uniquement le cache; les inconnues vont à un borné Travailleur avec DiscardPolicy - exécuter une tâche débordée sur l'appelant irait à une main un fil de discussion à un hôte tiers, et une résolution rejetée ne coûte rien Parce que le prochain sondage demande à nouveau. Une chaîne àdisque complète est DNS plus quatre appels HTTP, et une page transporte des dizaines d'adresses; rien sur l'ouverture d'un dossier peut dépendre sur la disponibilité des tiers. Le découplage empêche également la résolution de se corréler avec un homme ouvrant un message, ce qui ferait d'elle un reçu de lecture - l'exacte comportement, la boîte aux lettres bloque déjà par défaut pour des images distantes. Il s'agit du premier fetcher de la plate-forme dont l'URL cible est choisie par un non-ficeau partie: un enregistrement BIMI est un contenu DNS publié par quiconque possède un domaine d'envoi, Et quiconque devient un domaine d'envoi en envoyant un courrier électronique à un locataire. Il n'y a pas de sortie NetworkPolicy et pas de proxy forward, donc les contrôles sont en code. SafeImageFetcher Pins DNS - un résolveur personnalisé mains OkHttp uniquement les adresses qui sont passées PublicHostGuard, fermer la fenêtre de reliure qui défait un pré-vol naif vérifier - refuse les redirections, caps octets comme ils ruissellent plutôt que confiant Longueur de contenu, et nécessite un contenu d'image. SvgSanitizer analyse et résérialise contre une liste de permis au lieu de matriciarisation. Batik 1.17 résout les ressources externes par défaut, donc en lui donnant un SVG hostilement dérimrait l'image à l'intérieur du cluster après le contrôle URL déjà passé. Le profil Tiny PS interdire cela est une déclaration sur les fichiers conformes, pas sur les octets récupérés à partir de l'URL d'un attaquant. La sémantique de raté par le fournisseur est tout autre et tout l'empoisonnement de cache si elle est traitée comme hits: Gravatar est demandé avec d-404 parce que tous les autres retours par défaut 200 avec un L'absence d'espace réservé par Google est un 404 portant un globe d'identité byte, donc c'est rejeté par le hash de contenu; DuckDuckGo retourne 404 avec un corps d'image réel, donc le statut décide. Les octets sont ré-hébergés sous un nom aléatoire - jamais dérivé de l'adresse, qui permettrait à quiconque de déterminer si une personne donnée correspond à cette plate-forme - et a servi par une voie authentifiée. Redis ne détient que des métadonnées. Cette instance est 2GB avec allkeys-lru sur un sale vide, partager un espace clé avec chaque session en direct; les octets d'image de mise en cache là-bas isation seraient évincements les sessions et les désignons au hasard.
· kamo-shared-library
Modèle d'identité de l'expéditeur et consultation par courrier électronique par lots org-portés
Entreposage et questions pour la chaîne expéditeur-avatar de la boîte aux lettres. SenderIdentityEntity est le niveau durable de la cache d'avatar. la clé naturelle plutôt que la décoration: USERS.EMAIL n'est unique que par sécurité fournisseur, donc une réponse dérivée des données de locataire ne doit pas être visible par un autre locataire. Les réponses de niveau externe (BIMI/favicon/Gravatar) sont véritablement mondiales et Partagez une org sentinelle afin que chaque locataire partage le taux de succès. Les mis sont conservés sous forme de rangées, pas d'absences - sans cela, chaque expéditeur insoluble refait exploser l'ensemble chaîne de fournisseurs sur chaque vengeance de la boîte de réception. OrgAvatarSettingsEntity divise la chaîne par ce qui sort du bâtiment. Le niveau d'identité est défaut OFF parce qu'il divulgue un recueil de commentaires d'un correspondant à un tiers qui, sur un prêt, est une décision concernant un tel règlement l'identifiant de l'emprunteur plutôt qu'une préférence d'affichage. Les ajouts de dépôt existent car rien de tout cela n'était accessible avant: - ContactEmailRepository n'a pas été consulté par adresse - seulement sous-corresté LIKE pour l'auto-complet, donc un contact qui avait une photo ne pouvait pas être résolu de a De: en-tête. - Les résultats des recherches par lots membres/utilisateurs sont org-lavés et prennent des entrées pré-sous-dévalisées. LOWER() est appliqué à la colonne stockée uniquement; les courriels persistent mot pour mot (EmbEmail n'a pas de normalisateur) et l'égalité de CockroachDB est sensible à la prudence. - Les projections avatar-id renvoient les id plutôt que les entités à dessein. Les deux Member.avatar et User.avatar sont des associations paresseuses sur une hiérarchie JOINED: un appelant en dehors d'une transaction obtient LazyInitializationException, et un à l'intérieur obtient un mandataire de type base qui ne se rétrécit jamais par AvatarPhoto, en plaçant le fichier l'extension nécessaire pour construire l'URL hors de portée. - - remplace un findAll() un balayage complet qui a fonctionné une fois par message indexé. PublicHostGuard est partagé plutôt que dupliqué parce qu'il s'agit d'une sécurité contrôle: il décide si une adresse est quelque part, nous enverrons une demande qui une partie non fiable a choisi. Testé par rapport aux techniques de dérivation réelle - IPv4-mappé IPv6, 6 à 4, NAT64, CGNAT et métadonnées de liaison-local. À droite 177, la décision de divulgation.
· kamo-shared-library
Spine d'audit pour l'accès à l'IPH : 164.312 b)
La règle de sécurité exige l'enregistrement de l'accès à l'ePHI, c'est-à-dire libellée comme suit. Le Les enregistrements de plate-forme changent bien - LeadHistory, SystemAccessLog, UserHistory, LoanAuditEvent - et ne lit presque nulle part, c'est pourquoi "qui a vu cet enregistrement" est actuellement inexorable. C'est également la première question d'une violation de 164 402 euros. L'évaluation demande, donc cette lacune bloque à la fois le contrôle d'audit et le facteur à quatre facteurs. analyse. Couche de capture seulement; pas de schéma. Le magasin durable se trouve derrière PhiAccessLogWriter donc les sites d'appels peuvent être câblés maintenant et l'évier peut évoluer - une table simple, puis joindre uniquement à une chaîne de hachage, puis à une exportation signée vers un stockage immobilisé par objet sans onduler à travers des centaines de sites d'appel. Deux propriétés portent le poids: - La gestion des défaillances appartient au type d'accès, et non à l'appelant. EXPORTATION, téléchargement et DISCLOSE faillis: une exportation en vrac non logée est exactement l'événement que vous ne peut pas reconstruire par la suite, et "nous avons servi les données mais perdu l'enregistrement" est la pire réponse pour donner à un enquêteur. VUE, LISTE et RECHERCHE ouvrent et bâchement bruyamment, parce que perdre une ligne ne vaut pas la peine d'être retiré le produit. Que l'asymétrie est délibérée et veut signer plutôt que de supposer. Appelés sous pression, résoudre les questions de politique dans quelle direction les débloquer, donc la politique n'est pas sur le site d'appel. - Une lecture refusée est toujours une lecture. Les tentatives rejetées sont enregistrées, car l'accès Le schéma de quelqu'un qui sondage des dossiers qu'il ne peut pas atteindre est ce dont la détection a besoin et est invisible si les succès ne sont enregistrés que dans le domaine. Sécurité des start-ups, ce qui a failli mal tourner: PhiAccessRecorder est un composant et chaque composant de service scanne com.kamo, donc une dépendance dure à un haricot d'écrivain aurait eu une start-up contextuelle ratée pour les services de 40 euros à la fois - une plateforme entière une coupure d'une caractéristique que rien n'avait appelé. Le premier correctif, une configuration avec «ConditionalOnMissingBean, ne fonctionne pas: la configuration scannée par composante est traités à côté de la configuration de l'utilisateur plutôt qu'après, de sorte que les deux écrivains l'enregistrement et l'injection échouent en cas d'ambiguité. PhiAuditContextWiringTest a attrapé cela. La repli vit maintenant dans l'enregistreur via ObjectProvider.getIfUnique, où non la question d'ordonner existe, et les auteurs ambigus se dégradent à la défaillance plutôt que Décalage défaillant. L'auteur par défaut Slf4j est un point de départ, pas la destination et les lignes logarithmiques sont n'est pas d'altitude et le taux de rétention est de 14 jours pour une obligation de six ans. C'est existent de sorte que le câblage du site d'appel n'attend pas le magasin. Les identificateurs sont enregistrés, contenu n'est jamais: une piste d'audit qui reproduit le dossier qu'il vérifie vient a déplacé le PHI dans le flux de log.
· SecurityService
403 au lieu de 500 lorsque la frontière de mise en conformité refuse
Deux sites d'appels de featureService.enableFeature comprennent maintenant la limite HIPAA: - /cartes d'activation PhiModuleNotéPuissementException à 403 en ce qui concerne la raison, en miroir de la manipulation de l'AppliedModelViolationException directement au-dessus de celle-ci. Sans C'est ce qui est en dessous de la capture généralisée a transformé un refus politique délibéré en un 500. - La boucle auto-activable dans le chemin d'inscription pré-contrôles avec estPhiPermetted et sautes. Il court sur chaque type de service terminé tout en se contentant de « lister » et a les caractéristiques de l'organisation, donc lancer sur le premier module bloqué aurait fait les fonctionnalités de la page intensifiable pour un locataire de PHI au lieu de cacher une entrée. Inerte aujourd'hui - chaque organisation est capable de faire des affaires.
· kamo-shared-library
Appliquer la limite de conformité au niveau du commutateur de caractéristiques
Fils PhiTenantGuard en FeatureService, le point d'étranglement unique à travers lequel un Un module est mis en marche pour une organisation. C'est là que la frontière s'arrête d'être un objectif politique et commence à être l'exécution. Les deux moitiés, parce que l'un ou l'autre seul laisse un écart: - enableFeature throws PhiModule Not validetedException, de sorte qu'un locataire de PHI ne peut pas activer un module Kamo ne peut pas soutenir en tant qu'associée d'affaires. - isFeatureEnabled (Organisation, ServiceType) signale un module désactivé chaque fois que le locataire gère PHI et le module est à l'extérieur de la frontière, quel que soit le OrgFeature row dit. La ligne peut légitimement dire active - elle a été activée avant que le locataire ne devienne locataire d'un PHI, et permitFeature ne fonctionne plus cette transition. isPhiPermetted est le formulaire de non-rejet pour les appelants itératifs. Fonctionnaire Contrôleur auto-activer chaque fonctionnalité complète tout en "listing", donc un jet sur le premier Un module bloqué échouerait l'ensemble de la page des fonctionnalités plutôt que de sauter une entrée. PhiServiceTypeMapping lie ServiceType à PhiModule et est total, avec un test qui échoue à la base d'une valeur non carburée. Ce test a gagné son maintien en premier run: il a attrapé ServiceType.STORAGE, qu'un grep de l'entum avait manqué, et puis AI-CHAT, DOC-MANAGER, DOCS-EDITOR et DOC-CLASSIFIER. Sans elle, cinq services types auraient été silencieusement en dehors de la frontière - la même défaillance d'omission Le constructeur de PhiModule ferme, réintroduit une couche. Nouveaux modules pour les types de services précédemment non amorti, chacun avec un caractère explicite disposition: stockage d'objets, éditeur de documents et classificateur, tickets d'assistance, HR, l'inventaire, le traitement juridique, le calculateur et le flux d'activité sont à l'intérieur; les clubs et les jeux sont BLOCKÉ - TENDANCE-WORK au motif qu'il n'a pas été évalué, qui est un la raison de bloquer plutôt que de supposer. Chaque organisation est géréePhi-false aujourd'hui, donc cela ne change pas de comportement dans la production. Il devient porteur au moment où le premier locataire est signalé.
· kamo-shared-library
Auto-assign d'un numéro de prêt compatible MERS lors de la création d'une demande
LoanFile.loanNumber était nul à la création (création en blanc et sous-marin) et ne se contente d'en définir qu'un steward a tapé un - lequel MERS MIN bloquait la frappe (un segment à 10 chiffres du MIN est le numéro de prêt) et tous les en aval identifiant pour un prêt sans tête. AppMortgageService attribue désormais un numéro de prêt sur les deux sites de création: un nettoyant Chiffres à 10 chiffres (MinMinter strips non chiffres et a besoin d'un segment à plus de 10 chiffres, donc un nombre pur est la seule forme sûre), unique par org via le index (org-id, dollar des États-Unis) avec un réessai borné. Il FAILS OUVERT à nul sur une une tranche de collision ou une prise indisponible - dégradante au manuel précédent comportement plutôt que de rompre la création d'applications. Un prêteur fourni le nombre est toujours l'emporte par le chemin du patch du fichier de prêts. Pas de changement de schéma (le la colonne existe déjà, indexée).
· kamo-signer-monorepo
Dates de renouvellement du signataire dans le fuseau horaire résolu du destinataire
SigningSession gagne une solution requise (IANA id) que ESigService résout à partir de la zone membre du destinataire, puis de l'orge, puis UTC. WelcomeScreen maintenant le transmet explicitement à l'armateur, de sorte que la date d'expiration dépend de l'un ni de l'autre Réglages de l'appareil de visualisation ni par défaut UTC du fournisseur. Faire le domaine nécessité plutôt que facultative de capturer le site de construction d'une session littérale (preview.ts) au moment de la compilation. De même : - set d'appelRequestLocale dans la configuration de la localisation, de sorte que les traductions se lient à l'URL segment plutôt que de s'appuyer sur l'en-tête de l'intergiciel seul - affirmer dans le Dockerfile que les messages/ont survécu à l'élagage turbo, et documenter Pourquoi .dockerignore doit garder .gitignore hors du contexte de construction; sans que cela le couplage des chutes d'élagués les traductions et les navires d'image rendant des clés brutes sans que rien ne soit rattrapé jusqu'à ce qu'un signataire ouvre le document
· ESigService
Désoutirent le signataire afficher le fuseau horaire à partir du membre, puis org
Les dates de signature ont été rendues dans n'importe quelle zone à laquelle le client a failli, donc un Enveloppe expirant 2026-08-03T05:00:00 pourrait se lire "Aug 3" à un signataire du Pacifique pour qui le lien est déjà mort le soir du 2 août. SigningSession porte maintenant un temps de l'IANA résolu à résoudre par le serveur: le destinataire propre Member.timezone quand ils sont membres et ont établi un, d'autre part Organisation. fuseau horaire, sinon UTC. Signerzone est un résolveur pur avec des tests, y compris un qui affirme chaque carte de type TimezoneType à sa propre zoneId donc un nouveau la valeur de l'enum ne peut pas expédier un RangeError côté client. Corrige également SigningSession.locale, qui émet le nom enum ("SPANISH") plutôt que le code BCP-47 ("es") utilisé dans le segment local de l'URL de signature.
· InitializerService
Créer des HANDLES-PHI et PHI-EFFECTIVE-DATE sur les orgs
Rétroviseurs des deux nouveaux domaines de l'Organisation, après l'OrgBrandingFieldsMigration convention, donc les colonnes sont reproductibles sur n'importe quel environnement plutôt que seulement existent là où une carte ddl-auto s'est produite. Les locataires existants sont explicitement à l'extérieur. la limite de conformité. PHI-EFFICATIF-DATE est TIMESTAMP, et non TIMESTAMPT, parce que le champ d'entité est un LocalDateTime. L'essai est un dispositif de protection de la dérive, et non une reformulation: il lit les noms de colonnes sur le l'entité par réflexion et échoue dans la construction lorsqu'un champ d'entité n'a pas d'ALTER. Que est le mode d'échec réel de cette convention - quelqu'un ajoute un champ, oublie le migration, et avec ddl-auto:none dans les services qu'il fait surface en tant que production erreur de requête au lieu de l'heure de construction. Vérifié par mutation: enlever le L'ALTER fait échouer avec le message actionnable, le restituant devient vert. Les deux colonnes sont déjà présentes dans le cluster; ces ALTER sont idémpotents.
· kamo-shared-library
Persist handlesPhi et phiEffectiveDate on Organization
Dossier PhiTenantGuard avec une colonne réelle. Les bonnes rouges et les animaux de la compagnie ne sont pas des flocons de la dédulge suivant le modèle de l'alpha, de sorte que tous les locataires existants est explicitement en dehors de la frontière de conformité plutôt que silencieusement à l'intérieur. PHI-EFFICAVE-DATE donne une évaluation de la violation et une obligation de conservation Flanc de droite - "depuis quand" est la première question posée après "ce qui a été exposé". Convertir en politique avec le gardien Il reste lui-même libre de l'entité, de sorte qu'un appelant ne détenant qu'un drapeau encadré de session n'a pas à charger une ligne. Sûr à pousser: les deux colonnes existent déjà dans le cluster et chacune des 12 Les organisations se lisent faux. Vérifié contre information-schéma avant l'atterrissage manipules-phi booléen NON NULL DEFAULT false, phi-effective-date timestamp NULL. Voir la migration KamoInitializer pour la forme reproductible.
· kamo-shared-library
PhiTenantGuard et limite de conformité du module
La clé de voûte de la limite de conformité de la HIPAA: quels modules un locataire peut atteindre, étant donné que ce locataire traite des informations protégées sur la santé. Tout les clés en aval qui le désactivent, les intégrations sont désactivées, si l'AMF est forcée, quelles sessions obtiennent un temporisation plus strict, ce que la colonne vertébrale de l'audit doit couvrir. Ne porte pas de dépendance au schéma. Une tentative antérieure a raccroché cela une nouvelle Organisation.handlesPhi colonne et doit être reversée : clones de service CI partage-bibliothèque principale au moment de la construction tandis que KamoInitializer est géré à la main, donc un la colonne d'entité sur les ruptures principales du service suivant se déploie jusqu'à ce qu'une personne migre. Le découplage de la politique de l'entité, c'est-à-dire qu'elle atterrit et peut être appliquée maintenant, et la colonne devient une étape indépendante. Trois propriétés de la conception sont construites autour: -Etes-toi fermées. Le constructeur de PhiModule nécessite une PhiDisposition et une raison, donc un module ajouté plus tard ne peut pas hériter d'autorisation par omission - il ne sera pas compiler sans décision, et quoi que ce soit d'autre que PERMITTED nie. C'est le mode de défaillance d'une frontière de conformité doit survivre: un module navire, personne Pensez à PHI, une clinique commence à l'utiliser. - Un locataire non résolu n'est pas un locataire sûr. Le garde prend un tri-état PhiTenantStatus plutôt qu'un booléen, donc "Je ne pouvais pas charger l'organisation" ne peut pas être orthographié de la même manière que "cette organisation n'est pas PHI". Avec une booléen, le chemin d'erreur est autorisé(faux, ...) - facile à atteindre, impossible à repérer dans le cadre d'un examen. UNKNOWN nie tout. - Rien à élever. La décision est une fonction pure de (statu, module) sans l'appelant, la session, le paramètre droit ou dieu-mode. "Notre personnel d'appui peut l'activer off" est la réponse qui échoue à l'examen d'une entité couverte. Les dispositions suivent l'analyse de cadrage en kafales internes Permis: CRM, contacts, cave à document, e-mail auto-hébergé, signe électronique, notes, tâches, calendrier, chat interne, le syniste empilement de transcription/traduction, MLOS. Bloqué sans BAA pouvant être obtenu: social messagerie, Canva, synchronisation e-commerce, passerelle MCP. Travaux bloqués en instance: routeur d'IA, recherche RAG, enregistrements de réunions, enregistrements VOIP, campagnes de marketing, exportation d'analyses. Rien n'appelle le garde pour l'instant, donc c'est inerte jusqu'à ce que le câblé.
· InitializerService
Créer des HANDLES-PHI et PHI-EFFECTIVE-DATE sur les orgs
Rétrovise les deux nouveaux domaines de l'entité de l'Organisation en kôme-bibliothèque, à la suite de la convention OrgBrandingFieldsMigration. Les poules-PHI ne sont pas NULL FAUX DEFAULT FAUX de sorte que chaque locataire existant se trouve explicitement en dehors de la conformité la frontière plutôt que silencieusement à l'intérieur. Le TIMESTAMP n'est pas TIMESTAMP, pas TIMESTAMPT, parce que le champ d'entité est un LocalDateTime. SEQUENT - il doit fonctionner avant le prochain déploiement du service. Fiche de services kmo-shared-library à une version fixe qui est rééditée en place, donc la première le service à reconstruire après que ce changement de bibliothèque commence à sélectionner ces colonnes, et avec ddl-auto:non dans les services qui échouent jusqu'à ce que ce coureur soit exécuté. L'essai qui l'accompagne est un dispositif de protection de la dérive, et non une réaffirmation: il lit la colonne délimite l'entité par réflexion et échoue à la construction si un champ d'entité n'a pas ALTER. C'est le mode d'échec que cette convention a - quelqu'un ajoute un champ, oublie la migration, et elle apparaît comme une erreur de requête de production au lieu de construire du temps. Vérifié par mutation: supprimer le système PHI-EFFICATIF-DATE ALTER le fait échouer avec le message actionnable, le restaurer devient vert.
· ESigService
Émettre le segment local des signataires dans les liens de signature
Extraire le build Doublé d'octet pour octetSignLien dans SignLinkBuilder et ajoute un segment local provenant de l'Organisation.language, en baisse Retour à l'anglais pour les quatre valeurs de type Language sans traduction. Exige le kamo-signer /-locale-/ routage pour être déployé en premier.
· kamo-shared-library
Ajouter les poignéesDrapeau de locataire et PhiTenantGuard
La clef de voûte de la frontière de conformité de l'HIPAA: un drapeau par organisation plus a Garder décider quels modules cette organisation peut atteindre. Tout en aval les clés qui sont désactivées - quelles intégrations sont désactivées, si l'AMF est forcée, qui les sessions obtiennent le temporisation plus strict, ce que la colonne vertébrale d'audit doit couvrir. L'organisation gagne HANDLES-PHI (BOOL DEFAULT FALSE) et PHI-EFFICAVE-DATE, suivant le schéma existant. Défauts faux, Il s'agit donc d'une inerte pour le portefeuille hypothécaire et le livre CRM existant. Trois propriétés de la conception est construite autour: -Etes vives fermées. Le constructeur de PhiModule nécessite une décision de PhiDisposition et une raison, donc un module ajouté plus tard ne peut pas hériter de la permission par omission - il ne le fera pas compiler sans décision, et quoi que ce soit d'autre que PERMITTED nie. C'est le mode de défaillance spécifique d'une frontière de conformité doit survivre: un module navire, Personne ne pense à PHI, une clinique commence à l'utiliser. - Pas courtois. La décision est une fonction pure de (organisation, module) avec pas d'appelant, de session, de paramètre droit ou de mode de Dieu, donc il n'y a rien à élever. "Notre personnel d'appui peut l'éteindre" est la réponse qui échoue à un casssés. l'examen de l'entité. - Les dénis portent une raison, parce qu'un "refusé" n'est pas utilisable par un support un ingénieur ou un client. Les dispositions suivent l'analyse de cadrage en kamo-inter-inter-interne - Autorisé aujourd'hui: CRM, contacts, document coffre-fort, e-mail auto-hébergé, signature électronique, notes, tâches, calendrier, chat interne, empilement de transcription/traduction dans le groupement, et MLOS. Bloqué sans objet BAA: messagerie sociale, Canva, synchronisation du commerce électronique, passerelle MCP. Blocé en instance nommé travail: le routeur d'IA, la recherche RAG, les enregistrements de réunion, les enregistrements VOIP, la commercialisation campagnes, exportation d'analyses. Note de schéma: Les MOTEURS-PHI et PHI-EFFECTIVE-DATE se matérialisent sur le suivant KamoInitializer a joué, après que CI a publié cette version partagée. Rien ne lit le drapeau, donc l'ordre est sûr.

Votre univers vous attend.
Commencez gratuitement en quelques minutes. Ajoutez des produits quand vous êtes prêt. Pas de migration, pas de nouvelles connexions.
Gratuit pour toujours — aucune carte de crédit requise