Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

Chaque amélioration apportée à la plateforme, à mesure qu'elle est livrée.

  1. · kamo-shared-library

    Compter les dépenses d'aujourd'hui à travers les produits d'un membre en une seule demande

    Manage-Credits veut montrer, par membre, combien de pistes ils ont accepté ainsi Aujourd'hui, le total de la course à pied de la coiffe des dépenses du Max Daily est comparé à. - réponses pour un produit, de sorte qu'une grille serait payer une requête par membre x produit. Même dateFenêtre de passage, groupée par produit. Délibérément pas une deuxième définition de "aujourd'hui": l'appelant passe le propre début de la journée local du membre, exactement comme CreditLeadAssignmentService fait quand il applique le plafond, parce qu'un chiffre affiché à côté du bouchon qui compte un jour différent serait pire que nul.

  2. · kamo-shared-library

    Compter le pool assignable pour chaque produit fournisseur en une seule fois

    countAssignablePool répond pour un produit, de sorte qu'un appelant ne peut que poser des questions sur les produits qu'elle détient déjà. Gérer des Crédits itincrait des allocations pour décider ce qu'il faut demander, ce qui signifie qu'un produit n'est titulaire d'une règle de crédit pour rapport Aucune piste disponible - cependant, beaucoup étaient assis dans sa piscine. Onze fraîchement les produits créés ont montré 0 contre des pools allant jusqu'à 6 730. La disponibilité est une propriété du pool (produit, marché), qui ne fait l'objet d'un crédit de personne afin qu'il soit responsable sans un. Une requête groupée plutôt qu'une requête compter par produit.

  3. · InitializerService

    Indices composites pour les géolites-localisations

    Le pays est le seul indice sur un tableau de 80 429 rangées. Sur la base de la production: Résolution de la ville (pays et subdivision) indexé les 18 870 lignes américaines à conserver 984 pour la sous-marine (138 ms), et le cueilleur de pays a singuit les 80 429 lignes pour le retour 251 (168 ms). Furement additif, idémpotent, même 40001 réessai que les migrations de l'indice des frères et sœurs. Sans presque sur ce tableau - il est remplacé en gros par la synchronisation hebdomadaire GeoLite et jamais écrit sur un chemin de demande.

  4. · kamo-internal

    Montrez l'orge du demandeur et offrez la porte de l'utilisateur du système à son agent

    L'en-tête de discussion d'appui désigne désormais l'organisation de la demande d'où, Tous ceux qui travaillent la conversation et à personne d'autre - la personne qui l'a soulevée serait juste en train de lire leur propre en-tête, et il pousse le bavardage dans la fenêtre. À côté, pour un agent le serveur dit avoir le droit, un bouton qui ouvre que l'organisation dans un nouvel onglet signé en tant qu'utilisateur du système. Toute la durée du prédicat côté serveur et arrive comme un drapeau; le re-deruage de n'importe lequel d'entre eux ferait un second copie d'une règle de sécurité libre de ne pas être d'accord avec la première, et la copie qui dérive est systemUKERAccess.ts possède les deux choses que le client fait décider: le drapeau est lu comme ' vrai' (absent signifie que le serveur a construit la charge utile pour personne, ce qui n'est pas une décision), et le demandeur n'est jamais offert le bouton. Les ids membres sont comparés en chaînes - ils dépassent la gamme de nombres entiers exacts de JavaScript, et deux membres voisins autour du même nombre. L'échange lui-même est le flux d'intérêt/de mise en œuvre du système, y compris revendiquant l'onglet de manière synchrone avant l'attente: une fenêtre. ouvert qui s'étend après un est un pop-up le navigateur n'a jamais vu une personne demander, et Safari le bloque. Interaction Center - Chats - Support lignes gagnent l'organisme source, une puce d'état et le l'âge du billet. La puce est la même ConditionBadge la fenêtre de ticket et / utilisation de support, donc un statut ne porte jamais deux couleurs en deux endroits; sa carte d'étiquettes est maintenant exportée. l'aria-label de la ligne lit les mêmes mots plutôt que de tenir une deuxième liste de la les mêmes quinze statuts.

  5. · MediaService

    Nommez l'orge du demandeur, et l'accès de l'utilisateur du système de l'utilisateur lorsque le ticket déplace

    Trois choses, tout ça, un bureau de soutien qui répond à plus d'un locataire. Le détail du billet porte maintenant un verdict per-spectateur sur l'opportunité d'offrir "ouvert le l'orge de demandeur en tant qu'utilisateur du système", résolu par le partage SupportSystemAccessResolver - la même classe SecurityService re-sauvegarde avant la frappe Rien, donc rien ici ne peut accorder l'accès, seulement le révéler. La seule condition ajoutée localement concerne la CONVERSATION plutôt que la subvention: jamais le demandeur bouton. Il ne pouvait pas être frappé de toute façon, mais une fenêtre de soutien offrant au client un la porte administrative sur elle-même est alarmante, que la porte s'ouvre ou non - et sur un ticket widget, le "requisteur" est le membre du système de l'orge, qui est généralement le personne travaillant la file d'attente. MediaService est également le cas où cet accès à ENDS. Réaffecter, escalader, déplacer une A attribué et fermeture ou résolution d'un ticket attribué, tout revérifier tous l'agent qui l'a perdu contre l'organisation du demandeur; les ré-rédéléviseurs à partir de la base de données, un agent avec un autre ticket ouvert de la même ou de la couverture SYSTEM-USER Droit - garde leur session et aucun appelant n'a à fonctionner. Recontrôles de l'exécution après l'engagement: relire les lignes, cette transaction vient d'écrire est ce qui augmente un 40001 redémarrer sur YugabyteDB, qui prendrait la réaffectation avec lui. L'agent précédent garde la CHAT, délibérément - c'est le point de réaffecter plutôt que la réouverture - mais pas le locataire. Chaque critère de mutation répond au verdict sur le chemin de la sortie, parce que la fenêtre échange dans ce qu'ils retournent et toDTO ne sait rien de qui regarde; sans c'est le bouton qui a disparu au moment où un agent a touché la liste d'accueil prioritaire. C'est un effet secondaire vide plutôt qu'un emballage qui retourne le ticket: le formulaire d'emballage a transformé l'ensemble du corps de réponse en nul partout où ce service est moqué, que le des tests de contrôleur capturés. Enfin, requestorOrgName / requestorOrgIsPlatform sur le ticket (en vrac sur le le chemin de liste - requestorOrg est paresseux et une file d'attente est des lignes de différentes orgs de définition), et l'ordre, statut et âge du billet sur les rangées de soutien Chats-feed. L'âge est la création du billet, et non la dernière Activité: un ticket de trois jours calme se lit comme frais par activité et est la ligne la plus urgente de la liste.

  6. · SecurityService

    Monnaie d'un système de session d'utilisation pour le ticket ouvert d'un agent d'appui

    comme l'entoure une deuxième raison de dire oui. SystemUserEntryPolicy tourne l'appelant - dans les faits pris par SupportSystemAccessResolver, et ce résolveur Le même MediaService utilise pour décider si la fenêtre de support montre un bouton C'est la seule chose consultée. Le supportTicketId de l'organe de demande est consultatif: il va sur la ligne d'audit et n'est pas une contribution au verdict, donc nommer quelqu'un Le billet d'autrefois, un fermé ou un UUID aléatoire ne change rien. Une session de lecture de tickets est enregistrée auprès de SupportSysteSessionRevoker avant son la clé à usage unique existe, parce que l'OTK est ce qui le met dans un navigateur et une session qui Arrivait à un navigateur sans être trouvés ne pouvait être terminé que par son TTL. A La session de droit général n'est délibérément PAS enregistrée - rien à ce sujet ne peut expirer. et le déchirer sur une réaffectation expulserait quelqu'un qui aurait le droit d'être là. SupportGrantSweep re-rédède à chaque subvention enregistrée sur une minuterie comme solution de secours pour "MediaService est mort entre la réaffectation du billet et la révocation de la session"; il enregistre à WARN, parce qu'il s'y est fait signifie qu'une poussée a été manquée. Deux choses se sont fixées sur le chemin du passé: - La porte de l'utilisateur du système utilisée - qui lit administrateur ROWS uniquement. Le bouton /network est tiré de l'accès/me de la plate-forme, qui honore également les étages des propriétaires de haut niveau et des moufèces actives - de sorte que Le propriétaire de la plate-forme a vu ENTRE ENTRE LE MOMBRE ET obtenir un 403 de celui-ci. Les deux parties Maintenant, il se résout de la même manière, ce que cette catégorie prétend comme son invariant. - L'analyse des faits de la session (memberID, orgID, is OrganizationOwner, GD-godModeActive) est maintenant SessionPlatformFacts, lire une fois. Deux d'entre eux sont des étages qui accordent toutes les plate-forme droite, et un deuxième lecteur qui a obtenu godModeActive un peu faux seul, disons - distribuerait la plate-forme. La réponse transporte également l'URL de destination. /network construit le sien à partir de l'ordre. rangé qu'il tient; un appelant venant d'une conversation de soutien a un ticket et aucun domaine.

  7. · kamo-shared-library

    Laisser un ticket ouvert accorder à son agent l'orge du demandeur, et expirer avec lui

    Un agent de soutien doit se rendre à l'intérieur du locataire du client pour répondre au billet Ils tiennent. Jusqu'à présent, la seule façon d'y parvenir était la plate-forme SYSTEM-USER C'est-à-dire des organisations toutes et des organisations permanentes - bien plus que les besoins en main-d'œuvre. Ajoute une deuxième subvention beaucoup plus étroite et met les deux derrière un résolveur: - SupportSystemAccessResolver répond "que ce membre puisse entrer dans cette organisation en tant que l'utilisateur du système", par le droit-ouverture OU par un ticket ouvert qui lui est attribué et de cette organisation. MediaService le gère pour décider s'il convient de dessiner un bouton; SecurityService le fait revivre à partir de zéro avant de frapper une session, donc le bouton et l'action ne peuvent pas être en désaccord sur la personne qui peut l'appuyer. Conditions préalables tenir sur les deux chemins: un membre TEAM actif de l'org de niveau supérieur, jamais le système L'utilisateur lui-même, jamais l'organisme de premier niveau en tant que cible, jamais votre propre org. - L'allocation de ticket est DÉRIVÉE, jamais stockée, donc elle finit au moment de la dernière ouverture Le billet attribué par cette organisation est réaffecté, résolu, fermé ou annulé. Rien ne doit se rappeler de l'enlever. - Une session déjà dans un navigateur ne demande rien à personne, cependant, donc SupportSystemSessionRevoker indexe ceux qui ont frappé de cette façon et les détruit lorsque la subvention devient caduque. La suppression de la clé est le seul kill switch universel Chaque service lit les sessions du même Redis. Les noms clés en direct SupportSystemSessionKeys parce que deux services les écrivent et les lisent, et une faute de frappe présenterait en tant qu'agent en conservant discrètement l'accès aux affaires d'un client. Pas un «Service»: il a besoin d'un RedisTemplate, et d'un stéréotype partagé nécessitant un abaisse tous les services qui n'ont pas de Redis lors de son prochain déploiement. - est la seule définition de la "ouverture" de la subvention est suspendue on. Le nombre de PRE-TICKET (une demande de chat est la même unité de travail); résolu n'est pas résolu. Porter également requestorOrgName / requestorOrgIsPlatform sur SupportTicketDTO, et l'état, l'âge et l'orge du demandeur sur les rangées de support Chats-feed - une file d'attente de soutien qui répond que plus d'un locataire est illisible sans eux.

  8. · InitializerService

    Index membre - droits appliqués sur (member-id, le droit)

    Le tableau n'avait pas d'index du tout, tandis que chaque évaluateur sur elle se filtre de MEMBER-ID. À 10 524 rangées, la recherche de droits d'un seul membre était un balayage séquentiel complet mesurée à la production à 368 ms pour renvoyer 192 rangs, sur un tableau qui croît avec membres x droits. Élément pur, idémpotent, avec le même essai 40001 que les indices de grille de plomb, puisqu'il fait face à la propre passe ddl-auto d'Hibernate dans la même chaussure.

  9. · InitializerService

    Indices composites de plomb, et débloquer la course qui les crée

    La grille/leads filtre maintenant et les pages dans la base de données au lieu de l'expédition l'ensemble de l'organisation vers le navigateur. Avec seulement IX-LEADS-ORG-ID que délocaliserait le scanner plutôt que de le supprimer: le planificateur continue de lire chaque plomb dans le locataire et rejette ce que le filtre rejette. Quatre indices, chacun menant avec ORG-ID donc Yugabyte maintient la partitionnement du hachage sur le locataire puis se rétrécissant: affectation (le filtre derrière l'original Rapport sur 801 des 827 pistes de l'org le plus grand n'étaient pas attribuées, et un membre filtrage sur leur propre livre voulait sept rangées sur 1 427), marché et état (la barre de languette, appliquée essentiellement à toutes les charges), et dateCréité (le tri par défaut et le filtre de plage de date). Le ddl-auto d'Hibernate les créerait à partir des annotations d'Index dans le Même botte, mais elle émet de l'indicateur CREATE sans non-EXPIAN et hirondelles l'échec, ce qui rend "fait-elle en fait atterrir" sans réponse à la loge. Expliciter, idempotent et rejugé ici à la place. Élément pur, de sorte que la règle de la loi du DROP ne s'applique pas, mais la résolution 40001 est en train de prendre, puisque cela se dispute avec ces mêmes pas ddl-auto plus tôt. IX-LEADS-ORG-ID est laissé en place mais maintenant redondant: abandon d'un indice a la course passe peut-être tout simplement à ne pas recréer est la façon dont une table se termine avec Ni l'un ni l'autre. LeadContactPointSeedRunner a dû changer pour que l'un de ces éléments puisse fonctionner. Il a été mis en page avec findAll(Pageable), que Spring Data exécute en tant que contenu SELECT plus un mois de financement en une seule opération en lecture seule - donc le COUNT n'est jamais la première déclaration, et Yugabyte ne peut que refaire de manière transparente une lecture redémarquer sur la première déclaration. Parce que le coureur écrit des points de contact entre les pages, elle fabrique son propre redémarrage. Latent jusqu'à ce qu'il y ait eu suffisamment non-enseintré conduit à la matière; à 851, il a échoué purement: 40001 Restart read required ... la couche de requête n'est pas possible on: sélectionner count(l1-0.uid) parmi les fils Cela a avorté l'ensemble de la course à l'ordre 99 et a pris chaque migration ultérieure avec lui-même, y compris celui-ci. Remplacé par un balayage du jeu de clés (uid:afterUid, une déclaration par lot, pas de solde), qui survit également aux encarts intermédiaires d'une manière que l'OFFSET ne l'a jamais fait.

  10. · kamo-internal

    Offre Nom de l'entreprise en champ d'importation cartographié

    leadFields.ts est la liste tirée par la toile de cartographie, et il doit refléter le Interrupteur backend dans LeadImportController - un chemin manquant de part et d'autre est accepté par l'UI puis silencieusement ignoré. companyName manquait les deux, l'affaire du backend a atterri à côté de cela. Marchés configurés avec la société incluant la société et les vrais (listes d'exploitations agricoles B2B) avaient précédemment pas de colonne pour cartographier la raison sociale.

  11. · SecurityService

    Carte companyNom de sorte qu'un tableur peut porter le nom commercial

    setDireFieldOnCreateRequest n'avait pas d'affaires de nom de société, donc le champ était inaccessible par l'intermédiaire de l'assistant d'importation manuelle, même si CreateLeadRequest porte Il et Lead.create Lead persistent déjà (tronqué à 50 caractères). Sur un marché avec Inc.Company - true qui a laissé des importations B2B sans logement pour la raison sociale. Assume le cas correspondant dans LeadIntakeRecessingJob de DaemonService et le nouvelle entrée de champ dans le kamo-internal's leadFields.ts - un chemin non présent dans les deux la liste frontale et le changement de backend sont ignorés silencieusement.

  12. · DaemonService

    Laisser une compagnie de transport de charge utile cartographiéeNom et source

    Le commutateur de champ direct de l'emploi d'admission s'est arrêté à vendorLeadID, donc un mappage sur companyName ou source a été accepté par l'interface utilisateur, stocké sur le point d'extrémité et puis silencieusement basculé lorsque la charge utile est devenue une CreateLeadRequest. Les deux domaines existent déjà sur le DTO et sont déjà honorés par LeadService.createLead Seuls le changement de poste leur manquait. Il s'agit de marchés en forme d'entreprise (comprenant la société et vrai), où Le nom commercial est l'identité du chef de file et il n'y avait auparavant nulle part où le dire.

  13. · kamo-marketing

    Remettez le groupe balayé du titre

    Restauré exactement comme c'était - même gradient à deux couches, même bande de 120 degrés, identique 9s/1.1s chronométrent et assouplissements après l'avoir retiré dans la carte de composition. Le coût est précis et vaut la peine d'être déclaré plutôt que de partir à la redécouverte: il est la seule animation sur cette page qui ne peut pas être composite, parce qu'un Le balayage à clé de texte est en train de déplacer la peinture à l'intérieur de la forme de glyphes et n'a pas de transformation ou l'opacité l'exprime. Mesurée avec getAnimations(): bureau 2 - 3 (le bureau supplémentaire est celui-ci) mobile 1 - 1 (inchangé) Le mobile est inchangé parce que le kill-switch de '767px'switch est déjà réglé 'animation: aucun ici, et mobile est l'endroit où le score de performance est mesuré. A téléphone rend le remplissage au repos et rien ne boucle. Les 25 autres éléments de la l'audit initial sur le compositeur. Le commentaire sur la règle dit maintenant tout cela, y compris que la tâche masquée workaround a été essayé dans cette base de code et mesuré moins bien (34 - 41), donc personne Re-derue cela à ses dépens. Vérifié par lavage de l'animation à la trame où la bande croise - résolue pour elle plutôt que de deviner, puisque le relâchement est chargé en face et à l'œil tempéraments maintenus à l'atterrissage après le col et à l'écran à 2x: la bande d'olives est à la tête du titre, absent dans le cadre garni.

  14. · kamo-internal

    Reproprié Modifié pour convertir et fixer deux icônes d'onglet

    Les deux onglets portaient une icône qui signifie déjà quelque chose d'autre dans cette grille: Modifier l'onglet utilisé GetApp, le bouton de téléchargement au niveau de la ligne et convertis usagé EditNote, le bouton d'édition ouvert au niveau de la ligne. Ils portent maintenant DesignServices et PublishedWithChanges. Le titre du panneau à l'intérieur de l'onglet Modifier toujours lire "Préparer sélectionné" dans Anglais codé en caractères durs; il réutilise le message de l'onglet pour que les deux ne puissent pas dériver.

  15. · kamo-internal

    Choisir quelle page un lien de suivi atterrit sur

    Un code n'est pas lié à une page - le site de marketing le capture à l'échelle du site - donc le site La question réelle de savoir si le passage à l'autre est celle où le visiteur doit atterrir. Le produit n'avait pas de réponse pour cela: le membre a obtenu un seul lien vers la page d'accueil et a dû activer une URL pour envoyer n'importe qui à la tarification, qui est exactement où une frappe silencieusement coûte une saisine. TrackingLinkPicker offre les six portes avant pour un code, chacun à partir de le presse-papier: domicile, tarification, intégrations, offre d'oiseaux précoces, contact et réservation une démonstration. Il ouvre le moment où un code est frappé - générer un lien et obtenir un vous pouvez coller sont les mêmes courses - et encore à partir du menu de la ligne, qui dit maintenant "Obtenir des liens" au lieu de copier l'URL de la page d'accueil. /l'offre n'est pas délibérément l'une d'entre elles. Il répond à HTTP 200 et sert le "Non Page trouvée ", qui est le pire type de lien brisé: rien ne le rapporte et le Visiteur juste quitte. La page réelle est /fin/prix, et la liste est un dactylographié module avec ce raisonnement écrit de sorte que personne n'ajoute la jolie chemin en arrière. Toute la ligne est le bouton - une icône de copie 24px à côté de 400px de texte inerte qui L'apparence claire cliquable est un objectif que les gens manquent - et la confirmation est par ligne plutôt qu'un toast, parce qu'un toast ne peut pas distinguer six liens presque identiques. La puce d'icône se déplace à un chèque, une marque souligne les balayages sous le rabais segment, et le virage d'entrée est coiffé de sorte que la sixième ligne n'est jamais assez tardive lire comme un dialogue lent. Le mouvement réduit éteint tout. L'état de réussite de la dialogeuse de la création est parti avec ceci: il a montré un lien et est Désormais inatteignable, de sorte que lui et ses importations sont éliminés plutôt que laissés pourrir.

  16. · kamo-marketing

    Montrer un alambic de la bobine au lieu d'une impulsion grise

    Ajout public/img/hero-still.webp 1280x720, correspondant à l'ouverture 16/9 C'est exactement - et c'est ce que le héros montre jusqu'à ce que quelqu'un presse. Cela corrige également un bug le changement de claquement de jeu introduit et j'ai raté. Le Élément 'vidéo' porté 'opacity: reelWanted' ? 1 : 0, ce qui était juste pendant que le bobine commencée par elle-même: l'élément est apparu une fois les portes ouvertes, afficher et tous. Avec la lecture maintenant fermée sur un robinet, «reelWanted» reste faux pour chaque le visiteur qui ne le presse jamais - donc l'élément, et donc son affiche, a été invisible pour toute la visite et l'ouverture ont montré le pouls de squelette à la place. Il met la clé sur l'affiche en cours d'élaboration. Le squelette est corrélativement réduit à ce qu'il était toujours censé être: l'écart avant l'arrivée, plutôt que quelque chose qui attend sur le canplay, qui ne s'enflamme jamais sous « non » jusqu'à ce que la bouvée soit demandée. Trois changements plus mineurs découlent du contenu encore plutôt que d'un espace réservé: Local, pas le thème kamo13-poster.jpg. Pour la plupart des visiteurs, Le cadre est le héros pour toute la visite, donc il expédie avec l'application. Qualité 50, pas 30. Trente a été choisie pour quelque chose qu'une vidéo peinte sur dans un délai d'une seconde; les artefacts à cet égard sont des artefacts dans la page. Par l'intermédiaire de la l'optimiseur est de 1,5-3,7 KB d'AVIF selon l'ergot - la source est 22 ko de WebP. Plus de porte de ralenti. In-view continue de gagner son donjon, parce que sur un étroit l'arrêt de cette ouverture se trouve sous le pli sous la colonne de copie. Attendre pour que le fil principal se taise en plus de cela était la prudence due à la Vidéo multi-mégaoctets derrière elle; faire arriver une image de 2 KB en retard maintenant signifie un regard plus long sur rien. Vérifié dans Chrome: avant que le robinet de l'affiche soit réglé, l'élément calcule pour opacité 1, le squelette est absent et des demandes de médias nuls ont été faites; après c'est le temps courant avance de 1,1 à 3,6 à 8,6 s de mensonge. Console et DevTools Issues Clean, 22 demandes, toutes les gardes passent.

  17. · kamo-internal

    Construire le lien partagé en tant que ?discount-uuid

    buildTrackingLink émet le nouveau paramètre, et la bande de liaison met en évidence la Le segment de l'escompte qu'il a utilisé pour mettre en évidence en tant que "mrt". Le jeton lui-même est maintenant un UUID frappé côté serveur, donc rien ici ne le déduit ou ne le met en forme. Renomme également une image clé et un id de titre de tiroir qui porte toujours l'ancien préfixe.

  18. · kamo-register

    Lisez les cookies de réduction et envoyez les champs de réduction

    Suit le site de commercialisation: kdsc'vid / kdsc'src, avec ?discount' une demande de repli d'un site d'information pour un visiteur qui atterrit sur le formulaire de registre avec le lien toujours dans la barre d'adresse. Les champs corporels deviennent réduitsVisitorGuid / discountCode; SecurityService lit les deux noms pour une libération afin que les deux soient déployés n'ont pas besoin d'être simultanément.

  19. · kamo-marketing

    Le paramètre de renvoi est «discount» et le jeton est un UUID

    Le lien entre les parts d'un membre est - Il était auparavant qui met un vrai membre id dans chaque URL partagée et Que l'on puisse énumérer les autres campagnes de ce membre en comptant à partir de .1. Le validateur change de forme avec lui - un modèle UUID au lieu de chiffres-touchet et continue à faire le travail pour lequel il a été ajouté : valider, ne jamais tronquer, parce que le tranchage par unité de code UTF-16 peut réduire de moitié une paire de substituts et encodeURIComponent lance URIError sur un seul substitut à l'intérieur middleware(), qui est un 500 sur le page. Hex et traits d'union ne peuvent pas exprimer un substitut. Les biscuits suivent le vocabulaire: le cokrt-vid/kmrt-src devient kdsc-vid/kdsc-src, le bacon est DiscountBeacon, le collecteur est /api/discount et le garde-porte est check-discount-cookie. La demi-restauration aurait laissé un paramètre de réduction stocké dans un cookie de la ville lu par MrtBeacon, qui est exactement la dérive qui coûte quelqu'un plus tard. Les biscuits expédiés il y a quelques heures, donc presque aucun n'existe dans le sauvage à l'orphelin. Les fixations de garde affirment maintenant la nouvelle forme et, en particulier, que la LED Le formulaire de l'association memberId.iteration est rejeté.

  20. · SecurityService

    Acceptez les champs d'inscription à la réduction, gardez les mrt- qui fonctionnent

    Le site d'enregistrement envoie maintenant discountVisitorGuid / discountCode. Les deux noms sont lire, nouveau d'abord, parce que les deux services se déploient indépendamment - pour le procès-verbal entre les déploiements d'un côté parle encore le vocabulaire précédent, et le coût d'avoir tort est une signature qui ne gagne en silence rien à son référent. La rupture de la mrt peut aller une fois que les deux côtés sont sortis pour une libération.

  21. · MediaService

    Monnaie un jeton UUID opaque, en un seul encart

    createCode génère le jeton lui-même, donc il n'y a rien à lire en premier et Rien pour deux onglets d'entrer en collision. Cela enlève l'ensemble de l'appareil l'ancien jeton séquentiel nécessaire: l'égalise max(ité) 1 lire, la détection de collision réessayer, et le modèle de transaction REQUISITE qui est en train de réessayer, car un unique - la violation avorte la transaction qu'elle a eu sur YSQL. Un épargne, c'est fait. Une collision UUID n'est pas un cas digne d'être écrit pour un code; l'indice unique sur CODE reste comme le filet de sécurité si impossible échoue fort plutôt que tranquillement attribuer le trafic de deux membres à une rangée.

  22. · kamo-shared-library

    Faire du jeton partagé un UUID opaque

    Le jeton public était 'memberid'. itération, ce qui était faux sur deux points. Il a publié un membre réel id dans chaque lien que l'on partage - sur une carte de visite, en une signature par e-mail, dans la boîte de réception de quelqu'un d'autre - et cela a fait tout l'espace , un lien vous a dit le membre, et compter à partir de .1 énuméré leur d'autres campagnes. Un concurrent pourrait voir combien de gens court, et n'importe qui pourrait forger un code plausible pour un membre qu'ils n'avaient jamais rencontré. CODE détient maintenant un UUID aléatoire et le paramètre URL est ?discount. La colonne, sa longueur et son indice unique sont inchangés; seulement ce qui y va se déplaçait. L'ITERATION et l'on s'en vont. Leur seul travail a été séquençage de ce jeton, et séquençage est ce que le max(itération) forcé est supérieur ou égal à 1 a. lire-alors-write deux onglets peuvent tous deux gagner, ce qui nécessitait une contrainte unique pour attraper, a réessayer de récupérer, et qui réessai dans une transaction MARQUE-NEW parce qu'a unique - la violation avorte la transaction dans laquelle elle s'est produite sur YSQL. Tout cela existait pour défendre un nombre dont personne n'a besoin. Un UUID n'a rien à faire pour entrer en collision; l'unique L'indice sur le CODE reste en tant que filet de sécurité. Le jeton est délibérément encore une colonne plutôt que la clé primaire de la ligne, même Bien que les deux soient des UUID. Les séparer est ce qui rend un lien revérable: un jeton qui est raclé, spammé ou imprimé sur le mauvais dépliant peut être remplacé en place tandis que les visiteurs, les événements et les transformations déjà attachés à la rangée séjournent où Ils sont - et il maintient l'identifiant des adresses API authentifiées des URL publiques.

  23. · InitializerService

    Retraite

    Les codes de suivi sont partagés dès maintenant. Le vieux jeton "memberid" a publié un vrai membre id dans chaque lien partagé et rendu l'espace accessible à pied un lien nommé le membre, et compter à partir de .1 énuméré leur autre campagnes - donc le jeton public a déménagé dans un UUID opaque dans le CODE existant la colonne et l'ITERATION n'ont plus d'emploi. Ceci ne peut pas attendre Hibernate: ddl-auto ajoute des colonnes et ne les laisse jamais tomber, et L'ITERATION n'est PAS NULL. L'entité arrête de le cartographier dans le même changement, donc à partir de au moment où la nouvelle bibliothèque partagée expédie chaque INSERT omet une colonne le tableau demandes constantes. C'est en rien qu'il faut. La contrainte unique composite va avec elle - il n'existait que pour arrêter deux des menthes concurrentes prenant la même itération, et un UUID aléatoire n'a rien à Il se heurte à des collisions. Ordre 0 pour la raison habituelle ici: tout coureur qui charge un une entité de commercialisation émet les colonnes cartographiées dans son SELECT.

  24. · kamo-marketing

    Servir un CSP réel par demande nonce avec une dynamique stricte

    Élimine les deux résultats élevés restants sur le script-src: le "non-safe-inline" un et "les listes d'hôtes peuvent souvent être contournées". Seul un non-ce avec une "stricte-dynamique" en éclaire, et Next ne peut pas en fournir un sur un une page pré-rendulée - un nonce doit être unique par réponse, donc Next émet un seul pendant le rendu, et une route préreproduite est servie à partir de la cache pleine route sans rendu. Le contournement documenté est de rendre chaque route dynamique, qui détruirait le rendu statique de ce site dépend et s'effondrerait «Lien» pré-extraction à un arbre de route nue. Donc le nonce est appliqué où les octets quittent le processus. serveur-nonce.js commence le serveur autonome sur le bouclage, dessert le port public lui-même, et estampille chacun Réponse HTML sur la voie à suivre. Ensuite, il continue à se prérendre et ne cesse de servir de son propre cache; mesurée à travers l'emballage, /en/pricing encore préfetches 77,521 octets avec 23 références et réponses x-nextjs-cache: HIT. Rendu statique et un vrai nonce tournant, les deux. "strict-dynamique" est ce qui prend sa retraite la liste de réception: les navigateurs ignorent l'hôte les listes de permis sous- elle et de trusts de scripts créés par des scripts déjà concrets. Le widget de chat et le tracker analytique sont injectés par le suivant/script à l'heure d'exécution, donc ils sont fiables de manière transitoire et n'ont pas besoin d'une entrée autorisée du tout. "non-couvrement" et https: restez seulement comme la solution de repli documentée pour les navigateurs trop vieux pour comprendre nonces, qui n'ignorent ni l'un ni l'autre et n'obtenaient rien avant. Trois choses cela a été apparue, dont aucune n'aurait été visible de la Configuration: Le transfert de la demande CSP en amont est un piège. On lit ensuite un nonce à partir de lui et emboutit ses propres scripts - alors ce rendu va dans le cache plein de route avec le nonce cuit, donc chaque visiteur plus tard obtient 96 étiquettes portant un mort nonce. Sous «vircinisation» d'une nonce périmée ne se dégrade pas, il bloque: a page blanche jusqu'à l'expiration de l'entrée. La demande CSP est déshabillée à la place, et tout attribut nonce préexistant est supprimé avant l'estampillage. Réécrire l'hôte en amont pour faire des redirections. Prochaines constructions URL de redirection absolue de l'hôte, donc a répondu Localisation: http://localhost:41337/en. L'hôte est transmis sans modification, et une redirection pointant sur notre propre rebouclage est effondrée vers un chemin d'assurance. La compression a dû bouger. L'orbite est demandée pour que le HTML puisse être Reécrit sans aller-retour décompress/recompresse, et emballage recompresse et brotli où le client le prend, qui est de 30 177 octets contre les 56 324 gzips servis auparavant. scripts/check-csp-nonce.mjs tient le contrat jusqu'à la fin de chaque construction: bottes l'application construite derrière l'emballage et affirme que l'en-tête porte un nonce et "turmante stricte", que TOUTE tag de script porte un nonce, que tous sont Cette réponse est, et qu'elle tourne entre les demandes. Il a attrapé la non-ciel bug lors de sa première course. Un nonce fixe satisferait l'audit tout en étant lisible par n'importe qui, donc le contrôle de rotation est le point plutôt qu'une formalité. Demande de mémoire 128Mi - 256Mi: HTML est tamponné pour être estampillé, donc la mémoire de pointe maintenant des échelles avec des requêtes HTML concurrentes au lieu de s'asseoir à plat.

  25. · kamo-marketing

    Appliquer les types de confiance, le champ d'application du script allowlist

    Élimine le "sans contenu-sert-politique avec la directive Trusted Types" trouvé" en déplaçant les types de confiance en matière d'exigences pour la politique appliquée. Il s'agit d'une preuve plutôt que d'une deuxième supposition. Il a expédié uniquement les rapports. d'abord et la console est revenue avec des violations des types de confiance, qui est exactement la preuve nécessaire: enregistre uniquement les journaux de rapport une violation pour chaque puits atteint sans politique, donc aucune violation ne signifie que la politique de défaillance a été mise en place de tous. Ce qui a rendu cela vrai était de laisser tomber le prochain/l'écriture pour une ligne claire Le placement est en charge. Rétrécit également le script-src des hôtes aux chemins, qui est le "host allowlists can être souvent court-circuité" trouvé pris à la lettre. Sur le thème.kamocrm.com qui était n'est pas hypothétique: c'est le seau à thème d'orgg, les locataires en marque blanche téléchargent leur propriétaires d'actifs, et script-src https://theme.kamocrm.com locataires déposent un fichier .js dans leur propre seau et demandez à ce site de l'exécuter. Uniquement /public/widget/ est exécutable maintenant - le chargeur et son bouquet haché vivent tous deux Là-bas, et l'analyse est insérée dans le fichier de suivi exact.

  26. · kamo-internal

    Montrer quand le crédit d'un visiteur a été transféré à un autre lien

    Le calendrier gagne ATTRIBUTION-MOVED, en signe d'avertissement - pas une conversion et non un échec, mais le moment où ce visiteur a cessé d'être ce membre à gagner, qui vaut la peine d'être remarqué. L'union de type événement gagne la valeur de sorte que l'étiquette résout au lieu de tomber dans la formulation de la page.

  27. · MediaService

    Déplacez le crédit sur un maillon plus récent, et enregistrez le moment où il se déplace

    Le travailleur ingest appelle maintenant reattributeWhileAnonymous après les accidents de la circulation. La méthode du référentiel porte l'ensemble de la règle, donc il n'y a rien à vérifier ici et pas de fenêtre pour traverser: un retour de 1 signifie crédit réellement déplacé à la lien ce visiteur vient d'arriver, 0 signifie qu'ils sont revenus sur le même ou eux ont déjà un compte et leur parrainant les garde définitivement. Seul le code attribué se déplace. Les bosses de visite et de page-demande ont déjà crédité le code qui servait cette vue de page, qui reste vrai cependant l'attribution terres. Un déménagement écrit une ligne ATTRIBUTION-MOVED sur la chronologie du visiteur, après la page Regardez donc les deux lire dans l'ordre où ils se sont produits. C'est le seul événement dans ce qui change ce qu'un membre doit sans que personne ne fasse quoi que ce soit de mal, Il vaut donc la peine d'affirmer purement et simplement plutôt que de laisser être déduite plus tard. Le gestionnaire d'inscription résout le code sur l'enveloppe et, lorsqu'il nomme un live l'autre, estampille le compte et règle l'attribution dans la même déclaration. C'est le cas de la balise peut manquer entièrement - inactif-d'après-demissine, au plus une fois par page, et un visiteur peut suivre un lien et aller directement sur le formulaire de registre. Retraité les codes se résolvent à l'annulation et laissent l'attribution seule, donc un lien qui a cessé de gagner le crédit par le biais de la balise ne peut pas recommencer à gagner par la porte de l'inscription.

  28. · kamo-shared-library

    Crédit le lien le plus récent jusqu'à l'existence d'un compte, puis le congeler

    L'attribution a été gelée au premier coup, ce qui fait mal le cas: quelqu'un qui suit le lien du membre A en mars et le membre B en juin, et seulement dès lors En haut, a été amené par B. Le premier contact paie A pour une visite qui n'a mené nulle part et payant B rien pour celui qui a été converti, et aucune arithmétique en aval ne peut réparer une l'attribution, c'est tout simplement faux. Donc le crédit suit maintenant le dernier lien sur lequel le visiteur arrive - pour exactement comme Tant qu'ils sont anonymes. Une fois qu'un compte existe, il s'arrête de se déplacer en permanence. Cette moitié compte tout autant : le membre qui le parraine l'a gagné, et si un Par la suite, le lien pouvait quand même déplacer le crédit, alors n'importe quel membre pourrait prendre le client d'un autre en les faisant clic une fois, tandis que l'on org l'accroche et le fait de les payer, qui débarquent semaines après l'inscription - dériverait vers celui qui était le plus récent cliqué plutôt que celui qui a effectivement amené le client. ReattributeWhileAnonymous porte l'ensemble de la règle dans une MISE À JOUR conditionnelle (code différent ET signedUpAt IS NULL AND userId IS NULL), donc il n'y a pas la fenêtre de lecture-écriture pour deux balises, ou une balise et l'inscription elle-même, pour la course à travers. Le ' sur le code id le maintient à des mouvements réels, ce qui permet le L'appelant traite une déclaration de 1 comme "le crédit a effectivement changé de mains" et l'enregistrer. markSignedUpAttributedTo réglé le compte et le crédit en un seul déclaration, fermer la fenêtre du chemin d'ingestion ne peut pas: la balise est différée au ralenti, donc un visiteur qui suit le lien d'un deuxième membre et va directement à la Un formulaire d'inscription peut s'inscrire avant tout rapport de balise qui se rend. Les compteurs restent sûrs car le gel et la première conversion sont les mêmes moment - au moment où n'importe quelle colonne de l'AT peut être estampillée, l'attribution est déjà fixée pour la vie du visiteur. La circulation n'est pas affectée dans les deux cas: visites et page les demandes appartiennent au code qui les a servies. L'ÉVÉNÉE DISPOSITION ATTRIBUTION-MOVED donc un membre dont le visiteur a déménagé vers quelqu'un le lien d'autre rapport peut voir exactement quand c'est arrivé, plutôt que de le déduire d'un code id qui diffère tranquillement.

  29. · kamo-internal

    Déplacer Windows Desktop et Master Machine en Admins de Plateforme

    Les deux sont des cibles guacamole qui partagent un seul titre entre tout le monde, qui les faire de l'outillage opérateur plutôt que de l'espace de travail d'un membre. Ils étaient options de navigation top-bars gated sur 'ctx.isGod', donc chaque dieu portait deux icônes pour les machines qu'ils touchent rarement, les deux traînantes, inébranlables et interrogeables la palette de commandes comme une caractéristique ordinaire. Ils sont maintenant en deux boutons à gauche de "Add platform admin" sur Paramètres - Administration de la plate-forme - administrateur de la plate-forme, à côté de la machine de développement contrôle qui administre déjà la troisième cible KamoDesktop. La porte est à partir de la charge utile de l'onglet - la lecture du serveur de 'users.is'god', jamais une dérivation côté client - et DesktopSsoCutteur toujours nécessite Dieu seul, donc les boutons ne reflètent qu'une réponse que le point d'extrémité donne indépendamment. DesktopLinux reste dans la navigation: il est à disposition, par membre et personnel. La suppression des deux entrées de registre supprime leur placement de la navigation, leur base de lancement cartes, leurs entrées de palette et leurs clés d'action; résolutionNavLayout déjà gouttes stockées ides qui n'existent plus, de sorte qu'un membre qui les avait arrangé garde un la disposition valide sans migration. Le test devMachineGate affirme maintenant qu'ils sont absent plutôt que d'être rité.

  30. · kamo-marketing

    CSP et COOP appliqués; rapports de Trusty-only

    Retirer les en-têtes de sécurité après que j'ai pris le site avec eux, moins le une directive qui l'a fait, plus un garde-fou de construction pour qu'elle ne se reproduise pas. Qu'est-ce que l'on entend. «exigence de type confiance-pour 'script') n'est supportable que si une police Le «default» existe avant les premiers incendies de puits de DOM. La mienne n'a jamais couru. Le La politique a été rendue à partir de app/[locale/layout.tsx, qui ressemble à une mise en page racine et n'est pas - il y a une app/layout.tsx au-dessus de lui - et -next/script stratégie - "avant Interactive" - n'est honorée que dans la vraie racine. Prochains rétrogradés ailleurs, sans avertissement. Donc la page chargée, l'hydratation a commencé, et chaque évier jeté: réact-dom sur "innerHTML", chargeuse en chunk de Turbopack sur "script.src", neuf refus TrustedScriptURL, puis l'écran d'erreur côté client de Next. Mon raisonnement avait été qu'aucun puits ne pouvait tirer avant la politique parce que tous les 78 Des pousses de données de vol sont dans le corps. C'était la mauvaise question. Le cadre les propres étiquettes d'écriture sont hissées dans la tête et exécutent dès qu'elles sont hissées. télécharger - ils n'attendent pas le corps, et ce sont eux qui ont lancé. En le rabais sur la rue RÉEL n'en a pas fini. Mesurée, non supposée: app/[locale-/layout.tsx policy - 12 678 premier script async - 1 593 Politique app/layout.tsx (racine) : 12 678 première écriture async : 1 730 React hoists 'script async src' au-dessus de tout ce qu'une disposition rend, donc il y a pas de position dans l'arbre qui gagne. Les autres options sont pires que la problème: réécrire le flux HTML dans l'intergiciel met une transformation per-demandeur dans face avant de chaque page pré-renoulée et des pauses en streaming, et un CSP non porteur a besoin d'en-têtes(), qui laisse tomber 200 dollars d'itinéraires de sortie statique et coûte la pré-extraction de ce site dépend de. Les navires de ce type de confiance sont la suivante: déployés et les violations sont visibles; un en-tête réservé au rapport ne peut rien bloquer. L'élément phare reste rouge, et c'est l'état honnête plutôt qu'un une politique de répercussion qui le rendrait vert tout en ne protégeant rien. Le garde est le véritable produit. la construction de la directive si la directive est appliquée pendant que la politique est émise après le premier script de cadre asynchronisé, et imprime les deux offsets et le correctif. Il fonctionne allumé avant l'essai de prébuild et de npm. Rien dans cette défaillance n'est visible pour les types, les peluches ou la construction - uniquement l'ordre octet de l'Empe HTML - c'est pourquoi il avait besoin d'un vérifier plutôt qu'un commentaire. Exercice et vérifiée par rapport au véritable serveur autonome: CSP sans directive de confiance, COOP, référence-politique, injonctions-politique, X-Options de type de contenu. Vérification de la ressource de la page desservie par rapport à la page Politique finale: zéro bloqué, et "inline-safe" couvre les 86 scripts en ligne.

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