Direkt zum Inhalt
KAMOUniverse

Changelog

Was ist neu?

Jede Verbesserung an der Plattform, wie sie geliefert wird.

  1. · VOIPService

    Beantworten und assoziieren Anrufe, SMS und Voicemail mit Leads

    Anrufe wurden nirgendwo aufgezeichnet. VoipCallEventService veröffentlichte eine NATS-Veranstaltung für den Browser und hielt nichts, und RECORDINGS existiert nur, wenn Audio war gefangen. Die pro-Instance-Synchronisation zieht jetzt Anruf-Geschichte durch die PhoneProvider Abstraktion und upserts PHONE_CALL_LOG, eingegeben (Instance, Provider Call-ID). Das ist die einzige Route, die für FreePBX und Microsoft Teams funktioniert, keiner von die einen nutzbaren Webhook pro Anruf bietet. Der Sweep ist der einzige Schriftsteller. Fortsetzung aus dem RingCentral Webhook als auch wurde versucht und entfernt: seine Mitteilung trägt TelefonieSessionId, während die Call-History API gibt eine andere Record-ID, so dass die beiden Autoren produziert zwei Zeilen und zwei Timeline-Einträge für einen Anruf. Anrufe werden nur zu einer Erweiterung zugeschrieben, wenn diese Erweiterung tatsächlich auf der rufen. RingCentral's Endpunkt ist Erweiterung/E und ignoriert das Argument, so Looping pro Erweiterung würde sonst die Anrufe jedes Mitglieds unter dem einreichen, der Schleife besucht zuletzt. Aufnahme von IDs werden pro Seite über RecordingLookupService behoben, das gleiche Bereicherung der Softphone-Geschichte - ohne sie kennt die Registerkarte eine Aufnahme existiert, aber nicht spielen. Texte verlinken auf Send/Receive; Voicemails Link bei Sync.

  2. · InitializerService

    Schema und Kontaktpunkt-Saatgut für Bleikommunikation

    Hibernate erstellt die drei neuen Tabellen aus den Shared-lib-Entitäten; dies fügt hinzu was es nicht ausdrücken kann - der teilweise eindeutige Index, der höchstens ein offen hält Kontakt-Point-Fenster pro (Lead, Slot) und DESC für Indizes für die Timeline Keyset-Scan. Der Samen öffnet für jede Leitung, die dem Index vorausgeht, ein erstes Fenster. Nicht ein Kommunikations-Nachfülle: Kein historischer Anruf oder Nachricht ist mit alles. Ohne sie hat ein Vorsprung überhaupt keine Kontaktstellen und könnte nie mit einem eingehenden Anruf, so dass jeder Tab würde für immer leer bleiben. Es läuft durch LeadContactPointService statt einer Masse INSERT..SELECT so Es gibt genau eine Umsetzung der Kanonikalisierung. Ein SQL-Zwilling hätte um das neu abgeleitete Ziffernabrüben, NANP-Handling, die Verlängerungsfläche und Adresse Auspacken, und jede spätere Divergenz wäre unsichtbar - gesäte Reihen würden einfach aufhören, den Live-Verkehr zu treffen. Gegen Produktion angewendet: 66 Kontaktstellen an 45 Leads geöffnet.

  3. · kamo-shared-library

    Point-in-time-Kontaktpunktindex und Lead-Kommunikation

    Fügt die Wirbelsäule die Lead Communications Registerkarte liest aus. LEAD_CONTACT_POINTS zeichnet jede Telefonnummer und E-Mail auf, die eine Leiste jemals hatte, als Fenster mit activeFrom/activeTo. LEAD_COMMUNICATIONS zeichnet die langlebig Verbindung zwischen einem Lead und einem Anruf, Voicemail, Text oder E-Mail, geschrieben an der Moment, es passiert gegen die Kontaktstellen live in diesem Moment - so ändern Die Nummer eines Leads bindet nur zukünftigen Verkehr und lässt die Geschichte genau so, wie sie war. PHONE_CALL_LOG ist der Anrufrekord, den die Plattform nie hatte: RECORDINGS hat nur einen Reihe, wenn Audio aufgenommen wurde, so verpasste und nicht aufgezeichnete Anrufe hinterließ keine Spur. ContactCanon ist die einzige Definition von "die gleiche Zahl" für das Ganze Plattform; LeadController.canonicalPhone delegiert jetzt es so Reverse Lookup und Kommunikation Matching kann nicht widersprechen. LeadContactPointService und LeadCommunicationLinker sind absichtlich NICHT Stereotypen - ein Shared-lib-@Service, der ein Projektarchiv benötigt, scheitert beim Kontext-Start in jedem Service, der das Paket nicht hinzugefügt hat, das die Produktion genommen hat dreimal runter. Die Eigentümerdienste erklären die Bohnen; LeadService nimmt sie @Autowired(required=false) so dass es immer noch überall verdrahtet.

  4. · MediaService

    Erobern Sie die Demo-Führung vor dem Buchungsschritt

    Die Marketing-Website Demo-Formular gesammelt Name, E-Mail, Unternehmen, Unternehmensgröße, Industrie und eine Nachricht, dann fortgeschritten, um die Planung, ohne jemandem zu sagen. Lead Kreation lebte nur innen ************ jeder Besucher, der keine Buchung durchgeführt hat - inklusive aller Besucher während keine Verfügbarkeit veröffentlicht wird - wurde nach der Übergabe ihrer Details. - POST ************ schreibt die Leite für sich. Besitz von Org kommt von den X-Public-Chat-Org-Id Header-APIService-Stempeln von der validierter Schlüssel, nie vom Körper. - findOrCreatePublicLead ist jetzt der Single Leadwriting Pfad für alle drei öffentliche Flächen (Demo-Form, Zeitplan, Join), so dass ein Besucher eine Führung produziert jedoch viele Schritte, die sie abschließen. Es stempelt die org's "KamoCRM" / "Demo Request" Anbieter Produkt und nimmt den Markt von diesem Anbieter, und es Routen durch LeadService.createLead statt der Speicherung des Unternehmens direkt old inline save produziert keine Historie Reihe und kein LEAD_CREATED Ereignis, also die Leads tauchten nie in einem bereits geöffneten Raster auf. - Firmengröße, Industrie und die Botschaft des Besuchers werden als Lead History gehalten Eintrag; Lead hat keine Spalte für einen von ihnen und sie sind das Teil a Verkäufer tatsächlich liest. - GET /api/public/webinar/types lässt eine öffentliche Seite eher die Typ-ID entdecken als eine fest codierte Kopie tragen, und Slots/verfügbarkeit gibt jetzt auch zurück availableTimes - die gleiche Verfügbarkeit gegen den Besitz org gelöst Zeitzone in Instants, die als geplante StartZeit zurückgegeben werden können.

  5. · kamo-shared-library

    Öffentliche Demo-Antgsteller führen Primitive erfassen

    Ein Besucher, der das Demoformular der Marketing-Website ausfüllt, aber nie eine Zeit bucht keine Spur hinterlassen hat: Die Leerführung wurde immer nur innerhalb der Buchungstransaktion geschrieben. Um es vorne zu erfassen, braucht man drei Stücke, die die Bibliothek nicht hatte. - ************ Match eine Wiederholung Submission zurück auf die führen Sie die gleiche Form bereits produziert. In Bezug auf das Produkt des Herstellers anstatt auf die E-Mail allein, so dass ein anonymes Formular kann nie annehmen (und erneuter Stlage) eine Führung Personal für diese Adresse erstellt. - PublicWebinarDateSlotsDTO: Verfügbarkeit in absoluten Instants gelöst. Die gespeicherte Slot ist ein lokales Datum plus eine Wand-Uhr-Zeit mit einer Zone, die eine Browser kann nicht in eine buchbare geplanteStartZeit werden. - PublicWebinarTypeDTO: ein Webinar-Typ ohne Moderatoren-Roster, also ein öffentliches Seite kann die Typ-ID entdecken, ohne dass die Moderatoren-E-Mail-Adressen zugespielt werden.

  6. · kamo-internal

    Register Provider Setup in der Navigation, und schreiben Sie die schnellen Tipps

    Der Provider Setup-Tab gerenderte innerhalb SettingsView, war aber nur erreichbar durch Eingabe der URL - es fehlte von beiden Orten, die die Einstellungen auflisten Ziele: das Einstellungen nist Menü und die Einstellungen Landing Page. Es führt jetzt jeweils mit der Registerkarte, da welcher Anbieter Meetings veranstaltet, entscheidet, welche der anderen Einstellungen sind sogar verfügbar. Die schnellen Tipps zu den fünf vorhandenen Tabs wurden nie geschrieben - jeder String war einen Platzhalter ("Help Heading", "Bullet Lobby Title"). Sie sagen jetzt etwas, und decken die Einstellungen für Zoom und Teams: In-Meeting-Steuerelemente, Passcode Politik, Lobby Bypass und Moderator Rollen, Remote-Aufnahme ziehen und Transkripte, und Anbieter-sgeschickte Einladungen. Jeder Tab erklärt auch, wo Anbieter unterscheiden, so eine deaktivierte Kontrolle hat einen erklärten Grund, anstatt nur kaputt auszusehen.

  7. · kamo-internal

    Erzwingen Sie Geo- und IP-Zugriffsregeln bei Seitenlasten

    checkAccess hat die Regeln selbst bewertet und nichts für sein ganzes Leben abgeglichen: Regeltypen gegen ************ verglichen, während der Verlag schreibt die enum Namen WHITELIST/BLACKLIST/TEMP_BLOCK. Geo war ein Kommentar sagen Node hat keine GeoLite Datenbank. Beide Hälften sind weg - es liest sich jetzt das Urteil SecurityService Caches in Redis und fragt, dass Service auf einem verpassen, so gibt es eine Umsetzung der Politik und keine Kopie hier links zu driften. Die Adresse ist der rechts-öffentlichste Hop von X-For und nicht der links-meist. Proxies anhängen, so dass das linke Element ist, was der Client gesendet, und lesen würde es lassen Sie einen Header entscheiden, in welchem Land der Besucher behandelt wird. Ein blockierter Besucher bekommt jetzt ein einfaches 403-Dokument statt roher JSON - das erreicht ein Browser mit einer Top-Level-Navigation. Es nennt keine Regel und kein Land: Der Leser kann nicht handeln, und jemand, der die Grenze untersucht, sollte nicht eine Karte davon ausgehändigt werden. Verfehlt auf jedem Weg offen. Ein Proxy, der blockt, wenn Redis kurz unerreichbar ist, nimmt der gesamte Mieter offline.

  8. · APIService

    Regeln für den Zugang von Mietern am Gateway durchsetzen

    Dieser Filter ist träge, seit er geschrieben wurde. resolveOrgId read org:domain:<host von Redis, nichts hat jemals diesen Schlüssel geschrieben, und die Null-Rückkehr fiel durch, um zu erlauben; die geo Zweig war ein leerer if-Block mit einem Kommentar auf SecurityService, die war auch nicht durchsetzen. Jeder Antrag ist vorbei. Es liest jetzt das Urteil SecurityService Caches und fragt, dass Service auf einem verpassen, so dass die Die Politik lebt an einem Ort, anstatt hier neu umgesetzt zu werden. Heißer Weg ist ein Redis lesen; ein Miss kostet einen Short-Time-Out-HTTP-Anruf pro Organisation und Adresse pro 30er Jahre. Die Kundenadresse ist der richtigste öffentliche Hop von X-For. Proxies anhängen, so die linkes Element ist Angreifer-geliefert - Lesen würde es einen Kopfball wählen lassen Land wird der Antrag als ausgehend beurteilt. Befreit Lebenheit Sonden, CORS Preflight und die Entscheidung Endpunkt selbst, und nie Richter Cluster-interne Adressen: Service-to-Service-Verkehr hat kein Land und Es zu blockieren würde die Plattform nach unten nehmen. Fail-offen auf jedem Weg, mit einem Test pro Abhängigkeit. Das sitzt vor allen Mietern API-Verkehr, so dass ein Filter, der blockiert, wenn Redis langsam ist, ist ein Totalausfall. Auch Tropfen ************ -Vorlage Gerüst von der anfänglichen Commit, in einem Paket ohne @SpringBootKonfiguration zu zu finden. Es ist nie bestanden; CI baut mit -DskipTests, so dass nichts bemerkt. Es entfernen macht 'mvn test' hier verwendbar.

  9. · SecurityService

    Eigentlich durchsetzen Geo- und IP-Zugriffsregeln

    Die Regeln wurden gespeichert, bei Redis gekalkt und nie konsultiert. AccessCheckController war der einzige Anrufer der Auswertung und nichts namens AccessCheckController; APIService's gefilterte orgs von einem Redis-Schlüssel nichts geschrieben und behandelt die verpassen als Erlaubnis. Die Konfigurierung eines Geoblocks hat überhaupt nichts gebracht. AccessDecisionService ist nun die einzige Behörde. Login ruft es direkt an, das Gateway filter und der kamo-interne Proxy treffen die gleiche Entscheidung durch den Check-Endpunkt, und die Politik existiert einmal statt einmal pro Schicht. Die Nodekopie war weit gedriftet genug, um nichts zu entsprechen: es verglich Regeltypen mit "Whitelist"/"temp-Block" Herausgeber schreibt WHITELIST/TEMP_BLOCK. GeoLite Auflösung wird in Redis für einen Tag zwischengespeichert, positiv und negativ, und überspringt Privatadressen vollständig. Die Adresse kommt von einem Header, also ohne negativen Cache ein Anrufer rotierende bogons verwandelt jede Anfrage in eine frische Sonde der 5.7M-Row-Tabelle Die DoS-Form findByIpInRange wurde bereits einmal umgeschrieben, um zu vermeiden. ClientIpResolver liest den Veröffentlichungen der Veröffentlichung des Veröffentlichungs-Prants von X-For, nicht die linke. Das linke Element ist das, was der Client gesendet hat: Proxys anhängen, also "X-Forwarded-For: 8.8.8.8" plus Traefiks eigener Anhängsel hätte es jedem erlaubt, sich das Land zu holen, das sein Block ist gegen. Jede Geo-Regel wäre ein Kopfball von der Umgehung entfernt gewesen. Durchgehend offen, pro Abhängigkeit und behauptet pro Abhängigkeit. Eine Zugangskontrolle, die Ausfall geschlossen auf einem Redis Wackelsperren jeden Mieter aus der Plattform, die eine schlimmere ist Vorfall als das Fenster schließt es. Eine Whitelisted Adresse auch umgeht Geo, so ein Admin wer sein eigenes Land blockiert, behält einen Weg zurück in.

  10. · kamo-internal

    Plattform-Registrierungskarte für die Zoom Marketplace App

    Schließt Zooms Ein-Klick-Vernetzungspfad ab. Das Backend löst sich bereits PlatformOAuthProviderType.ZOOM, aber ohne Karte hier hatte ein Plattformbetreiber nirgendwo in die Marketplace Anmeldeinformationen geben, so dass das Treffen Provider Setup Bildschirm berichtete immer One-Click-Vernetzung als unregistriert. Optional nach Design: Der Per-org Server-to-Server-zu-Server-Pfad braucht hier nichts und bleibt die empfohlene Standardeinstellung, so dass eine leere Karte einfach einen Klick versteckt hält. Die Teambesprechungen nutzen die bestehende Microsoft 365 Registrierung wieder.

  11. · kamo-internal

    Microsoft Teams Telefonanbieter, von vorne nach hinten

    Fügt Teams zu ************ hinzu und verdrahtet den ganzen Weg durch: Anbieterauswahl, die Entra + Azure Communication Services config, Mieter Admin Zustimmung, die pro-Mitglied Verbindung, und ein In-Browser-Softphone. Das Softphone ist der Teil, der sich strukturell von jedem anderen Anbieter unterscheidet. Teams stellt keinen SIP-Registrar Dritten aus, so dass eine Teams-Leitung nicht sein kann bei SIP.js oder RingCentral's WebPhone registriert. Die unterstützte Route ist Azure Communication Services' Custom Teams Endpoint: das Backend tauscht die Mitglieds Entra Token für einen ACS Token, und TeamsAcsPhoneSdk verwandelt das in ein Call Agent hinter der gleichen PhoneSdk-Schnittstelle der SIP-Adapter-Kontext, so verwendenSoftphone und jede UI-Komponente bleibt Anbieter-agnostisch. SipCredentials Gewinnt optional acs* Felder; sipInfo ist einfach leer für Teams. Das ACS-Bundle ist nur browser- und dynamisch innerhalb start( importiert, da statischer Import würde das Server-Rendering brechen. Zwei Teams-spezifische Wahrheiten aufgetaucht in der Benutzeroberfläche statt links zu scheitern Laufzeit: In-Browser-Anrufe sind optional (Weave ACS leer und die org immer noch bekommt Präsenz und Anruf-Historie, mit dem Dialer versteckt statt Fehler), und Voicemail ist standardmäßig ausgeschaltet, weil Teams keine Voicemail API hat - Nachrichten landen in der Briefbox jedes Mitglieds, so dass das Lesen ist eine materiell breitere zustimmen, dass sich ein Admin bewusst dafür entscheiden sollte. Die Mitgliedskarte verbinden auf der Registerkarte Telefon-Einstellung ist jetzt Provider-bewusst statt von RingCentral-only. Beide Anbieter benötigen eine Genehmigung pro Mitglied, für verschiedene Gründe: RingCentral, weil sich ein Softphone nur als Connected Konto eigene Erweiterung, Teams, weil Präsenz schreibt und die Berufung Der Token-Austausch ist nur delegiert. Branding: Die Kachel verwendet die Microsoft Corporate Mark und den schlichten Produktnamen. Microsoft erlaubt Benennung Teams, um eine Integration zu beschreiben, schränkt aber Teams ein Logos und Branding an zertifizierte Teams-Partner, so dass keine Teams-Glyphe ausgeliefert wird. Verifiziert: npm Test - 40 Dateien, 394 Tests, 0 Ausfälle; tsc --noEmit clean; die i18n Schlüssel Wache und Client-Navigation Wache beide passieren. Wörterbuch-Strings gelandet zuerst in kamo-translation-dictionary 0801a17.

  12. · VOIPService

    Microsoft Teams Phone als Anbieter

    Teams ist nicht eine API, also klebt der Anbieter drei Steuerflugzeuge zusammen: • Graph, App-only - Rufverlauf (getPstnCalls), Präsenz liest, Verzeichnis und Teams Geräteinventar. Anrufaufzeichnungen sind Anwendungserlaubnis von Design; Microsoft stellt klar, dass sie keine delegierte Form haben. • Graph, delegiert - Präsenz schreibt (Presence.ReadWrite existiert nur als delegierte, selbstverständlich Erlaubnis) und Voicemail, die in der Mitglieder lebt Tauschen Sie Mailbox, weil Teams überhaupt keine Voicemail-Ressource hat. • Azure Communication Services - das In-Browser-Softphone auf der eigenen Seite des Mitglieds Teams Telefonleitung, über die benutzerdefinierte Teams Endpunkt Token Austausch. Das ist die nur unterstützte Route: Teams stellt keinen SIP-Registrar Dritten aus, und die Graph-Cing-API verbindet sich als Bot und nicht als Benutzer. Fähigkeiten werden berechnet, wofür eine Instanz tatsächlich konfiguriert ist anstatt hart codiert, so ein Org ohne ACS berichtet voiceCalls=false und die Benutzeroberfläche Versteckt den Dialer, anstatt einen 501 Mid-Call aufzutauchen. Bewusst abwesend, weil keine Microsoft API existiert bei einer Version: SMS von einer Teamnummer, Anruf Warteschlangen, Anrufweiterleitung, Auto-Antwort und Start-/Stop-Aufnahme. Diese bleiben Sie auf den Schnittstellen-Standards, die 501 erhöhen. Anmeldeinformationen lösen pro Instanz zuerst (eine org registriert ihre eigene Entra-App die gemeinsame Unternehmensform, und es braucht nichts von Kamo die Plattform) und Rückfall pro Feld auf eine MICROSOFT_TEAMS-Reihe in der Plattform OAuth-Registry. Onboarding läuft in zwei Hopfen, weil der Mieter entdeckt werden muss, bevor er kann angeheftet sein: ein Admin-Zeichen in, der id_token's "tid" gibt dem echten Mieter, dann Sie werden an den Pächter /v2.0/Admin Consent geschickt. Zustimmung wird bestätigt durch einen App-Token meißeln und Graph aufrufen . Microsoft gibt admin_consent=True auch bei Ausfall, und warnt, dass die "Zehnant"-Umleitung Parameter fälschbar ist, so Beides wird nicht beruhigt. Beide Teams fließen und die pro-Mitglieder delegierte Verbindung multiplex auf /api/voip/oauth/callback, der eine Weg, der bereits öffentlich ist Gateway, so APIService braucht keine neue Route. Änderungsmeldungen fahren aus dem gleichen Grund mit dem bestehenden /api/voip/webhook. Graph's Handshake unterscheidet sich von RingCentral's . a ?validationToken Abfrage Parameter hallte als Text/einer ein - und wird vor allem beantwortet, seit Grafik lässt Benachrichtigungen für zehn Minuten fallen, wenn ein Endpunkt langsam ist. Abonnements absichtlich ungefiltert erstellt werden: Der Abo-Filter zielt immer noch auf die Vermächtnis "Teilnehmer" Sammlung, die die Rückgabe von Daten im Juni 2026 gestoppt. Zwei bereits bestehende Defekte behoben, weil Teams macht sie tragend: • CallController, CapabilitiesController und CallFeaturesController behoben der Provider über getPrimaryForOrg - die älteste aktive Instanz der Org Typ. Das ist immer nur für einen Single-Provider org richtig. Teams werden in der Regel ein zweiter Anbieter sein, so dass jedes Mitglied Geschichte, Voicemail und Agent Zustand wäre von dem Anbieter bedient worden, der zuerst gegründet wurde. Sie verwenden jetzt ein Mitglied-bewusstes getForMember, das widerspiegelt, was SipController bereits getan hat. • Löschen einer Instanz links member_voip_oauth_token Reihen hinter, da gibt es keine FK zu kaskade, und sie gehalten Berichterstattung "verbunden". Verifiziert: mvn test ca. 133 Tests, 0 Ausfälle (49 neu).

  13. · kamo-internal

    Provider Setup-Tab und Fähigkeit-gated Sitzungseinstellungen

    Fügt die Registerkarte Provider Setup zu /settings/eatures/meets hinzu und macht jede andere tab ehrlich über den Anbieter ist es konfiguriert. useMeeting baut nicht mehr auf Meet.<domain&gt;<room&gt; im Browser war das, was hat jedes Treffen zu einem Kamo Meets-Meet-Meeting gemacht, unabhängig von der Konfiguration. Es jetzt erstellt das Treffen über das Backend und verwendet die URLs, die der Provider zurückgibt, also das Interaction Center, das Chat-Tool-Fenster und das Mitgliederverzeichnis Route durch die Abstraktion ohne eigene Veränderungen: Sie teilen MeetingDialog, das diesen Haken teilt. - Provider-Karten mit einer Einstellung-Abdeckungsleiste, so dass die Kosten für Das Umschalten ist vor dem Schalter sichtbar und nicht danach auf einem entdeckt Registerkarte der ergrauten Kontrollen. Anmeldeformulare sind nur Schreib-only Rückführungen, welche Felder gesetzt sind, nie ihre Werte plus einen Live-Verbindungstest und pro-Provider Setup-Anleitungen. - Capability Gating: useMeetProvider liest die unterstützten Einstellungen des Anbieters und MeetSettingRow deaktiviert den Rest mit einem Tooltip, der den Provider benennt. Ununterstützt Einstellungen werden eher angezeigt als versteckt und sind echt deaktiviert, anstatt nur gedimmt, so dass sie nicht von der Tastatur geändert werden. Speichert sie ganz weglassen. Gating scheitert offen - eine gescheiterte Fähigkeit Lookup zeigt alles, seit ergraut aus einem funktionierenden Bildschirm ist schlimmer als eine Kontrolle zu zeigen, die das Backend ignorieren würde. - Neue Einstellungen, die die anderen Anbieter unterstützen: Join-before-Host, In-Meeting-Chat, Bildschirm-Aktie, Einwahl, authentifizierte Benutzer-only, Passcode-Länge und Einbettung, Lobby Bypass Umfang, Moderator und Teilnehmer Kontrollen, Cloud-Aufnahme, Transkripte, Aufzeichnung Download und Anbieter-sent Einladungen. - /meet/join/<ref" ist jetzt Provider-bewusst: Kamo Meets bekommt immer noch einen Einmalschlüssel Zoom und Teams werden zur Klickzeit umgebildet. Es akzeptiert eine Meeting-ID oder einen Raumnamen, also Einladungen vor dieser Änderung gesendet Arbeiten Sie weiter. - Die E-Mail Einladung Link wird von einer UUID-validierten Sitzungs-ID gebaut ein Raumname, die Beibehaltung der bestehenden Regel, dass eine Client-erweiterte URL ist nie Vertrauen in eine Org-Marke E-Mail.

  14. · kamo-shared-library

    MICROSOFT_TEAMS Provider

    Angehängt an VoipProviderType. Das Enum bleibt als ORDINAL auf ************ so die Position ist tragend und die Konstante geht zuletzt; die Klasse Javadoc sagt jetzt so, anstatt die nächste Person, um es zu folgern. Keine DDL-Änderung - eine ORDINAL-Spalte hat keinen Wert Whitelist, so braucht dies keinen KamoInitializer zu laufen. Fügt zwei abgeleitete Abfragen auf MemberVoipOAuthTokenRepository hinzu: • findByProviderAndInstanceId - Karten eine eingehende Provider-Identität (ein Microsoft Entra object-ID auf einer Team-Aufruf-Rekorde) zurück zu einem Kamo-Mitglied. • deleteByInstanceId - diese Zeilen haben kein FK für die Instanz, also ein Löschen Der Anbieter ließ sie hinter sich und berichtete "vernetzt".

  15. · APIService

    Route der Meeting-Anbieter OAuth Callback

    Zoom und Microsoft umleiten den Browser zu diesem Gateway, nachdem ein org autorisiert Kamos App. Das Popup landet hier ohne Mieter-Sitzung - die org reist in ?State - so dass der Rückruf braucht die Sessionless, auth-stripping Durchlaufen der E-Mail-Provider-Callback verwendet bereits, nicht die gewöhnliche /api/meet/** vorwärts.

  16. · MediaService

    Meeting Provider Abstraction mit Zoom und Microsoft Teams

    Meetings waren Kamo Meets by Construction - MeetService beharrte ein Meet-Raum Name und nichts anderes. Dies führt die Abstraktion und zwei Remote-Anbieter dahinter. meet/provider spiegelt die E-Mail Provider-Schicht: MeetingProvidResolver stellt zusammen ein MeetingContext (entschlüsselte Anmeldeinformationen, aktualisierte OAuth-Zuschuss, org Politik, die Provider-seitiges Host-Konto) und eine Fähigkeitskarte, so dass Anrufer fragen nach MeetingScheduler statt Verzweigung auf Anbieter-Typ. Hinzufügen eines vierten Provider bedeutet, eine Bohne hinzuzufügen, keine Anrufseiten zu bearbeiten. - KamoMeetProvider: Raumbenennung und URL-Konstruktion, verschobene Serverseite. Die org-namespacing, das zwei Mieter daran hindert, eine Prosody-Konferenz zu teilen live im Browser; es wird jetzt durch Tests angeheftet. - ZoomProvider: REST v2, Server-zu-Server OAuth oder die Marketplace-App. Creates im Namen des organisierenden Mitglieds, zieht Cloud-Aufnahmen und Transkripte. - MicrosoftTeamsProvider: Graph onlineMeetings, app-only oder delegiert. Seine Verbindungsprüfer Sonden treffen Schaffung, weil die Anwendungszugriff Politik Teams erfordert auch ist die übliche Sache, die ein Admin verpasst - die Erlaubnis allein authentifiziert fein und dann 403s auf jeder Tagung. MeetingFeature ist der Vertrag mit dem Admin UI: Jeder Anbieter erklärt Einstellungen können sie einhalten, und die Einstellungsbildschirme deaktivieren den Rest. Ansprüche sind behauptet in Tests statt vertrauenswürdig, da ein überforderungsberechtigen Anbieter produziert kippt an, dass sie leise nichts tun - das Versagen, das diese Schicht zu verhindern existiert. ProviderRecordingSweep zieht entfernte Aufnahmen in Kamos eigenen Speicher so Bei den Beibehaltung, Quoten und Zusammenfassungen nach der Sitzung wirken bei jedem Anbieter gleich. Downloads sind gedeckelt: Dieser Service dient auch Chat und Meetings unter einem 1Gi Limit, so dass eine überdimensionierte Aufnahme wird mit einer Warnung übersprungen, anstatt zu riskieren die Hülse. Anmeldeinformationen sind mit dem bestehenden Plattform-Schlüssel verschlüsselt, so dass kein neues Geheimnis hat Vorsorge zu schaffen. Sitzungsabwicklung geteilt durch die Treffen-Endpunkte bewegt sich in MeetSessionResolver - bewusst ohne Erweiterung der Rechteprüfung.

  17. · InitializerService

    Schema für die Multi-Provider-Trennungsschicht

    Erstellt ************ und org_meeting_oauth_tokens, fügt hinzu die Provider-Identity-Spalten zu MEETING_RECORDS und MEETING_RECORDINGS und der Zoom/Teams-fähige Einstellungen zu ORG_MEET_CONFIG und verfüllt alle vorhandenen Organisation zu einer expliziten KAMO_MEET/ACTIVE-Reihe. Zwei Dinge, die uns dieser Lauf gelehrt hat, beide hier codiert. Hibernate's ddl-auto baut die SessionFactory vor jedem CommandLineRunner, also die CREATE TABLE Anweisungen normalerweise no-op und die Spalten kommen ohne Standard - die Backfill daher liefert id und Timestamps explizit, anstatt sich auf sie zu verlassen, weshalb seine erste Version still eingefügt nichts. Und die Einzigartigkeit auf der Entitäten bedeutet Hibernate unterhält seine eigenen Einschränkungen, so dass die genannten Indizes ein Frühe hinzugefügte Revision wurden Duplikate hinzugefügt; sie werden hier fallen gelassen. Fügt com.kamo.z.shared.meet zur expliziten @EnableJpaRepositories Liste hinzu, ohne die neuen Repositories haben keine Bohnen und KI abtreibt vor jedem Läufer Feuer.

  18. · kamo-shared-library

    Modellsitzungen als Provider-Agnostiker

    Kamo Meets war das einzig mögliche Backend: OrgMeetConfig war ein flaches Meet Einstellungen Tasche und ein MeetingRecord hielt nichts als einen Raumnamen. Dies fügt die Schema für die Durchführung einer Organisation auf Zoom oder Microsoft Teams statt. - meet.provider: MeetingProviderType / MeetingProviderStatus, der per-org OrgMeetingProviderEntity (verschlüsselter Anmeldebonus, last-verified state) und OrgMeetingOAuthTokenEntEntity, Spiegelung des email_provider-Pakets, das bereits unterstützt die Abstraktion des E-Mail-Anbieters. - MeetingRecord gewinnt die eigene Identität des Hosting-Providers - Remote-Meeting-ID, beitreten und Host-URLs, Passcode, Host-Konto - so kann ein Meeting wieder aufgenommen werden und Versöhnt, wer es beherbergt. - MeetingRecording Gewinne AnbieterRecordingId, die den Sog einer Fernbedienung hält Provider Cloud-Aufnahme idempotent. - OrgMeetConfig gewinnt die Einstellungen Zoom und Teams unterstützen, dass ein Meet-only config hatte keinen Grund zu tragen: Join-before-Host, Passcode-Begestaltung, Lobby Bypass-Objektive, Moderator und Teilnehmersteuerung, Cloud-Aufnahme, Transkripte, Anbieter-geschickte Einladungen und die Fallback-Host-Meetings werden unter wenn ein Mitglied kein Konto beim Anbieter hat. Jede Org ohne Provider-Zeilen löst sich auf KAMO_MEET, also ist dies träge, bis ein admin wählt anders. Säulen wurden von KamoInitializer auf Produktion angewendet bevor dies gelandet. PlatformAuthProviderType erhält ZOOM(9) für die Zoom Marketplace App; Teams Treffen werden MICROSOFT(3) wiederverwendet. Seine Wachprüfung bewegt sich mit ihm, seit einem enum und der Test, der seine persisted ids pinning kann nicht separat landen.

  19. · kamo-internal

    Zulassungsliste Länder auf der Geo-Blocking-Karte

    Die Karte konnte nur Länder leugnen, so dass ein Org, das ein Land bedient, aufzählen musste jeder andere. Es hat jetzt beide Listen: ein Modus zuggle wählt welche Liste das gewählte Land landet auf, und die beiden Tische sitzen nebeneinander. Eine leere Erlaubnisliste erlaubt alles, was nicht blockiert ist; eine nicht-leere verweigert jedem Land abwesend. Diese Umkehr ist drastisch genug, um auf der Karte zu erklären, anstatt zu lassen entdeckt werden, so dass die Mitteilung über den Tabellen sagt, welches Regime in Kraft ist. Die einzigartige (org, Land) Einschränkung hält ein Land auf genau einer Liste, die machen würde Re-Abgesehen von der anderen scheitern, so dass jede Zeile eine Bewegung Aktion, die es über PUT kippt trägt statt.

  20. · SecurityService

    Genehmigungsliste Länder neben Geo-Blöcken

    Der Geoabschnitt wurde immer nur verleugnet: Ein Land wurde blockiert oder es fehlte. Orgs, dass einem Land dienen zu wollen, musste jedes andere aufzählen, was unerreichbar ist und in dem Moment, in dem ein neuer Ländercode erscheint, leise falsch. org_geo_block_rules.is_blocked existierte bereits und war hartcodiert, also erlauben Regel ist, dass Spalte falsch gesetzt - keine Schemaänderung. Bewertung: ein expliziter Block gewinnt, dann eine Genehmigungsliste bestreitet alles, was daran fehlt, und eine leere Erlaubnis für die Erlaubnis alles nicht blockiert. Das hält bestehende Block-only-Orgs verhalten sich genau wie zuvor. veröffentlichenGeoRules verschifft jetzt beide Seiten der Regel gesetzt, da erlauben Regeln sind tragende sobald man existiert. Cached Nutzlasten vor dieser Änderung geschrieben tragen kein isBlocked Feld und über den Cache TTL über einen Einsatz hinweg, so dass sich ein fehlendes Feld als blockiert liest. Auch die Rahmen-Blockiert und Löschen, um die Anrufer oder löschen Sie eine Regel behoben von UUID allein, so dass eine id von einem anderen Mieter geehrt worden wäre.

  21. · kamo-shared-library

    Lesen Sie die Qualität auf Anpassungen und Leitlinien-Versionen

    Ein zusammengebauter Preis ist eine Basiszelle PLUS die Anpassungen auf sie gestapelt, so zu beurteilen nur die Zelle beurteilt die Hälfte der Zahl: eine sauber gelesene 99.875 mit einem missverstandenen -1.250 LLPA an der Spitze ist immer noch ein falscher Preis. MlosPriceAdjustment trägt jetzt die Lesequalität von dieser einen Anpassung, so dass das Sign-off-Gatter das schwächste Glied über die ganze Montage. MlosGuidelineVersion erhält das gleiche Feld für Konsistenz mit der Rate-Blatt-Bremssäule -- es hat bereits SourceDocumentId transportiert, so dass dies seine Provenienz vervollständigt. Beide nullbar; Null bedeutet KEIN UNTERneitativ und nicht gut. Säulen bewarben sich für Prod CockroachDB via KamoInitializer.

  22. · kamo-internal

    Öffnen Sie Links zurück in diese App in der Registerkarte, in der sich das Mitglied bereits ein

    Post im Lesebereich öffnet jeden Link in einem neuen Reiter, der für die ganzes Internet und falsch für uns. Unsere Benachrichtigungs-E-Mails sind fast vollständig Links zurück in die App, und das Senden von denen, um eine frische Registerkarte wirft die Sitzung Mitglied hat und macht sie sitzen durch einen kalten Boot, um eine Seite dieser Registerkarte zu erreichen könnte sofort gerendern. Der gleiche Ursprung ist der gesamte Test - äglich mit der Seite, die die E-Mail wiedergibt, nicht "sieht aus wie eine Kamo-Domain" und nicht wie ein Suffix-Match auf der Org-Domäne. Das ist genau die Menge der URLs die aktuelle Sitzung ist gültig, die die gesamte Grund, in diesem Tab zu bleiben, und es ist un-spoofable per Post: ein anderer Mieter Host, ein Doppelgänger, oder userinfo, die den Host woanders zeigen, sind alle unterschiedliche Ursprünge und gehen Sie zu einem neuen Tab wie jeder andere Fremde Link. Routing statt Ortszuweisung: Eine vollständige Dokumentenlast reißt den Reaktor herunter tree und zerstört jedes geöffnete Werkzeugfenster zusammen mit jedem nicht gesendeten Entwurf, weshalb dieses Repo hat ein Build-Gate gegen harte interne Navigation. Modifiziert und Mitte Klicks werden in Ruhe gelassen - diese Geste ist der Benutzer absichtlich fragen nach einem neuen Tab. Zuhören von den Eltern funktioniert, weil der Sandkasten bereits erlaubt-gleichen-Herkunft hält für die Höhenmessung beim Weglassen von allow-scripts, also nichts aus der E-Mail selbst läuft immer; der Handler gehört uns, von außen angebracht. Eine Falle, die es wert ist, aufgezeichnet zu werden, gefangen durch einen eigenen Test: Rückkehr eines Pfades statt einer URL ist notwendig, aber NICHT ausreichend. "https://host/evil.test" ist wirklich gleich-origin, und sein Pfadname ist "//evil.test", den der Router als Protokoll-relativ liest und folgt Off-Site. Eine per E-Mail offene Umleitung, die eine Ursprungsprüfung passiert. Ein solcher Link fällt nun auf eine neue Registerkarte, wo der Browser die reale, harmlose URL auflöst, anstatt stillschweigend an einen Ort umgeschrieben zu werden, hat die E-Mail nicht gezeigt.

  23. · kamo-shared-library

    Per-Zellextraktion Vertrauen + Förderfähigkeit-Matrix-Probenahme

    Zwei Lücken im Vertrauensmodell, beide auf dem Geldpfad. PER-CELL. Ein blattbreiter Boden ist das falsche Korn für die Beurteilung eines Preises: ein einziger schlecht gelesener Coupon zieht das ganze Blatt nach unten und würde jeden ANDEREN Preis darauf senden zu einem Menschen, während ein hoher Blattboden sagt nichts über die spezifische Zelle ein Kreditnehmer wurde tatsächlich zitiert. **************** nimmt auf, wie gut DIESE Rate/Preis/Sheriegelreihe wurde gelesen, so dass ein falsch gelesener Coupon nur seinen eigenen Preis kostet. ELIGIBILITÄT PROVENANCE. MlosEligibilityMatrix hatte keinen Weg zu einem Quellendokument bei alle -- seine einzige Route war eine NULLABLE RichtlinieId, so dass eine geförderte Matrix könnte nicht auf das Blatt zurückverfolgt werden, aus dem es kam. Förderfähigkeit entscheidet, ob ein Darlehen angebotsfähig, was es genau dort macht, wo eine Verleugnung erklärbar sein muss; eine Provenienz Lücke gibt es eine Lücke an dem Punkt, ein Kreditnehmer wird gesagt, nein. Es trägt jetzt sourceDocumentId und derselbe Extraktionsvertrauensvertrag wie der Zinsbogenrücken. Beide null, und Null bedeutet KEIN SIGNAL statt gut. Spalten angewendet, um prod CockroachDB über KamoInitializer.

  24. · kamo-signer-monorepo

    Zeigen Sie das Telefon des Agenten, gebührenfrei und E-Mail auf der Kopie des Kunden

  25. · kamo-internal

    Zeigen Sie das Telefon des Agenten, gebührenfrei und E-Mail auf der Vorschau

    Jede auf eigene Linie: ein Run-on von zwei Zahlen und eine Adresse liest sich als eine Zeichenkette und wird falsch gewählt.

  26. · SecurityService

    Lösen Sie die veröffentlichten Kontaktdaten des Agenten

    E-Mail kommt aus der primären Mailbox des Mitglieds statt TeamMember.emailWork Spalte ist freier Text vor der Mailbox Bereitstellung und routinemäßig nicht einverstanden mit der Adresse, von der sie tatsächlich senden. Es bleibt der Fallback, wenn kein Briefkasten primär ist. Ein VOIP-fähiges Mitglied mit einer Erweiterung wird als eigene Zeile der Org veröffentlicht und Erweiterung, bietet die gebührenfreie Nummer zu, wenn die Org eine hat. Ohne Verlängerung, ihre Arbeit Telefon - die einzige Nummer, die sie halten, soll veröffentlicht werden. Ein Behinderter VOIP config veröffentlicht nichts, weil diese Erweiterung nicht antwortet. Jede Nachschau ist defensiv: Versäumnis, ein kundenorientiertes Dokument zu machen, weil eine Mailbox es fehlt, wäre schlimmer, als eine weniger Möglichkeit zu drucken, um Kontakt aufzunehmen.

  27. · kamo-shared-library

    Veröffentlichen Sie jeden Weg, um den Agenten zu erreichen, nicht nur einen Namen

    Name und Titel allein sagen einem Kunden, der das Angebot besitzt, aber nicht, wie man darüber fragt. Der Block trägt jetzt E-Mail und Telefon, gelöst durch den Anrufer - die primäre Mailbox lebt im E-Mail-Provider-Schema und der Erweiterung in der VOIP-Konfiguration, weder erreichbar von einem statischen Helfer. Hauptleitung und gebührenfrei sind getrennte Felder, so dass das Dokument beide drucken kann: Wahl zwischen ihnen ist die Wahl, was der Anruf kostet der Kunde. lineWithExtension paart eine Verlängerung mit der Org-Linie, die es abhängt, und gibt null zurück, wenn entweder die Hälfte fehlt. Ein Waisenkind "ext. 204" ist keine Nummer, die jemand anrufen kann, und eine nackte org line würde den Kunden zur Schalttafel fehlleiten, als wäre es die des Agenten.

  28. · kamo-shared-library

    Extraktion Vertrauen auf dem Katalog Spine + Auto Sign-off-Basis

    Ein Preis ist nur so vertrauenswürdig wie das Blatt, aus dem es zusammengesetzt wurde, und nichts auf der Preispfad trug dieses Signal: Vertrauen existierte NUR auf Vor-Promotion Inszenierungszeilen (MlosExtractedCandidate), die kein Produktionscode gelesen hat. **************** ist das WEAKEST pro Feld Vertrauen über die zugelassenen Kandidaten in die Version gefördert -- Minimum, nie bedeuten. Ein Blatt von 200 sauberen Zellen und eine 0,20 falsch gelesen Durchschnitt auf 0,996 und würde klar jede Schwelle, während diese eine Zelle ist die, die einen Kredit falsch bepreist. Null bedeutet NEIN SIGNAL (handautorisiert oder beworben, bevor die Spalte existierte) und Verbraucher müssen sich zu verweigern, Auto-Genehmigung auf sie; Lesen abwesend als gut ist, wie ein ungeprüfter Preis geht unreviewed. WORM-geschützt wie die anderen preiswertigen Spalten -- schnappt in @PostLoad und in @PreUpdate verbreitet, sonst wäre es ein stillschweigend veränderbares Loch in die Prüfungskette. MlosPricingSignoff gewinnt automatisiert / basis_confididence / threshold_applied. Ohne sie eine Maschinenzulassung ist von einer menschlichen nicht zu unterscheiden, außer von einem Mitglied id, die auf dem Geldweg ein Prüfungsfehler ist. Die Schwelle wird neben der Wert, weil die Konfiguration bewegt: 'Vertrauen war 0,72' kann später nicht beurteilt werden ohne zu wissen, ob die Bar an diesem Tag 0,70 oder 0,90 war. Spalten angewendet, um CockroachDB über KamoInitializer zu prod.

  29. · kamo-internal

    Zitate Tab - jedes Angebot über die Konto-Letführungen

    Ein serverseitiger DataGrid neben Leads, mit Suche über Anzahl und Titel, Status, Gesamt Reichweite und erstelltes Datum-Sortitel. Filter teilen einen debounce und kollabieren in eine einzige Abfrage, so dass die Anpassung einer Reichweite, während Die Eingabe kostet eine Hin- und Rückfahrt statt einer pro Tastendruck pro Feld. Jede Filteränderung Resets auf Seite 1 - Bleiben auf Seite 6 eines schmaleren Ergebnis-Sets liest sich als leeres Raster. Abgang wird neben Status angezeigt: Ein SENT-Zitat kann sein Gültigkeitsdatum und trotzdem Lesen Sie als SENT, so dass diese Reihen tragen ihre eigenen Marker statt still falsch beschriftet. Reihen und die Lead-Spalte führen beide in die Registerkarte der Lead-Zitate.

  30. · SecurityService

    GET /quotes/account/{uid] - paged, gefiltert, sortiert

    Daten kommen als ISO-Strings an und parse nachsichtig: ein Filter, den der Client schlecht sendet sollte schmalen nichts statt 400 das gesamte Gitter. Ein Datum-nur "zu" gebunden deckt die gesamte an diesem Tag, sonst Filterung bis heute zurückkehrt nichts seit Mitternacht angehoben.

Euer Universum wartet.

Fügen Sie Produkte hinzu, wann immer Sie möchten – keine Migration, keine neuen Anmeldungen.

Für immer kostenlos – keine Kreditkarte erforderlich