Aller au contenu
KAMOUniverse

Changelog

Ce qui est nouveau.

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

  1. · VOIPService

    Appels péristes et appels associés, SMS et messagerie vocale à des pistes

    Les appels n'ont jamais été enregistrés sur le site de VoipCallEventService a publié un événement NATS pour le navigateur et ne conservait rien, et les RECORDINGS n'existent que lorsque l'audio était capturés. La synchronisation per-instance extrait maintenant l'historique des appels à travers le PhoneProvider abstraction et ups PHONE-CALL-LOG, mis à l'appel du fournisseur, id. C'est la seule voie qui fonctionne pour FreePBX et Microsoft Teams, ni l'un ni l'autre de qui offre un webhook utilisable par appel. Le balayage est l'écrivain unique. Persistant du webhook RingCentral aussi a été jugé et supprimé: sa notification porte la téléphonieSessionId alors que la call-history API retourne un enregistrement différent id, donc les deux scénaristes ont produit deux lignes et deux entrées de chronologie pour un appel. Les appels ne sont attribués à une prolongation que lorsque cette extension est effectivement sur le Appel. Le point de terminaison de RingCentral est l'extension/- et ignore l'argument, donc la boucle par extension, sinon, déposerait les appels de chaque membre sous la rubrique boucle visitée en dernier. Les identificateurs d'enregistrement sont résolus par page via RecordingLookupService, le même l'enrichissement de l'historique du softphone - sans lui, l'onglet connaît un enregistrement Il n'existe pas, mais ne peut pas le jouer. Lien de texte à l'adresse/recevoir; lien vocaux à la synchronisation.

  2. · InitializerService

    Schéma et germe de point de contact pour les transmissions de plomb

    Hibernate crée les trois nouvelles tables des entités partageant les dirs; cela ajoute ce qu'il ne peut pas exprimer - l'indice unique partiel qui maintient au maximum un seul ouvert Fenêtre de point de contact par (lead, fente), et indice de couverture DESC pour les index l'analyse du jeu de clés de la chronologie. La graine ouvre une première fenêtre pour chaque plomb qui est antérieure à l'indice. Pas un retournement de communication: aucun appel ou message historique n'est associé à n'importe quoi. Sans cela, un lead préexistant n'a aucun point de contact et pourrait Ne correspondez jamais à un appel entrant, de sorte que chaque onglet resterait vide pour toujours. Il passe par LeadContactPointService plutôt qu'un INSERT en vrac..SELECT de sorte il y a exactement une implémentation de canonicisation. Un jumeau SQL aurait à redémarrage des chiffres, manipulation du PNNA, au plancher d'extension et à l'adresse l'inflexion, et toute divergence ultérieure serait invisible - les rangées ensemencées Il suffit d'arrêter d'apparier la circulation en direct. Appliqué contre la production: 66 points de contact ouverts sur 45 pistes.

  3. · kamo-shared-library

    Index des points de contact et des liaisons de communication par le plomb et par le point-time

    Ajoute la colonne vertébrale de l'onglet de communication en tête qui se lit. LEAD-CONTACT-POINTS enregistre tous les numéros de téléphone et le courrier électronique qu'un exemple de lead a jamais eu, en tant que fenêtre avec activeFrom/activeTo. LEAD-COMMUNICATIONS indique la durabilité lien entre un lead et un appel, une messagerie vocale, un texte ou un courrier électronique, écrit à l'adresse suivante: C'est au moment où cela se produit par rapport aux points de contact en direct à ce moment-là. le nombre d'un plomb ne lie que le trafic futur et laisse l'histoire exactement telle qu'elle était. PHONE-CALL-LOG est l'enregistrement d'appels que la plateforme n'a jamais eu: lorsque l'audio a été capturé, donc les appels manqués et non enregistrés n'ont laissé aucune trace. ContactCanon est la définition unique du "même numéro" pour l'ensemble Plateforme; LeadController.canonicalPhoneS'OCDômes maintenant délégués à la recherche de ce vers l'inverse et la mise en correspondance des communications ne peut être en désaccord. LeadContactPointService et LeadCommunicationLinker ne sont PAS délibérément stéréotypes - un service partagé - Le service ayant besoin d'un dépôt échoue dans le démarrage du contexte dans tous les services qui n'ont pas ajouté le paquet, qui a pris la production trois fois plus. Les services de possession déclarent les haricots; LeadService les prend «Autowired(required-false) de sorte qu'il file encore partout ailleurs.

  4. · MediaService

    Capturer l'avance de la démo avant l'étape de réservation

    Le formulaire de démonstration du site de marketing a recueilli le nom, le courrier électronique, l'entreprise, la taille de l'entreprise, l'industrie et un message, puis avancé à la programmation sans le dire à personne. La création de plomb ne vivait qu'à l'intérieur. chaque visiteur qui n'a pas terminé une réservation, y compris chaque visiteur alors qu'aucune disponibilité n'est publiée - a été jetée après remise de leur détails. - POST - écrit seul l'exemple. Entraîneur provient des timbres de l'APIService de l'en-tête X-Public-Chat-Org-Id clé validée, jamais du corps. - findOrCreatePublicLead est maintenant la seule voie d'écriture en tête pour les trois surfaces publiques (formulaire, calendrier, jonction), de sorte qu'un visiteur produit un plomb Mais elles sont nombreuses. Il est timbre l'ordonnance "KamoCRM" / "Demo Demander" produit vendeur et s'emparer du marché de ce vendeur, et il achemine par le biais de LeadService.createLead au lieu de sauvegarder l'entité directement Le vieux épargne en ligne n'a produit aucune ligne d'histoire et pas d'événement LEAD-CREATED, donc ces les sondes n'apparaissaient jamais dans une grille déjà ouverte. - La taille de l'entreprise, l'industrie et le message du visiteur sont conservés comme un historique de pointe en entrée; Le plomb n'a pas de colonne pour l'un d'entre eux et ils sont la partie a Le vendeur lit en fait. - GET /api/public/webinar/types permet à une page publique de découvrir le type id plutôt que de porter une copie codée en dur, et les créneaux horaires/disponibles reviennent maintenant également temps disponibles - la même disponibilité est résolue à l'encontre de l'organisation qui s'appartient fuseau horaire en instants qui peuvent être replacés sous la forme d'un agendaStartTime.

  5. · kamo-shared-library

    primitives de capture de démo-request publiques

    Un visiteur qui remplit le formulaire de démonstration du site de marketing mais ne réserve jamais un jour n'a laissé aucune trace: le plomb n'a jamais été écrit qu'à l'intérieur de la transaction de réservation. S'en emparer d'emblée nécessite trois pièces que la bibliothèque n'avait pas. - faire correspondre une soumission répétée sur le diriger la même forme déjà produite. Porté au produit du fournisseur plutôt que à l'e-mail seul afin qu'une forme anonyme ne puisse jamais adopter (et ré-estamp) une piste Le personnel créé pour cette adresse. - PublicWebinarDateSlotsDTO: disponibilité résolu en instants absolus. Le une fente mémorisée est une date locale plus un temps d'horloge murale sans zone, qui a le navigateur ne peut pas se transformer en un programme de reportage de réserve. - PublicWebinarTypeDTO: un type de webinaire sans la liste des présentateurs, donc un public page peut découvrir le type id sans fuite d'adresses e-mail de présentateur.

  6. · kamo-internal

    Enregistrer le fournisseur Configuration de la navigation et écrire les conseils rapides

    L'onglet Configuration du fournisseur rendu à l'intérieur de SettingsView mais n'était accessible qu'en en tapant l'URL - il manquait dans les deux endroits qui répertorient les paramètres destinations: le menu nav des paramètres et la page de destination des paramètres. Il mène maintenant chacun, en correspondance de l'ordre de l'onglet, puisque le fournisseur accueille les réunions, décide laquelle des autres paramètres sont même disponibles. Les conseils rapides sur les cinq onglets existants n'ont jamais été écrits - chaque chaîne était un espace réservé ("Help Heading", "Bullet Lobby Title"). Ils disent maintenant quelque chose, et couvrir les paramètres ajoutés pour les équipes et les équipes: contrôles dans la réunion, code d'accès les rôles de la politique, du contournement et du présentateur, des enregistrements à distance et des transcriptions, et les invitations envoyées par le fournisseur. Chaque onglet explique également où les fournisseurs diffèrent, donc un contrôle désactivé a une raison déclarée plutôt que d'avoir l'air cassé.

  7. · kamo-internal

    Appliquer des règles d'accès géographique et IP aux pages

    checkAccess a évalué les règles elles-mêmes et n'a rien à même d'être vécue toute sa vie: Comparer les types de règles avec - tandis que l'éditeur écrit l'enum nomme WHITELIST/BLACKLIST/TEMP-BLOCK. Geo était un commentaire disant que Node a pas de base de données GeoLite. Les deux moitiés ont disparu - il lit maintenant le verdict SecurityService caches dans Redis et demande ce service sur un échec, donc il y a une implémentation de la la politique et pas de copie n'est laissée ici pour dériver. L'adresse est le saut le plus public à droite de X-Forwarded-For au plus à gauche. Proxine appuyant, donc l'élément de gauche est tout ce que le client envoie, et lire il serait avoir laissé un en-tête décider dans quel pays le visiteur est traité comme étant. Un visiteur bloqué reçoit maintenant un document clair 403 au lieu de JSON brut - il atteint un navigateur effectuant une navigation de haut niveau. Il ne nomme aucune règle et aucun pays: le lecteur ne peut pas agir sur ce point, et quelqu'un qui sonde la frontière ne devrait pas se voir remettre une carte de celle-ci. Dépasse-t-elle sur chaque chemin. Un indicateur supplétif qui bloque lorsque Redis est brièvement inaccessible l'ensemble du locataire hors ligne.

  8. · APIService

    Appliquer les règles d'accès des locataires à la passerelle

    Ce filtre est inerte depuis qu'il a été écrit. resolveOrgId read org:domain:-host de Redis, rien n'a jamais écrit cette clé, et le retour nul est tombé à travers pour permettre; La branche geo était un bloc vide if-bloc avec un commentaire s'en reportant à SecurityService, qui était pas non plus d'application. Toutes les demandes ont été formulées. Il lit maintenant le verdict SecurityService cache et demande ce service à l'échec, donc le la politique vit en un lieu plutôt que d'être réimplémentée ici. Le chemin chaud est un Redis lire; un échec coûte un appel HTTP à librairie par organisation et adresse pour les 30 secondes. L'adresse du client est le dernier saut public de X-Forwarded-Ford-For. Proxie append, donc le L'élément gauche est fourni par l'attaquant - lire qu'il aurait laissé un en-tête choisir lequel le pays dont la demande est jugée à l'origine. Exonère les sondes de vie, le pré-vol du CORS et le critère d'évaluation de la décision lui-même, et jamais juges - adresses internes des groupes: le trafic de services n'a pas de pays et le blocage lui ferait tomber la plate-forme. Ne vous ouvrez pas sur chaque voie, avec un test par dépendance. Cela se trouve devant tout locataire Le trafic de l'API, donc un filtre qui bloque quand Redis est lent est une panne totale. En outre, le modèle échafaudage à partir de l'engagement initial, dans un emballage sans «SpringBootConfiguration» Trouvez. Il n'a jamais été adopté; l'IC construit avec -DskipTests donc rien n'a été remarqué. Enlever rend le "test mvn" utilisable ici.

  9. · SecurityService

    En fait, faire respecter les règles de géolocalisation et d'accès IP

    Les règles ont été stockées, mises en cache sur Redis et jamais consultées. AccessCheckCluster a été le seul appelant de l'évaluation et rien ne s'appelle AccessCheckController; APIServices filtre résolu les orges d'une clé Redis n'a rien écrit et traité l'oubli comme une autorisation. La configuration d'un bloc géographique n'a rien fait du tout. AccessDecisionService est désormais l'autorité unique. Connexion l'appelle directement, la passerelle le filtre et le proxy kim-interne atteignent la même décision par le critère de contrôle, et la politique existe une fois au lieu d'une fois par couche. La copie du Node avait dérivé jusqu'à présent suffisamment pour ne rien faire: il a comparé les types de règles à "liste blanche"/"temp-bloc" tandis que le L'éditeur écrit WHITELIST/TEMP-BLOCK. La résolution GeoLite est mise en cache dans Redis pour une journée, positivement et négativement, et saute des adresses privées entièrement. L'adresse vient d'un en-tête, donc sans cache négative un bougons tournant l'appelant transforme chaque demande en une nouvelle sonde de la table de 5,7 millions de rangées la forme DoS findByIpInRange était déjà réécrite une fois pour éviter. ClientIpResolver lit le saut le plus grand public de X-Forwarded-For, pas le plus à gauche. L'élément de gauche est tout ce que le client envoie: proxys appendice, donc "X-Forwarded-For: 8.8.8.8" plus Traefik's propre appendice aurait permis à quiconque de choisir le pays son bloc est jugés contre. Chaque règle géographique aurait été à un seul en-tête de la dérivation. Échec ouvert partout, par dépendance et déclaration par dépendance. Un contrôle d'accès qui échoue sur un redis oscille chaque locataire hors de la plate-forme, ce qui est pire incident que la fenêtre qu'il se ferme. Une adresse de liste blanche contourne également la géo, donc un administrateur qui bloquent leur propre pays retourne.

  10. · kamo-internal

    Carte d'enregistrement de la plate-forme pour l'application "place"

    Achevera le chemin de connexion en un seul clic. Le backend prend déjà fin PlatformOAuthProviderType.-OOM, mais sans carte ici un opérateur de plate-forme avait d'où la possibilité d'entrer dans les références du marché, de sorte que la réunion écran toujours signalé en un clic se connecter en non enregistré. Facultatif par conception: le chemin de serveur à serveur à serveur par or n'a rien besoin ici et reste la valeur par défaut recommandée, donc une carte vide garde simplement un clic caché. Les réunions des équipes réutilisent l'enregistrement existant de Microsoft 365.

  11. · kamo-internal

    Microsoft Teams Fournisseur de téléphones, de l'avant-garde

    Ajoute des équipes à l'ensemble de la trajectoire et des fils par le biais de la sélection du fournisseur, la configuration Entra et Azure des services de communication, le consentement de l'administrateur locataire, le lien par membre et un softphone dans le navigateur. Le softphone est la partie qui diffère structurellement de tous les autres fournisseurs. Les équipes ne révèlent pas l'enregistrement SIP à des tiers, de sorte qu'une ligne d'équipes ne peut pas être enregistré auprès de SIP.js ou de RingCentral. L'itinéraire soutenu est Azure Le point d'extrémité des équipes personnalisées des services de communication: les échanges d'arrière-plan Un jeton d'Entra pour un jeton de l'ACS, et TeamsAcsPhoneSdk transforme cela en un agent d'appel derrière la même interface PhoneSdk, l'outillage des adaptateurs SIP, useSoftphone et chaque composant UI restent fournisseur-agnostique. SipCredentials prend des champs acs optionnels; sipInfo est simplement vide pour les équipes. Le paquet ACS est uniquement par navigateur et importé dynamiquement à l'intérieur de l'intérieur du registre, étant donné qu'un institutionnelle statique casserait le rendu du serveur. Deux vérités spécifiques aux équipes sont apparues dans l'interface utilisateur plutôt que laissées à l'échec à l'exécution: l'appel dans le navigateur est facultatif (laisser l'ACS en blanc et l'orge obtient toujours la présence et l'historique des appels, avec le dialler caché plutôt que trompeur), et la messagerie vocale est désactivée par défaut parce que les équipes n'ont pas d'API de messagerie vocale et les messages atterrissent dans la boîte aux lettres de chaque membre, de sorte que leur lecture est une plus grande échelle matériellement consentir à ce qu'un administrateur accepte délibérément. La carte de connexion des membres sur l'onglet de réglages téléphoniques est maintenant prise en charge par le fournisseur de RingCentral uniquement. Les deux fournisseurs ont besoin d'une autorisation par membre, pour différentes raisons: RingCentral parce qu'un softphone ne peut s'enregistrer que comme l'extension du compte connecté, les équipes parce que la présence écrit et l'appel l'échange de jetons est délégué uniquement. Marquage: la tuile utilise la marque Microsoft et le nom de produit ordinaire. Microsoft permet de nommer des équipes pour décrire une intégration mais restreint les équipes Logos et marquages aux partenaires des équipes certifiées, donc aucun glyph d'équipes n'est expédié. Vérifié: test npm 40 fichiers, 394 tests, 0 échecs; tsc --noEmit propre; i18n garde-clés et garde-navigation client passent tous les deux. Matières de dictionnaire débarquées premier dans le kamo-translation-dictionary 0801a17.

  12. · VOIPService

    Microsoft Teams Phone en tant que fournisseur

    Les équipes ne sont pas une API, donc le fournisseur colle trois plans de contrôle ensemble: Graphique, enregistrement de l'application et historique des appels (getPstnCalls), lectures de présence, répertoire et l'inventaire des appareils des équipes. Les enregistrements d'appel sont des autorisations de demande Microsoft indique clairement qu'il n'a pas de formulaire délégué. Graphique, délégué et présence écrit (Pise).ReadWrite n'existe qu'en tant que déléguée, autorisation automatique) et messagerie vocale, qui vit dans la personne membre Boîte aux lettres d'échange parce que les équipes n'ont aucune ressource en matière de messagerie vocale. Azure Communication Services - le softphone in-browser du propre membre Ligne de téléphone d'équipes, via l'échange de jetons d'extrémité personnalisé des équipes. C'est le les équipes n'émettent pas d'officier de l'état civil à des tiers, et l'appel de l'API de graphique se joint en tant que robot plutôt qu'en tant qu'utilisateur. Les capacités sont calculées à partir de ce qu'une instance est effectivement configurée pour plutôt que codé en dur, donc un gis sans ACS rapporte voiceCalls-frese et l'UI Se cache le dialler au lieu de faire surface à un 501 à mi-appel. Délibérément absent, parce qu'il n'existe pas d'API Microsoft à n'importe quelle version: SMS à partir d'un numéro Teams, appel les files d'attente, le renvoi d'appel, l'auto-réponse et l'enregistrement de démarrage/arrêt. Ces restez sur les valeurs par défaut de l'interface qui augmentent 501. Les pouvoirs se résolvent d'abord par instance (un guidage enregistre son propre appendice Entra la forme commune de l'entreprise, et elle n'a besoin de rien de Kamo la plate-forme) et retombent par champ à une ligne MICROSOFT-TEAMS dans le registre de la plate-forme OAuth. L'intégration s'étend dans deux houblons parce que le locataire doit être découvert avant de pouvoir être épinglé: un signe d'administration dans, la id-token's 'tid's donne au vrai locataire, puis ils sont envoyés à ce locataire /v2.0/adminent. Le consentement est confirmé par rimer un jeton d'application et appeler Graph et Microsoft retourne admin-consent-True même sur l'échec, et avertit que le paramètre de redirection 'tenant' est forgé, donc Il n'y a pas non plus de confiance. Les équipes se déplassent et la liaison déléguée par membre multiplex sur /api/voip/oauth/callback, la voie déjà publique au passerelle, donc APIService n'a pas besoin de nouvelle route. Les notifications changent circule dans le cas de l'existant /api/voip/webhook pour la même raison. La poignée de main du graphe diffère de celle de RingCentral et a'adherjeton à la validation paramétré en tant que texte/plaine et répond à quoi que ce soit d'autre, puisque Le graphique diminue les notifications pendant dix minutes si un critère d'évaluation est lent. Abonnements sont créés intentionnellement: le filtre d'abonnement cible toujours le La collection des participants qui a cessé de renvoyer les données en juin 2026. Deux défauts préexistants fixés parce que les équipes les rendent porteurs: Contrôleur d'appel, capacités et contrôleurs d'appel et responsable des épreuves le fournisseur via getPrimaryForOrg est l'instance active la plus ancienne d'une personne d'org type. Cela ne vaut jamais que pour un ingénuonateur unique. Les équipes seront généralement être un deuxième fournisseur, de sorte que l'historique de chaque membre, la messagerie vocale et l'État de l'agent aurait été desservie par le fournisseur qui a été créé en premier. Ils utilisent maintenant un membreware getForMember, reflétant ce que SipContoller a déjà fait. - Suppression d'une instance laissée par la suite, puisque l'on a suivi pas de FK à partir de cascade, et ils ont continué à signaler "connecté". Vérifié: test mvn 133, 0 défaillance (49 nouveaux).

  13. · kamo-internal

    Onglet de configuration du fournisseur et réglages des réunions à capacité

    Ajoute l'onglet Configuration du fournisseur à /settings/spectives/meets et fabrique les autres s'agite de savoir quel est le fournisseur qu'il configure. useMeeting ne construit plus de connexion. a fait à chaque réunion une réunion de Kamo Meets, quelle que soit la configuration. Il est maintenant crée la réunion par l'intermédiaire du backend et utilise les URL que le fournisseur retourne, donc le centre d'interaction, la fenêtre de l'outil de discussion et l'annuaire des membres tous route à travers l'abstraction sans changements propres: ils partagent MeetingDialog, qui partage cet crochet. - Configuration du fournisseur: cartes de fournisseur avec une barre de recouvrement des paramètres, de sorte que le coût de la commutation est visible avant le commutateur plutôt que de la découverte ultérieure sur un tabulées de contrôles grisé. Les formulaires de certification sont en écriture uniquement - le serveur retours quels champs sont définis, jamais leurs valeurs - plus un test de connexion en direct et les instructions de mise en place par fournisseur. - Portail de la capacité: useMeetProvider lit les paramètres pris en charge par le fournisseur et MeetSettingRow désactive le reste avec une infobulle insérant le fournisseur. Non soutenu les paramètres sont montrés plutôt que cachés, et sont véritablement handicapés plutôt que simplement ombilmis, de sorte qu'ils ne peuvent pas être changés par clavier. Sauvent les omettre complètement. Le portage échoue - une recherche de capacité défaillante montre tout, depuis le gris Un écran de travail est pire que de montrer un contrôle que l'arrière-plan ne l'ignorerait. - Nouveaux paramètres que les autres fournisseurs prennent en charge: adhésion avant l'hôte, discussion en cours de réunion, partage d'écran, numéro d'appel, utilisateur authentifié, longueur de code d'accès et inscription, le champ d'application du contournement du lobby, les contrôles des participants et des participants, l'enregistrement en nuage, les transcriptions, l'enregistrement des téléchargements et les invitations envoyées par le fournisseur. - - -meet/join/ref est maintenant conscient du fournisseur: Kamo Meets reçoit toujours une clé unique en première vue Fractionné à l'heure du clic, les équipes et les équipes redirigentes vers l'URL du fournisseur. C'est accepte une réunion id ou un nom de salle, de sorte que les invitations envoyées avant ce changement Continuez à travailler. - Le lien d'invitation par courrier électronique est construit à partir d'un identifiant de réunion validé par UUID plutôt que un nom de chambre, en conservant la règle existante selon laquelle une URL fournie par le client n'est jamais confiance dans un courriel sous la marque gracieuse.

  14. · kamo-shared-library

    Type de fournisseur MICROSOFT-TEAMS

    Applique MICROSOFT-TEAMS à VoipProviderType. L'enum persiste sous la forme d'ORDINAL - de sorte que la position est porteuse et la constante va en dernier; la classe Javadoc dit maintenant plutôt que de quitter la suivante une personne pour le déduire. Pas de changement de DDL - une colonne ORDINAL ne porte pas de valeur liste blanche, donc cela n'a pas besoin de KamoInitializer. Ajoute deux requêtes dérivées sur MemberVoipOAuthTokenRepository: findByProviderAndInstanceId est une identité de fournisseur entrant (un Microsoft) Entra object id sur un record d'appel des équipes) à un membre de Kamo. supprimerByInstanceId Ces lignes n'ont pas de FK à l'instance, donc la suppression d'un Le fournisseur les laissait derrière lui toujours en signalant qu'il était "connecté".

  15. · APIService

    Rappel du fournisseur de réunion OAuth

    zoom et Microsoft rediriger le navigateur vers cette passerelle après qu'une aire de route a autorisé une aire de route L'application de Kamo. Les terres pop-up ici sans séance de locataires - l'orge voyage dans - donc le rappel a besoin de l'incontournement sans session, auth-stripping passe par le Le rappel du fournisseur de courrier électronique utilise déjà, pas l'appel ordinaire /api/meet/- forward.

  16. · MediaService

    Rencontre entre l'abstraction des fournisseurs avec les équipes de zoom et de Microsoft

    Les réunions ont été posées par Kamo Meets par construction. MeetService a persisté dans une salle de réunion nom et rien d'autre. Cela introduit l'abstraction et deux fournisseurs distants. derrière elle. se rencontrer/fournit un supporteur en miroir de la couche du fournisseur de courrier électronique: MeetingProviderResolver assemble a MeetingContext (identifiants décryptés, subvention OAuth rafraîchie, politique d'organisation, un compte hôte côté fournisseur) et une carte de capacité, les appelants demandent MeetingScheduler plutôt que de brancher sur le type de fournisseur. Ajout d'un quatrième fournisseur signifie ajouter un haricot, et non d'édition de sites d'appel. - KamoMeetProvider: nommage de pièce et construction d'URL, côté serveur déplacé. Le org-namespacing qui empêche deux locataires de partager une conférence Prosody utilisée pour vivent dans le navigateur; il est maintenant épinglé par des tests. - zoomProvider: REST v2, Server-to-Server OAuth ou l'application Marketplace. Crée au nom du membre organisateur, tire les enregistrements en nuage et les transcriptions. - MicrosoftTeamsProvider: Graph onlineMeetings, app-only ou délégué. Il les sondes de test de connexion se réunissant, parce que la politique d'accès à l'application Les équipes exigent aussi est la chose habituelle qu'un échec d'administration - la permission seule authentifie fin puis 403s à chaque réunion. MeetingFeature est le contrat avec l'administration de l'interface utilisateur: chaque fournisseur déclare les paramètres qu'il peut honorer, et les écrans de réglages désactivent le reste. Les réclamations sont invoquées dans les tests plutôt que dans la confiance, étant donné qu'un fournisseur de réclamations excessives produit bascule qui ne fait rien de silencieusement - la défaillance de cette couche existe pour prévenir. ProviderRecordingSweep tire les enregistrements à distance dans le propre stockage de Kamo. Les résumés de conservation, de quotas et après la réunion fonctionnent de manière identique sur chaque fournisseur. Les téléchargements sont plafonnés: ce service sert également de chat et de réunions dans le cadre d'un 1Gi. limite, donc un enregistrement surdimensionné est sauté avec un avertissement plutôt que de risquer la gousse. Les accréditations sont cryptées avec la clé de plate-forme existante, de sorte qu'aucun nouveau secret n'a été à provisionner. La gestion de la session partagée par les critères d'évaluation de la réunion passe à MeetSessionResolver - délibérément sans élargir son contrôle des droits.

  17. · InitializerService

    Schéma pour la couche de réunion multi-fournisseurs

    Crée des jetons, ajoute les colonnes de fournisseur-identité à REETING-RECORDS et MEETING-RECORDING et Paramètres à zoom/Teams-capacitables vers ORG-MEET-CONFIG, et remblaye tous les éléments existants organisation à une ligne explicite KAMO-MEET/ACTIVE. Deux choses que cette donne nous a apprises, toutes deux codées ici. Bit ddl-auto d'Hibernate l'actur de session avant toute directiveRunner, donc les instructions CREATE TABLE normalement non-op et les colonnes arrivent sans défaut - le remblai de remplissage donc fournit des id et des horodatages explicitement plutôt que de compter sur eux, c'est pourquoi Sa première version n'a rien inséré silencieusement. Et l'unicité déclarée sur le les entités signifie que Hibernate maintient ses propres contraintes, de sorte que les indices nommés et Les révisions précédentes ont été ajoutées à des doublons; elles sont abandonnées ici. Ajout com.kamo.z.shared.meet à la liste explicite des référentiels «EnableJpaRepositories», sans dont les nouveaux dépôts n'ont pas de haricots et KI avorte avant tout feu de coureur.

  18. · kamo-shared-library

    Réunions types en tant que fournisseur-agnostique

    Kamo Meets était le seul backend possible: OrgMeetConfig était un plat Meet Un sac de réglages et un MeetingRecord n'avaient qu'un nom de pièce. Ceci ajoute la Schéma pour l'exécution d'une organisation sur le site de l'équipe de l'entreprise. - rencontre: MeetingProviderType/ MeetingProviderStatus, le per-org OrgMeetingProviderEntity (blob d'accréditation chiffré, état vérifié en dernier ordre) et OrgMeetingOAuthTokenEntity, en miroir du paquet e-mail et fournisseur qui déjà soutient l'abstraction du fournisseur de courrier électronique. - MeetingRecord acquiert l'identité du fournisseur d'hébergement et l'identifiant de réunion à distance, Connectez et hébergez les URL, le code d'accès, le compte hôte, de sorte qu'une réunion peut être rejointe et a réconcilié qui l'héberge. - MeetingRecordingIngère le fournisseurRecordingId, qui conserve l'attraction d'une télécommande L'enregistrement en nuage du fournisseur est idempotent. - OrgMeetConfig acquiert les paramètres de soutien de l'équipe et les équipes sont prises en charge par un Meet-only la configuration n'avait aucune raison de porter: joint-avant-hôte, mise en forme de code d'accès, lobby le contournement du champ d'application, les contrôles des participants et des participants, l'enregistrement en nuage, les transcriptions, les invitations envoyées par le fournisseur, et les réunions d'hôtes de secours sont créées au titre lorsqu'un membre n'a aucun compte sur le fournisseur. Chaque org sans file de fournisseur se résout à KAMO-MEET, donc c'est inerte jusqu'à un admin choisit autrement. Les colonnes ont été appliquées à la production par KamoInitializer avant que cela ne débarque. PlatformOAuthProviderType gagne en zOM(9) pour l'application 'OOM(9) pour l'application 'oom marketplace'' les réunions réutilisent MICROSOFT(3). Son test de garde se déplace avec lui, depuis un enum et l'essai épinglant ses ids persistants ne peuvent pas atterrir séparément.

  19. · kamo-internal

    Pays de liste de permis sur la carte de blocage géographique

    La carte ne pouvait que refuser des pays, de sorte qu'un og qui dessert un pays devait énumérer tous les autres. Il a maintenant les deux listes: un mode basculant choisi qui liste le pays choisi atterrir et les deux tables se trouvent côte à côte. Une liste d'autorisation vide permet tout ce qui n'est pas bloqué; un non-vide refuse à chaque pays absent de celui-ci. Cette inversion est suffisamment drastique pour être prononcée sur la carte plutôt que de laisser à être découvert, donc l'avis au-dessus des tableaux indique quel régime est en vigueur. La contrainte unique (org, pays) maintient un pays sur une liste exactement, ce qui ferait le ré-amarrant à l'autre échoue, donc chaque ligne porte une action de mouvement qui le retourne via PUT à la place.

  20. · SecurityService

    Pays de liste d'autorisation aux côtés des blocs géoscientiers

    La section géographique n'a jamais été niée que : un pays a été bloqué ou absent. Orgs qui veulent servir un pays devait énumérer tous les deux, ce qui est indulgent et silencieusement faux au moment où un nouveau code de pays apparaît. org-geo-bloc-rules.is-blocs-blobed existait déjà et était codé en dur true, donc une autorisation règle est que la colonne set false - pas de changement de schéma. Évaluation: un bloc explicite gagne, puis une liste d'autorisation refuse tout ce qui en n'est pas absent, et une liste d'autorisation vide permet Tout n'est pas bloqué. Cela permet de ne comporter que des orgs existants qui se comportent exactement comme avant. publierGeoRules expédie désormais des deux côtés de la règle fixée, puisque les règles d'autorisation sont porteuses de charge une fois que l'on existe. Charges utiles cachées écrites avant que ce changement ne transportent pas de champ bloqué et survivent à la cache TTL à travers un déploiement, donc un champ manquant se lit comme bloqué. En outre, les champs définisBlocked et les supprimer à l'adresse de l'appelant. supprimer précédemment résolu une règle par UUID seul, un identifiant d'un autre locataire aurait été honoré.

  21. · kamo-shared-library

    Lire la qualité des ajustements et des directives

    Un prix assemblé est une cellule de base PLUS les ajustements empilés sur elle, donc à en juger Seule la cellule juge la moitié du nombre: un lus proprement 99.875 avec une fausse lecture -1.250 LLPA au-dessus reste un mauvais prix. MlosPrixAjustement maintenant porte la qualité de lecture de cet ajustement, de sorte que la porte d'approbation peut prendre le maillon le plus faible à travers le un ensemble entier. MlosGuidelineVersion obtient le même champ pour la cohérence avec le rachis de la feuille de vitesse. Il a déjà fourni la sourceDocumentId, donc cela complète sa provenance. Tous deux annulables; nul signifie NON SIGNAL plutôt que bon. Colonnes appliquées à la prod CockroachDB via KamoInitializer.

  22. · kamo-internal

    Ouvrir des liens à nouveau dans cette application dans l'onglet dans lequel le membre est déjà

    Mail dans le volet de lecture ouvre chaque lien dans un nouvel onglet, ce qui est juste pour le Internet entier et mal pour nous. Nos courriels de notification sont presque entièrement des liens Retour dans l'application, et envoyer ceux à une nouvelle onglet jette la session le membre a déjà et les fait s'asseoir à travers un boot froid pour atteindre une page cet onglet pourrait rendre immédiatement. La même origine est la totalité du test - octet-e égale avec la page rendant l'e-mail, non "regarde comme un domaine Kamo" et non un suffixe correspondance sur le domaine de l'organisation. C'est exactement l'ensemble des URL pour lesquelles la session en cours est valable, qui est la totalité raison de rester dans cet onglet, et il n'est pas possable par courrier: l'hôte d'un autre locataire, un lookalike, ou userinfo pointant l'hôte ailleurs sont toutes des origines différentes et Allez à un nouvel onglet comme n'importe quel autre lien d'inconnu. Routage plutôt qu'en fonction de l'affectation: une charge complète du document déchire la React arbor et détruit chaque fenêtre d'outil ouverte ainsi que tout embout non ingrat, c'est pourquoi ce repo a une porte de construction contre la navigation interne dure. Modifié et moyen Les clics sont laissés seuls - ce geste est l'utilisateur qui demande délibérément un nouvel onglet. L'écoute des parenthèses fonctionne parce que le bac à sable conserve déjà l'autorisation-même-l'origine pour la mesure de la hauteur tout en omettant des scripts de permis, donc rien de l'email lui-même jamais court; le maître est le nôtre, attaché de l'extérieur. Un piège qui vaut la peine d'être enregistré, pris par son propre test: renvoyer un chemin plutôt qu'une URL est nécessaire mais PAS suffisant. "https://host//evil.test" est véritablement de même origine, et son nom de chemin est "//evil.test" - que le routeur lit comme protocole-relatif et suit hors site. Une redirection ouverte par courriel qui passe un contrôle d'origine. Un tel lien maintenant tombe à travers un nouvel onglet, où le navigateur résout l'URL réelle et inoffensive, plutôt que d'être silencieusement réécrit à quelque part l'e-mail n'a pas indiqué.

  23. · kamo-shared-library

    Confiance d'extraction par cellule et origine de la matrice d'éligibilité

    Deux lacunes dans le modèle de confiance, les deux sur la trajectoire de l'argent. PER-CELL. Un plancher à l'échelle de la feuille n'est pas le mauvais grain pour l'évaluation d'un prix: un seul Un coupon mal lu traîne la feuille entière vers le bas et en enverrait tous les AUTRES prix dessus à un humain, alors qu'un plancher en feuille haute ne dit rien de la cellule spécifique d'un emprunteur a été cité à partir de. Ce taux/prix/ligne de verrouillage a été lu, de sorte qu'un coupon mal interprété ne coûte que son propre prix. PROVENANCE DE L'ÉLIGIBILITÉ. MlosEligibilityMatrix n'avait pas de chemin vers un document source à Tous - sa seule voie était une ligne directrice NULLABLEVersionId, de sorte qu'une matrice promue pourrait ne pas remonter la feuille d'où elle provient. L'éligibilité décide si un prêt est l'offre, qui fait exactement qu'un refus doit être explicable; une provenance il y a un écart au point où un emprunteur est informé non. Il porte maintenant sourceDocumentId et le même contrat de confiance d'extraction que la colonne vertébrale de la feuille de vitesse. À la fois annulable, et nul signifie NON SIGNAL plutôt que bon. Colonnes appliquées à la prod CockroachDB via KamoInitializer.

  24. · kamo-signer-monorepo

    Montrez le téléphone de l'agent, sans frais et l'e-mail sur la copie du client

  25. · kamo-internal

    Montrez le téléphone de l'agent, sans frais et l'e-mail sur l'aperçu

    Chacun sur sa propre ligne: une course de deux nombres et une adresse se lit comme une chaîne et se désitér de manière erronée.

  26. · SecurityService

    Résoudre les coordonnées publiées par l'agent

    Le courrier électronique provient de la boîte aux lettres principale du membre plutôt que de TeamMember.emailWork. la colonne est le texte libre précédant l'approvisionnement de la boîte aux lettres et n'est généralement pas d'accord avec le adresse qu'ils envoient effectivement de. Il reste la solution lorsque la boîte aux lettres n'est pas primaire. Un membre compatible VOIP avec une extension est publié en tant que ligne de l'organisation plus que extension, offrant le numéro vert-numéro sans aussi quand l'org en a un. Sans prolongation, leur téléphone de travail - le seul numéro qu'ils détiennent qui est censé être publié. A handicapés La configuration VOIP ne publie rien, car cette extension ne répond pas. Chaque recherche est défensive: ne pas rendre un document faisant face au client parce qu'une boîte aux lettres la ligne manquerait serait pire que d'imprimer un moyen de moins de prendre contact.

  27. · kamo-shared-library

    Publier tous les moyens d'atteindre l'agent, pas seulement un nom

    Le nom et le titre seuls informent un client qui possède la citation mais pas comment le demander. Le bloc transporte maintenant le courrier électronique et le téléphone, résolu par l'appelant et la boîte aux lettres principale vit dans le schéma du fournisseur de courrier électronique et l'extension de la configuration VOIP, ni l'un ni l'autre accessible à partir d'un assistant statique. La ligne principale et le numéro sans frais sont des champs distincts, de sorte que le document peut imprimer à la fois: entre eux, c'est choisir ce que l'appel coûte au client. lineWithExtension paire une extension avec la ligne d'orge qu'il pend, et retourne nul si l'une ou l'autre moitié est manquante. Un orphelin "ext. 204" n'est pas un numéro que l'on peut appeler, et un nu la ligne d'org se déplaçant dans le client vers le standard comme si c'était celui de l'agent.

  28. · kamo-shared-library

    Confiance en matière d'extraction sur la base de l'approbation de la colonne vertébrale et de l'auto-signalement du catalogue

    Un prix n'est que aussi fiable que la feuille dont elle a été assemblée, et rien sur le chemin de tarification transportait ce signal: la confiance existait UNIQUEMENT en prépromotion la mise en scène (MlosExtractedCandidate) qui ne lisait pas de code de production. - C'est la confiance WEAKEST par champ dans l'ensemble des candidats approuvés promus dans la version -- minimum, jamais méchant. Une feuille de 200 cellules propres et une moyenne de 0,20 mal lue à 0,996 et serait limpide n'importe quel seuil, alors que cette cellule est celle qui dépasse un prêt. Null signifie NON SIGNAL (ébranle ou promu avant l'existence de la colonne) et les consommateurs doivent refuser d'auto-approuver; lire en l'absence aussi bonne est à quel point un prix non vérifié sort sans examen. WORM-protégé comme les autres colonnes date de prix -- pris en contact avec instantané dans le document intitulé «PostLoad et diffé dans «PreUpdate», ou ce serait un trou silencieux dans la chaîne d'audit. MlosPricingSignoff gains automatisés / base-confiance / seuil appliqué. Sans une homologation de machine est indiscernable d'un être humain, sauf par un membre; id, qui sur la voie de l'argent est un défaut d'audit. Le seuil est stocké à côté de la valeur parce que la configuration se déplace: «la confiance était 0,72» ne peut pas être jugée plus tard sans savoir si la barre ce jour-là était de 0,70 ou 0,90. Colonnes appliquées à la prod CockroachDB via KamoInitializer.

  29. · kamo-internal

    Onglet des citations et chaque citation sur les pistes du compte

    Un serveur de donnéespage à côté de Leads, avec recherche sur le nombre et le titre, l'état, le total distance et fourchette de dates créées. Les filtres partagent un debounce et s'effondrent en une seule requête, donc ajustant une plage tout en la frappe coûte un aller-retour plutôt qu'un par tranche d'attelage par champ. Tout changement de filtre resset à la page 1 - rester à la page 6 d'un ensemble de résultats plus étroit se lit comme une grille vide. L'expiration est mise en évidence en dehors du statut: une citation SENT peut être supérieure à sa date de validité et toujours lire comme SENT, donc ces lignes portent leur propre marqueur au lieu d'être silencieusement mésalissage. Les rangées et la colonne de tête se trouvent tous les deux dans l'onglet de guillemets de cette sonde.

  30. · SecurityService

    GET /quotes/compte/-uid-paged, filtré, trié

    Les dates arrivent en tant que chaînes ISO et parse-lysentement: un filtre que le client envoie mal devrait ne rétrécira rien plutôt que 400 la grille entière. Une borne "to" uniquement à la date couvre l'ensemble des Ce jour-là, sinon le filtrage à aujourd'hui ne revient rien soulevé depuis minuit.

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