Przejdź do treści
KAMOUniverse

Changelog

Co nowego.

Każde ulepszenie platformy, jak to wysyła.

  1. · VOIPService

    Wytrwaj połączenia i połączenia, SMS-y i poczty głosowej z przewodami

    Połączenia nigdy nie zostały nagrane nigdzie - VoipCallEventService opublikowało wydarzenie NATS Dla przeglądarki i nie zachował nic, a RECORDINGS istnieje tylko wtedy, gdy audio było Zdobyty. Synchronizacja na instance teraz ciągnie historię połączeń za pośrednictwem PhoneProvider Abstrakcja i upserts PHONE_CALL_LOG, wpisane (instancja, dostawca zadzwoń id). Jest to jedyna trasa, która działa dla FreePBX i Microsoft Teams, żadna z nich nie Który oferuje użyteczny na telefon webhook. Zamiatanie jest samotny pisarz. Trwanie z RingCentral webhook również Został wypróbowany i usunięty: jego powiadomienie przenosi telefonięSessionId, gdy Call-history API zwraca inny id rekordowy, więc obaj pisarze wyprodukowali dwa Wpisy wiersze i dwa wpisy osi czasu dla jednego połączenia. Połączenia są przypisywane rozszerzeniu tylko wtedy, gdy to rozszerzenie jest faktycznie na - Zadzwoń. Punkt końcowy RingCentral jest rozszerzeniem / " ignoruje argument, więc zapętlanie Na rozszerzenie w przeciwnym razie zgłosiłoby połączenia każdego członka w dowolnym przypadku. Plota odwiedziła ostatnia. Id id nagrywanie jest rozwiązywane na stronę za pośrednictwem RecordingLookupService, tak samo Wzbogacenie dostaje historia softfonów – bez tego zakładka zna nagranie Istnieje, ale nie może grać. Link do wysyłania / odbioru; link poczty głosowej na synchronizację.

  2. · InitializerService

    Schemat i ziarno punktu kontaktowego dla komunikacji ołowiowej

    Hibernate tworzy trzy nowe tabele od jednostek współdzielonych lib; dodaje Czego nie może wyrazić – częściowy unikalny indeks, który utrzymuje się co najwyżej jeden otwarty Okno punktu kontaktowego na (ołowiu, gniazda) i DESC obejmujące indeksy dla Skanowanie keyset o linii czasu. Nasienie otwiera pierwsze okno dla każdego ołowiu, który wyprzedza indeks. Nie a nie a. Podanie komunikacyjne: żadne połączenie historyczne lub wiadomość nie jest powiązana - Nie ma nic. Bez tego wcześniejsza przewaga nie ma żadnych punktów kontaktowych i może Nigdy nie pasują do połączenia przychodzącego, więc każda zakładka pozostanie pusta na zawsze. Przebiega przez LeadContactPointService zamiast masy INSERT..SELECT tak Jest dokładnie jedno wdrożenie kanonizacji. Kominek SQL miałby Do usuwania cyfr re-wydowla, obsługi NANP, podłogi i adresu rozszerzenia Rozpakowanie, a każda późniejsza dywergencja byłaby niewidoczna – rozstawione rzędy Po prostu przestań pasować do ruchu na żywo. Stosowany przeciwko produkcji: 66 punktów kontaktowych otwartych na 45 leadach.

  3. · kamo-shared-library

    Wskaźnik punktu kontaktowego w czasie i linki komunikacji prowadzącej

    Dodaje kręgosłup, z którego lektury główna czytają zakładka Communications. LEAD_CONTACT_POINTS rejestruje każdy numer telefonu i e-mail, który kiedykolwiek miał ołów, jako okno z aktywnymFrom /activeTo. LEAD_COMMUNICATIONS rejestruje trwałość Link między czereną a jednym połączeniem, pocztą głosową, tekstem lub e-mailem, napisanym na stronie Chwila, która dzieje się z punktami kontaktowymi na żywo w tym momencie – więc zmiana Liczba smyczy wiąże tylko przyszły ruch i pozostawia historię dokładnie taką, jaka była. PHONE_CALL_LOG to rekord połączeń, którego platforma nigdy nie miała: RECORDINGS ma tylko Wiersz, gdy dźwięk został uchwycony, tak pominięte i nienagrane połączenia nie pozostawiły śladu. ContactCanon to jedna definicja "tego samego numeru" dla całości Platforma; LeadController.canonicalPhone teraz deleguje do niego tak odwrotne spojrzenie Dopasowanie komunikacji nie może się z tym nie zgadzać. LeadContactPointService i LeadCommunicationLinker celowo NIE Stereotyki – wspólna lib-ale „Service potrzebujący repozytorium zawodzi startup kontekstowy” W każdej usłudze, która nie dodała pakietu, która przyniosła produkcję Trzy razy w dół. Usługi posiadania deklarują fasolę; LeadService je przyjmuje Autowired (wymagane-false), więc nadal przewija się wszędzie.

  4. · MediaService

    Uchwytywanie leadu demo przed etapem rezerwacji

    Formularz demonstracyjny witryny marketingowej zebrał nazwę, e-mail, firmę, rozmiar firmy, Przemysł i przesłanie, a następnie przesunęły się do planowania, nie mówiąc nikomu. Tworzenie ołowiu żyło tylko wewnątrz - tak Każdy odwiedzający, który nie ukończył rezerwacji – w tym w ogóle każdy odwiedzający Podczas gdy dostępność nie jest publikowana – została odrzucona po przekazaniu ich Szczegóły. - POST - pisze trop na własną rękę. Posiadanie org Pochodzi z nagłówka X-Public-Chat-Org-Id APIS znaczków z API Walidowany klucz, nigdy z ciała. - findOrCreatePublicLead jest teraz pojedynczą ścieżką pisania ołowiu dla wszystkich trzech Powierzchnie publiczne (forma demona, harmonogram, łączenie), więc jeden odwiedzający produkuje jeden ołów Jednak wiele kroków dopełniają. Podznacza orgę "KamoCRM" / "Demo Poproś o produkt dla sprzedawcy i zabierz rynek od tego sprzedawcy, a on się poprowadzi Przejście LeadService.createLead zamiast bezpośrednio zapisywać byt — Stary inline save nie wyprodukował żadnego wiersza historii i nie ma wydarzenia LEAD_CREATED, więc te Prowadzący nigdy nie pojawiali się w już otwartej siatce. - Wielkość firmy, branża i przesłanie odwiedzającego są utrzymywane jako historia przewodnią Wpis; Ołów nie ma kolumny dla żadnego z nich i są częścią Sprzedawca faktycznie czyta. - GET /api/public/webinar/types pozwala stronie publicznej odkryć raczej typ id niż nosić zakodowaną kopię, a sloty / dostępne teraz również zwracane dostępneCzasy — ta sama dostępność rozwiązana w stosunku do posiadania org's Timezone w momenty, które można odtworzyć jako zaplanowany StartTime.

  5. · kamo-shared-library

    Publiczne owadowe ołowiu wychwytują prymitywy

    Odwiedzający, który wypełnia formularz demonstracyjny witryny marketingowej, ale nigdy nie rezerwuji czasu Nie pozostawiono śladu: trop był kiedykolwiek zapisany tylko wewnątrz transakcji rezerwacyjnej. Uchwycenie go z przodu wymaga trzech elementów, których nie miała biblioteka. - - dopasuj powtórne zgłoszenie z powrotem do: Prowadź tę samą formę już wyprodukowaną. Zidentyfikuj produkt producenta, a nie Tylko do e-maila, aby anonimowy formularz nigdy nie mógł przyjąć (i ponownie dźgnięcia) tropem Pracownicy stworzeni na ten adres. - PublicWebinarDpartSlotsDTO: dostępność rozwiązana w absolutną chwilę. A. w tym, w powt. w potycie, w pot wt., w tym, w tym, a w tym, a w tym, w tym, w tym, w tym, w tym, w tym Przechowywane szczeline to lokalna data plus czas zegara ścienna bez strefy, która Przeglądarka nie może zamienić się w rezerwowy zaplanowanyStartTime. - PublicWebinarTypeDTO: typ webinarium bez składu prezentera, więc publiczny Strona może odkryć typ id bez wycieku adresów e-mail prezenter.

  6. · kamo-internal

    Rejestracja Dostawki w nawigacji i napisz szybkie wskazówki

    Karta Konfiguracja dostawcy renderowana wewnątrz SettingsView, ale była dostępna tylko przez Wpisanie adresu URL — brakowało go w obu miejscach, które z listy ustawień Losy: menu nav ustawień i strona docelowe ustawień. Teraz to prowadzi Każdy, dopasowując zamówienie zakładki, od którego dostawca organizuje spotkania decyduje, które Z pozostałych ustawień są nawet dostępne. Szybkie wskazówki dotyczące pięciu istniejących zakładek nigdy nie zostały napisane - każdy ciąg był Zapasowy ("Help Heading", "Bullet Lobby Title"). Teraz już coś mówią, I przykryj ustawienia dodane dla Zoom i Teams: sterowanie wsie, hasło Polityka, obejście lobby i role prezenterów, zdalne przyciąganie i transkrypcje, Zaproszenia i dostawcy-ss-ssent. Każda zakładka wyjaśnia również, gdzie dostawcy różnią się, więc Niepełnosprawna kontrola ma określony powód, a nie tylko wygląda na zepsutego.

  7. · kamo-internal

    Wymusuj reguły dostępu geograficznej i IP na obciążeniach stron

    checkAccess ocenił same zasady i nie pasował do niczego przez całe życie: Porównane typy reguł przeciwko - podczas gdy wydawca Nazwy enum WHITELIST/BLACKLIST/TEMP_BLOCK. Geo było komentarzem mówiącym, że Node ma Nie ma bazy danych GeoLite. Obie połówki zniknęły - teraz czyta werdykt SecurityService Przypojem w Redis i prosi o tę usługę na miss, więc jest jedna implementacja Polityka i brak kopii do dryfowania. Adres jest najbardziej prawicowym publicznym hopem X-For, a nie najbardziej lewym. Słupki proxy dołącza, więc lewy element jest tym, co klient wysłał, i przeczytanie go Pozwolę, aby nagłówek zdecydował, w którym kraju odwiedzający jest traktowany jako przebywający. Zablokowany gość otrzymuje teraz zwykły dokument 403 zamiast surowego JSONa - to dociera do Przeglądarka wykonująca nawigację na najwyższym poziomie. Nie nazywa żadnej reguły i nie ma kraju: czytelnik nie może Działaj zgodnie z tym, a ktoś badający granicę nie powinien mieć jej na mapie. Porażka na każdej drodze. Aprog, który blokuje, gdy Redis jest na krótko nieosiągalny ujęć Cały najemca offline.

  8. · APIService

    Egzekwowania przepisów dotyczących dostępu najemców przy bramie

    Ten filtr jest obojętny od czasu jego napisania.UtytułOrgId czyta org:domain:-host> Z Redis, nic nigdy nie napisało tego klucza, a nieważny powrót upadł, aby pozwolić. Gałąź geo była pustym blokiem if-block z komentarzem odroczonym do SecurityService, który był Nie egzekucja też. Każda prośba została przekazana. Teraz czyta werdykt SecurityService caches i prosi o tę usługę na miss, więc Polityka żyje w jednym miejscu, a nie jest tu ponownie wdrożona. Gorąca ścieżka to jeden Redis Czytaj; miss kosztuje jeden krótki czas HTTP na organizację i adres na 30s. Adres klienta jest najbardziej zgodny z prawem publiczny hop X-For. Spółki proxy dodają się, więc Lewy element jest zaopatrzony przez atakującego - przeczytanie go pozwoliłoby nagłówkowi wyboru, który Kraj, z którego pochodzi wniosek. Zwolnia sondy na życie, przedwypływ CORS i sam punkt końcowy decyzji, i nigdy Sędziowie adresów współwewnętrznych: ruch typu service-to-service nie ma kraju i Blokowanie go zdjąłby platformę. Nieudane - otwarte na każdej ścieżce, z testem na zależność. To siedzi przed wszystkimi lokatorami Ruch API, więc filtr blokujący, gdy Redis jest powolny, jest całkowitym przestojem. Również krople - — szablon Rusztowanie od początkowego commitu, w pakiecie bez konfiguracji SpringBoot do Znaleźć. Nigdy nie minął; CI buduje z -DskipTests, więc nic nie zauważyło. Usuwanie go Uczyń "testem mvn" użytecznym tutaj.

  9. · SecurityService

    W rzeczywistości egzekwowanie reguł dostępu geograficznej i IP

    Zasady były przechowywane, buszkowane do Redis i nigdy nie konsultowano. AccessCheckController był Jedyny rozmówca oceny i nic o nazwie AccessCheckController; APIService's Filtr rozwiązany orgs z klucza Redisa nic nie napisał i nie potraktował miss jako pozwolenie. Konfiguracja bloku geograficznego wcale nic nie zrobiła. AccessDecisionService jest teraz jednym organem. Login nazywa go bezpośrednio, brama filtr i zastępca kamo-internal decydują o tej samej decyzji przez punkt końcowy, Polityka istnieje raz zamiast raz na warstwa. Kopia węzła dryfowała daleko Wystarczająco, aby nic nie pasować: porównał typy reguł do "whitelist" / "temp-block" podczas Wydawca pisze WHITELIST/TEMP_BLOCK. Rozdzielczość GeoLite jest buczakowana w Redis przez dzień, pozytywnie i negatywnie, i przeskakuje Adresy prywatne w całości. Adres pochodzi z nagłówka, więc bez negatywnej pamięci podręcznej dzwoniącze obracające bogony zamieniają każdą prośbę w świeżą sondę stołu 5.7M-row – Kształt DoS findByIpInRange został już raz napisany, aby uniknąć. ClientIpResolver czyta PRAWKI publiczny X-For, nie w lewo. Lewy element to wszystko, co wysłał klient: proxy, więc "X-For: 8.8.8". plus własne dodanie Traefika pozwoliłoby każdemu wybrać kraj, którym jest ich blok Osądzano go przeciwko. Każda reguła geo byłaby jednym nagłówkiem od bypassu. Niezajęto się w całym okresie, za zależność i zapewnione na zależność. Kontrola dostępu, która Zamknięte na chwiejnym Redis zamykają każdego najemcę z platformy, co jest gorsze Incyd incydent niż okno, które zamyka. Biały adres omija również geomin, więc administrator Kto blokuje swój kraj, trzyma się z powrotem.

  10. · kamo-internal

    Karta rejestracyjna platformy dla aplikacji Zoom Marketplace

    Uzupełnia ścieżkę połączenia Zoom z jednym kliknięciem. Zaplecza już się rozwiązuje PlatformOAuthProviderType.ZOOM, ale bez karty tutaj operator platformy Nie ma gdzie wchodzić w poświadczenia Marketplace, więc Konfiguracja spotkania Dostawcy Ekran zawsze zgłaszał połączenie jednym kliknięciem jako niezarejestrowany. Opcjonalnie według projektu: ścieżka na serwer-do-org nie potrzebuje tutaj nic i Pozostaje zalecana domyślność, więc pusta karta po prostu ukrywa jeden kliknięcie. Spotkania zespołów ponownie wykorzystuje istniejącą rejestrację Microsoft 365.

  11. · kamo-internal

    Microsoft Teams Dostawca telefonów, od przodu do tyłu

    Dodaje Drużyny do ? i przeciąga całą drogę poprzez: wybór dostawcy, konfiskata Entra + Azure Communication Services, Zgoda dawcy, połączenie na członka i softfon w przeglądarce. Softphone to część, która różni się strukturalnie od każdego innego dostawcy. Zespoły nie narażają rejestratora SIP na rzecz osób trzecich, więc linia drużyn nie może być Zarejestrowany w SIP.js lub RingCentral's WebPhone. Obsługiwaną trasą jest Azure Niestandardowy punkt końcowy usług komunikacyjnych usług: backend wymienia Token Entra dla tokena ACS, a TeamsAcsPhoneSdk zamienia to w Agent połączeń za tym samym interfejsem PhoneSdk, który implementuje adaptery SIP, więc Używanie telefonu i każdego komponentu UI pozostaje dostawcą-agnostycznym. SipCredentials (ang.) Zyskuje opcjonalne pola acs; sipInfo jest po prostu pusty dla Teams. Pakiet ACS jest używany tylko w przeglądarce i jest importowany dynamicznie wewnątrz startu(), od momentu Import statyczny zrujnuje renderowanie serwera. Dwie specyficzne dla drużyn prawdy pojawiły się w interfejsie UI, a nie pozostawione, aby zawieść Czas uruchamiania: wywołanie w przeglądarce jest opcjonalne (zostaw ACS puste, a org nadal otrzymuje orgzaczny Obecność i historia połączeń, z ukrytym wybierającym, a nie błądzeniem), i Poczta głosowa jest domyślnie wyłączony, ponieważ Teams nie ma interfejsu API poczty głosowej — wiadomości lądują W skrzynce pocztowej każdego członka programu Exchange, więc czytanie jest materialnie szersze Zgadza się, że administrator powinien zdecydować się celowo. Karta łączenia użytkownika na karcie ustawienia telefonu jest teraz świadoma dostawcy O RingCentrally-on. Obaj dostawcy potrzebują autoryzacji na osobę, dla Różne powody: RingCentral, ponieważ softphone może zarejestrować się tylko jako Połączenia własne rozszerzenie konta, Teams, ponieważ mówi obecność i dzwoni Wymiana tokenów jest delegowana tylko. Branding: kafelek używa znaku korporacyjnego Microsoft i zwykłej nazwy produktu. Microsoft zezwala na nazewnictwo Teams w celu opisania integracji, ale ogranicza Teams Logotypy i branding dla certyfikowanych partnerów Teams, więc nie wysyłany jest glif Teams. Zweryfikowano: npm test - 40 plików, 394 testy, 0 awarii; tsc --noEmit czyste; i18n Key guard i client-navigation guard obaj przeszli. Szczycia słownikowe wylądowały Najpierw w kamo-translation-dykcyjnej 0801a17.

  12. · VOIPService

    Microsoft Teams Phone jako dostawca

    Zespoły nie są jednym z API, więc dostawca skleja trzy płaszczyzny sterujące: Wykres, tylko w aplikacji — historia połączeń (getPstnCalls), odczyty obecności, katalog Ewentuacja urządzeń zespołowych. Ewidencja połączeń jest aplikacją a przez Projekt; Microsoft wyraźnie stwierdza, że nie ma formy delegowanej. Wykres, delegowany — mówi obecność (Presence.ReadWrite istnieje tylko jako Oddelegowane, samodzielne pozwolenie) i poczta głosowa, która mieszka w członkach Wymień skrzynkę pocztową, ponieważ Teams nie ma zasobów poczty głosowej w ogóle. Usługi komunikacyjne Azure — softphone in-browser w swoim członku Teams Linia telefoniczna, za pośrednictwem niestandardowej wymiany tokenów Teams. To jest właśnie Obsługiwana trasa: Zespoły nie narażają na stronę trzecią żadnego rejestratora SIP, oraz Nazwa użytkownika Graph calling API łączy się jako bot, a nie jako użytkownik. Możliwości są obliczane z tego, który instancja jest faktycznie skonfigurowana dla Zamiast zakodowany, więc orgia bez ACS zgłasza voiceCalls-false i interfejs użytkownika Ukrywa dialera zamiast surfować po 501 w połowie połączenia. Celowo nieobecne, Ponieważ w żadnej wersji nie istnieje interfejs API firmy Microsoft: SMS z numeru Teams, zadzwoń kolejki, przekierowanie połączeń, automatyczna odpowiedź i nagrywanie odpocznienia / zatrzymywanie. Te Pozostać na domyślelnym interfejsem, który podniesie 501. Poświadczenia najpierw rozwiązują nastawienie (orek org rejestruje własną aplikację Entra — Wspólny kształt przedsiębiorstwa i nie potrzebuje niczego od Kamo platformy) i Odpad na pole do wiersza MICROSOFT_TEAMS w rejestrze OAuth. Onboarding biegnie w dwóch chmielach, ponieważ najemca musi zostać odkryty, zanim będzie mógł Należy przypiąć: znaki adminowe, id_token's's'tid' daje prawdziwego najemcę, a następnie Są one wysyłane do tego najemcy /v2.0/adminconsent. Zgoda jest potwierdzona przez Wybijanie tokena aplikacji i dzwonienie do wykresu — Microsoft zwraca admin_consent-True Nawet w przypadku awarii i ostrzega, że parametr "dzika" przekierowania jest do wykucia, więc Nie ufa się też. Zarówno Teams, jak i delegowany na członków Multiplex na /api/voip/oauth/callback, jedna ścieżka już publiczna na stronie Bramka, więc APIService nie potrzebuje nowej trasy. Powiadomienia zmian przejechają istniejący /api/voip/webhook z tego samego powodu. Uścisk dłoni Graph różni się od RingCentral's — zapytanie ?ALidationToken Parametr wtórowany jako tekst/pochlebny — i jest odbierany przed czymkolwiek innym, ponieważ Wykres upuszcza powiadomienia na dziesięć minut, jeśli punkt końcowy jest powolny. Subskrypcje Są tworzone niefiltrowane celowo: filtr subskrypcji nadal jest skierowany do: Zbieranie „uczestnicy”, które przestały zwracać dane w czerwcu 2026 r. Dwa wcześniej istniejące wady naprawione, ponieważ zespoły sprawiają, że są one obciążające: CallController, CapabilitiesController i CallFeaturesSConetroller Dostawca za pośrednictwem getPrimaryForOrg — najstarszy aktywny przypadek org'ANY Typ. To jest tylko właściwe dla org dla jednego dostawcy. Drużyny zazwyczaj By być drugim dostawcą, więc historia każdego członka, poczta głosowa i stan agenta By by służyłby ten, który dostawca zostałby stworzony jako pierwszy. Teraz teraz używają Osoba zdobywczynie członka getForMember, odzwierciedlając to, co SipController już zrobił. Usuwanie instancji po lewej stronie rzęsy member_voip_oauth_token, ponieważ Nie ma FK do kaskady, a oni ciągle zgłaszali "połączone". Zweryfikowano: test mvn — 133 testy, 0 awarii (49 nowych).

  13. · kamo-internal

    Zakładka konfiguracji dostawcy i ustawienia spotkania z znaczkacjami

    Dodaje zakładkę Konfiguracja Dostawcy do /settings/features/Meet i co inne Zakładka uczciwa o dostawcy, który konfiguruje. useMeeting nie buduje już meet.-domain>/room> w przeglądarce — to było to, co było tym, co było tym, co Każde spotkanie spotkało się z spotkaniem Kamo Meets niezależnie od konfiguracji. Teraz to tworzy spotkanie za pośrednictwem zaplecza i wykorzystuje adresy URL, które dostawca zwraca, Tak więc Centrum Interaction, okno narzędzia czatu i katalog członków Trasa przez abstrakcję bez własnych zmian: dzielą MeetingDialog, który dzieli ten haczyk. - Konfiguracja dostawcy: karty dostawcy z paskiem ustawień, więc koszt Przełączanie jest widoczne przed przełącznikiem, a nie odkryte później na Tabija szaro-wycieraczka. Formularze pokrewne są tylko pisanie - serwer Zwraca, które pola są ustawione, nigdy ich wartości - plus test połączenia na żywo I instrukcje konfiguracji dla dostawcy. - Zdolność do ginięcia: useMeetProvider odczytuje obsługiwane ustawienia dostawcy oraz MeetSettingRow wyłącza resztę z podporą na powołującą do dostawcy. Niewspierany Ustawienia są wyświetlane raczej niż ukryte i są naprawdę wyłączone, a nie Po prostu przyciemniono, więc nie można ich zmienić za pomocą klawiatury. Oszczędza je całkowicie. Gating nie działa otwarcie - nieudany wygląd zdolności pokazuje wszystko, ponieważ szarość Wyjście z działającego ekranu jest gorsze niż pokazanie kontroli, którą zignorowałby zaplecze. - Nowe ustawienia obsługiwane przez innych dostawców: dołącza-przedsiębiorca, czat w ramach spotkania, współużytk ekranu, dial-in, uwierzytelnieni użytkownicy-jedyni, długość kodu i osadzenie, Obejść lobby obejście, kontrola prezentera i uczestników, nagrywanie w chmurze, Transkrypcje, nagrywanie zaproszeń do pobrania i dostawców-wysposki. - /meet/join/'ref> jest teraz dostawca-świadomy: Kamo Meets nadal dostaje jednorazowy klucz Wybite w czasie kliknięcia, Zoom i Teams przekierowują do własnego adresu URL dostawcy. To się stało. Akceptuje id spotkania lub nazwę pokoju, więc zaproszenia wysłane przed tą zmianą Nie przestawaj pracować. - Link do zaproszenia e-mail jest zbudowany z identyfikatora spotkania UUID, a nie z tego Nazwa pokoju, zachowująca istniejącą regułę, że adres URL zapewniany przez klienta nigdy nie jest Zaufany w e-mail z org-mark.

  14. · kamo-shared-library

    Typ dostawcy MICROSOFT_TEAMS

    Urządzenie MICROSOFT_TEAMS do VoipProviderType. Enum utrzymuje się jako sytuacja w stanie - więc pozycja jest nośna i Stałe trwa; klasa Javadoc mówi teraz tak, zamiast opuszczać następny Osoba, która to wywnioskuje. Brak zmiany DDL — kolumna ORDINAL nie ma wartości Biała lista, więc nie wymaga to kaoInitializer run. Dodaje dwa zapytania pochodne na MemberVoipOAuthTokenRepository: ZnajdźByProviderAndInstanceId — mapuje tożsamość dostawcy przychodzącą (ang. Microsoft) Entra obiekt id na płycie połączeń Teams) z powrotem do członka Kamo. - deleteByInstanceId — te wiersze nie mają FK na instancji, więc usunięcie a Dostawca zostawiał je za sobą, wciąż zgłaszane „połączone”.

  15. · APIService

    Trasa dostawcy spotkania OAuth callback

    Zoom i Microsoft przekierowują przeglądarkę do tej bramy po autoryzowaniu orgi Aplikacja Kamo. Wyskakujące lądy tutaj bez sesji najemców - org podróżuje ?stan – więc oddzwoń wymaga sesji bez sesji, auth-stripping przełoży Odwołajanie wiadomości e-mail już korzysta, a nie zwykłe /api/meet/- forward.

  16. · MediaService

    Posiedzenie abstrakcji dostawcy z Zoom i Microsoft Teams

    Spotkania były koncertowe Kamo Meets — MeetService przetrwało pokój spotkań I nazwisko i nic więcej. Wprowadza to abstrakcję i dwóch dostawców zdalnych Za tym. Spotkanie/dostawca odzwierciedla warstwę dostawcy poczty e-mail: MeetingProviderResolver montaże kontekst spotkania (deszyfrowane poświadczenia, odświeżone dotacja OAuth, polityka org, Konto hosta po stronie dostawcy) i mapa możliwości, więc dzwoniący pytają MeetingScheduler zamiast rozgałęziać się na typ dostawcy. Dodawanie czwartego Dostawca oznacza dodawanie fasoli, a nie edycję witryn. - KamoMeetProvider: nazewnictwo pokoju i konstrukcja URL, przesunięty po stronie serwera. Nat w, powt., w pot w, w pot w, w pot w, w pot w, w pot w, w pot w, w pot w, w pot w, w pot w, Org-namespacing, który powstrzymuje dwóch najemców dzielących konferencję Prosody użyte do Mieszka w przeglądarce; teraz jest przypięty testami. - ZoomProvider: REST v2, Server-to-Server OAuth lub aplikacja Marketplace. Tworzywy W imieniu członka organizacji, pobiera nagrania w chmurze i transkrypcje. - MicrosoftTeamsProvider: Graph onlineMeetings, tylko z aplikacjami lub delegowane. Jego to miejsce Proby testowe połączeń spełniające utworzenie, ponieważ polityka dostępu aplikacji Zespoły wymagają również to, co zwykle brakuje administratorowi - samo pozwolenie Uwierzytelnia się dobrze, a następnie 403 na każdym spotkaniu. MeetingFeature to umowa z administratorem UI: każdy dostawca deklaruje: Ustawienia, które może uhonorować, a ekrany ustawień wyłączają resztę. Roszczenia są Zagwarantowany w testach, a nie zaufany, ponieważ produkuje nadmiernie ubiegający się dostawca To przełączniki, które po cichu nic nie robią – porażka tej warstwy istnieje, aby zapobiec. DostawcaRecordingSweep wciąga zdalne nagrania do własnego magazynu Kamo, więc Zatrzymanie, rezerwowanie i podsumowania po spotkaniu działają identycznie na każdym dostawcy. Pobieranie jest ograniczone: ta usługa służy również czatowi i spotkania w ramach 1Gi Limit, więc przerośnięte nagranie jest pomijane z ostrzeżeniem, a nie ryzykuje Kapsuła. Kreacje są szyfrowane za pomocą istniejącego klucza platformy, więc nie ma nowej tajemnicy Bycie zaopatrzonym. Obsługa sesji dzielona przez punkty końcowe spotkania przenosi się MeetSessionResolver – celowo bez poszerzania kontroli praw.

  17. · InitializerService

    Schemat dla warstwy spotkań dla wielu dowidownika

    Tworzy ? i org_meeting_oauth_tokens, add Kolumny tożsamości dostawcy do MEETING_RECORDS i MEETING_RECORDINGS i Ustawienia Zoom/Teams-able do ORG_MEET_CONFIG i uzupełnia wszystkie istniejące Organizacja do wyraźnego rzędu KAMO_MEET/ACTIVE. Dwie rzeczy, których ten bieg nas nauczył, obie zakodowane tutaj. Hibernate's ddl-auto builds SessionFactory przed jakimkolwiek CommandLineRunnerem, więc instrukcje TABLE Zwykle nieopuj, a kolumny przychodzą bez domyślnych - zasyp więcej niżfill Id i i znaczniki czasu wyraźnie, zamiast polegać na nich, dlatego Pierwsza wersja po cichu nie włożyła nic. I wyjątkowość zadeklarowana na Podmioty oznaczają, że Hibernate utrzymuje własne ograniczenia, więc wymienione indeksy Wcześniejsze dodane wersje były duplikatami; są one upuszczone tutaj. Dodaje com.kamo.z.shared.meet do jawnej listy .EnableJpaRepositories, bez Które nowe repozytoria nie mają fasoli i KI abortują przed pożarami.

  18. · kamo-shared-library

    Modelowe spotkania jako dostawca-agnostyk

    Kamo Meets był jedynym możliwym backendem: OrgMeetConfig był płaskim spotkaniem Torba ustawowa i MeetingRecord nie miały nic poza nazwą pokoju. To dodaje Schema dla prowadzenia organizacji na Zoom lub Microsoft Teams. - meet.provider: MeetingProviderType / MeetingProviderStatus, a naorg OrgMeetingProviderEntity (zaszyfrowany blob uwierzytelniający, stan ostatnioweryfikowany) i OrgMeetingOAuthTokenEntity, odzwierciedlający pakiet email_provider, który już Wspiera abstrakcję dostawcy poczty elektronicznej. - MeetingRecord zyskuje własną tożsamość dostawcy usług hostingowych — zdalne spotkanie, Dołącz i hostuj adresy URL, hasło, konto hosta — więc spotkanie może być ponownie połączone i Pojednaj się z tym, kto go organizuje. - MeetingRecording zyskuje dostawcaRecordingId, który utrzymuje przyciąganie pilota Zapisywanie w chmurze przez dostawcę idempotent. - OrgMeetConfig zyskuje ustawienia Zoom i Teams obsługują tylko dla Meet Konfig nie miał powodu, aby nosić: dołącza-przedsiębiorcą, kształtowanie kodów, lobby Obejść zakres, kontrolka prezentera i uczestnika, nagrywanie w chmurze, transkrypcje, Zaproszenia dostawców i zaproszenia do awaryjnego spotkania gospodarza są tworzone w ramach Gdy członek nie ma konta w firmie. Każdy org bez wiersza dostawcy rozwiązuje się do KAMO_MEET, więc jest to obojętne aż do momentu Administrator wybiera inaczej. Kolumny zostały zastosowane do produkcji przez KamoInitializer Zanim to wylądowało. PlatformOAuthProviderType zyskuje ZOOM(9) dla aplikacji Zoom Marketplace; Teams Spotkania ponownie wykorzystywać MICROSOFT(3). Jego test ochronny porusza się z nim, ponieważ enum i Badanie przypinające jego trwałe identyfikatory nie może lądować osobno.

  19. · kamo-internal

    Kraje z listy dozwolenia na karcie blokowania geograficznego

    Karta mogła tylko odmówić krajom, więc org, który obsługuje jeden kraj, musiał wyliczyć Każdy z nich. Teraz ma obie listy: wybór trybu, który wymienia wybrany kraj lądują, a dwa stoły siedzą obok siebie. Pusta lista pozwala na wszystko, co nie jest zablokowane; niepusty odmawia każdemu krajowi Nieobecny. To odwrócenie jest wystarczająco drastyczne, aby stwierdzić na karcie, a nie pozostawić je. zostanie odkryte, więc zawiadomienie nad tabelami mówi, który reżim obowiązuje. Unikalne (org, kraj) utrzymuje kraj na dokładnie jednej liście, co oznaczałoby Re-adding it to drugi to zawodzi, więc każdy rząd przenosi akcję ruchową, która przewraca go przez PUT Zamiast tego.

  20. · SecurityService

    Zezwalaj na listę krajów obok bloków geo

    Sekcja geoczna zaprzeczyła tylko: kraj został zablokowany lub był nieobecny. Orgs, że to Chcę służyć jednemu krajowi musiał wyliczyć co drugi, co jest nie do utrzymania. I po cichu niesłusznie w momencie pojawienia się nowego kodu kraju. org_geo_block_block_blocked już istniał i był zakodowany w ścisłym celu, więc pozwala Reguła jest tą kolumną ustawionych fałszywie – bez zmiany schematu. Ocena: wyraźne wygrane blokowe, Następnie lista dozwolona zaprzecza wszystkim, którzy nie mają na nim, a pusta lista pozwala na pozwolenie na tę listę. Wszystko nie jest zablokowane. To utrzymuje istniejące kły tylko blokowe zachowujące się dokładnie tak, jak wcześniej. PublikujGeoRules obecnie wysyłają obie strony zestawu reguł, ponieważ zasady zezwalają na noszenie ładunku Kiedyś istnieje. Płatki ładowności napisane przed tą zmianą nie niosą pola zablokowanego i Przetrwać pamięć podręczną TTL przez rozmieszczenie, więc brakujące pole odczytuje się jako zablokowane. Również zakresy ustawiaBlokowane i usuwane do orgi dzwoniącego. Usuń wcześniej rozstrzygnięty regułę Tylko przez UUID, więc id od innego lokatora zostałby uhonorowany.

  21. · kamo-shared-library

    Odczyt jakości w wersjach dostosowawczych i wytycznych

    Zmontowana cena to komórka bazowa PLUS aregulacje ułożone na niej, więc sądząc Tylko komórka ocenia połowę liczby: czytelnie czytana 99,875 z niewłaściwą -1.250 LLPA na górze to nadal błędna cena. MlosPriceAdjustment teraz nosi jakość odczytu Z tej jednej korekty, więc bramka podpisu może zabrać najsłabsze ogniwo przez Całe zgromadzenie. MlosGuidelineVersion otrzymuje to samo pole dla spójności z kręgosłupem arkusza stawkowego - Już przewoził źródłoDocumentId, więc to uzupełnia jego pochodzenie. Oba są nieważne; null oznacza nie tak, a nie dobry. Kolumny stosowane do prod CockroachDB przez KamoInitializer.

  22. · kamo-internal

    Otwórz linki z powrotem do tej aplikacji w zakładce, w zakładce, w zakładce, wt.

    Poczta w okienku odczytu otwiera każdy link w nowej karcie, która jest odpowiednia dla Cały internet i nieśluby dla nas. Nasze e-maile z powiadomieniami są prawie w całości linkami Z powrotem do aplikacji i wysyłanie tych do świeżej zakładki wyrzuca sesję Członek ma już i każe im siedzieć przez zimny bagażnik, aby dotrzeć do strony tej zakładki Może odtworzyć natychmiast. To samo pochodzenie to cały test – byte-równe z stroną renderującą wiadomość e-mail, a nie "wygląda jak domena Kamo", a nie sufiks dopasowany do domeny orgii. To jest Dokładnie ten zestaw adresów URL, dla których ważna jest bieżąca sesja, czyli całość powód, aby pozostać w tej zakładce, i jest to niewyobrażalne pocztą: gospodarz innego najemcy, lookalike, lub userinfo wskazujące na hosta w innym miejscu mają różne pochodzenie i Idź do nowej karty, jak każdy inny link nieznajomy. Routing zamiast przypisać lokalizację: pełne obciążenie dokumentu łzy React Drzewa i niszczy każde otwarte okno narzędzia wraz z jakimkolwiek nieodłącznym szkicem, dlatego To repo ma bramę zbudowaną przeciwko twardej wewnętrznej nawigacji. Zmodyfikowany i środkowy Kliknięcia są pozostawione same sobie - ten gest to użytkownik celowo proszący o nową kartę. Słuchanie od rodzica działa, ponieważ piaskownica już utrzymuje się na samym początku Do pomiaru wysokości podczas wymierania skryptów dopuszczenia, więc nic z e-maila Sam zawsze biegnie; opiekun jest nasz, przywiązany z zewnątrz. Jedna pułapka, którą warto nagrać, złapana przez własny test: zwrot ścieżki zamiast adresu URL jest konieczne, ale NIE wystarczy. "https://host//evil.test" jest naprawdę samotna, I jego nazwa to "//evil.test" - który router odczytuje jako protokół względny i Idą dalej poza miejscem. Otwarte przekierowanie, które przechodzi kontrolę pochodzenia. Taki link Teraz przechodzi do nowej karty, w której przeglądarka rozwiązuje prawdziwy, nieszkodliwy adres URL, Zamiast być cicho przepisanym gdzieś, gdzie e-mail nie wskazywał.

  23. · kamo-shared-library

    Zaufanie do ekstrakcji na komórki + pochodzenie kwalifikujące-matrycy

    Dwie luki w modelu zaufania, oba na ścieżce pieniężnej. PER-CELL. Podłoga o szerokości arkuszy jest niewłaściwym ziarnem dla oceny jednej ceny: pojedyncza Ślecznie czytany kupon przeciąga cały arkusz w dół i wysyła każdą inną cenę Do człowieka, podczas gdy podłoga z wysokim arkuszem nic nie mówi o konkretnej celi pożyczkobiorcy W rzeczywistości cytowany. - Rekordy, jak dobrze Tę stawkę / cena / rzędy zamknięto, więc kupon źle czytany kosztuje tylko własną cenę. Prowizorowanie równoważności. MlosEligibilityMatrix nie miał ścieżki do dokumentu źródłowego Cała - jego jedyną trasą była NULLABLE guidelineVersionId, więc promowana matryca mogła Nie można namierzyć prześcieradło, z którego pochodzi. Kwalifikowalność decyduje, czy pożyczka jest Oferowalne, co czyni go dokładnie tam, gdzie należy wyjaśnić zaprzeczenie; pochodzenie Przepaść istnieje luka w momencie, gdy pożyczkobiorca mówi się "nie". Teraz niesie sourceDocumentId i ta sama umowa o pewność wydobycia co kręgosłup arkusza stawkowego. Zarówno nieważne, jak i nieważne oznaczają, że nie jest tak dobry, a nie dobry. Kolumny stosowane do prod CockroachDB przez KamoInitializer.

  24. · kamo-signer-monorepo

    Pokaż telefon agenta, bezpłatny i e-mail na kopii klienta

  25. · kamo-internal

    Pokaż telefon agenta, bezpłatny i e-mail w podglądzie

    Każdy na własnej linii: run-on dwóch liczb i adres odczytuje się jako jeden ciąg znaków i Zgaszli niewłaściwie wybierani.

  26. · SecurityService

    Rozwiązyj opublikowane dane kontaktowe agenta

    E-mail pochodzi z głównej skrzynki pocztowej członka, a nie TeamMember.emailWork — że Kolumna jest darmowym tekstem poprzedzającym dostarczanie skrzynek pocztowych i rutynowo nie zgadza się z Adres, z którego faktycznie wysyłają. Pozostaje to upadek, gdy żadna skrzynka pocztowa nie jest pierwotna. Członek z obsługą VOIP z rozszerzeniem jest publikowany jako własna linia org plus to Rozszerzenie, oferując również bezpłatny numer, gdy org go ma. Bez przedłużenia, Telefon do pracy – jedyny numer, który mają zostać opublikowany. Niepełnosprawny VOIP config nie publikuje niczego, ponieważ to rozszerzenie nie odpowiada. Każde spojrzenie jest defensywne: nie renderowanie dokumentu skierowanego do klienta, ponieważ skrzynka pocztowa Brakuje linii, która nie będzie gorsza, niż drukowanie o jeden sposób na nawiązywanie kontaktu.

  27. · kamo-shared-library

    Publikuj każdy sposób dotarcia do agenta, a nie tylko imię

    Samo imię i tytuł powiedz klientowi, który jest właścicielem cytatu, ale nie jak o to zapytać. Blok przenosi teraz e-mail i telefon, rozwiązany przez dzwonijącego - główna skrzynka pocztowa Żyje w schemacie dostawcy poczty e-mail i rozszerzeniu w konfiskacie VOIP, również Dotarcie od statycznego pomocnika. Linia główna i bezpłatne są oddzielnymi polami, dzięki czemu dokument może wydrukować oba: Pomiędzy nimi wybieram, ile kosztuje połączenie klienta. LiniaWithExtension łączy rozszerzenie z linią org, którą zwinie, i zwraca null, jeśli Zaginęła połowa. Sierota "ext. 204" to nie jest numer, do którego ktoś może zadzwonić, i nagi Linia org źle przekierowałaby klienta do tablicy rozdzielczej, jakby to była linia agenta.

  28. · kamo-shared-library

    Zaufanie do ekstrakcji na poziomie katalogu kręgosłupa + automatyczne logowanie

    Cena jest tylko tak godna zaufania, jak arkusz, z którego została zmontowana, i nic na Ścieżka cenowa niosła ten sygnał: zaufanie istniało TYLKO w sprawie pre-promocji Inscenizacja wierszy (MlosExtractedCandidate), których nie czyta żaden kod produkcyjny. - to zaufanie do WEAKEST NAGROKomentarz na polu We wszystkich zatwierdzonych kandydatach promowanych do wersji - minimum, nigdy nie wredne. Arkusz 200 czystych komórek i jeden 0,20 niewłaściwie odczytuje średnio do 0,96 i będzie usuwany każdy próg, podczas gdy ta jedna komórka jest tą, która źle ceni pożyczkę. Null oznacza NIE SygALNSZYKATJ (rężny lub promowany przed powstaniem kolumny) i konsumenci muszą Odmowa automatycznego zatwierdzania go; czytanie nieobecne jest jak niezweryfikowana cena Wychodzi nieopisana. WORM-chroniony jak inne kolumny cenne - migały W "PostLoad" i rozproszysz w PreUpdate, lub byłaby to po cichu zmienny otwór w łańcuch audytu. MlosPricingSignoff zyskuje na automatycznym / podstawa_peidence / próg_aplikowany. Bez Są one nieodróżnialne od osób nieodróżnialnych od człowieka, z wyjątkiem członka. Id, która na ścieżce pieniądza jest wada audytu. Próg jest przechowywany obok Wartość, ponieważ konfiguracja się porusza: "pewność wynosiła 0,72" nie może być później osądzana Nie wiedząc, czy bar tego dnia wynosił 0,70 lub 0,90. Kolumny stosowane do prod CockroachDB przez KamoInitializer.

  29. · kamo-internal

    Zakładki cytatów – każdy cytat na tropach konta

    Utworzone serwerem DataGrid obok Leads, z wyszukiwaniem nad liczbą i tytułem, statusem, całkowitym Zakres i zakres tworzonych dań. Filtry dzielą się jednym odbiciem i zapadną w pojedyncze zapytanie, więc dostosowując zakres podczas Pisanie kosztuje jedną podróż w obie strony, a nie jedną na naciśnięcie klawisza na pole. Dowolna zmiana filtra Resetuje do strony 1 — pobyt na stronie 6 węższych zestawów wyników odczytuje jako pusta siatka. Wygaśnięcie jest pokazane poza statusem: cytat SENT może być po jego ważności i nadal Czytamy jako SENT, więc te wiersze noszą swój własny marker zamiast być cicho Niewłaściwie oznaczony. Rzędy i kolumna prowadząca zarówno w zakładce cytaty tego czołówka.

  30. · SecurityService

    GET /quotes/konto/-uida — paged, filtrowane, posortowane

    Daty pojawiają się jako ciągi ISO i łagodnie: filtr, który klient wysyła źle, powinien Niewęż nic, niż 400 całej siatki. Termin-do-to-to-to-grana obejmuje całość To tego dnia, w przeciwnym razie filtrowanie do dziś nic nie podniosło od północy.

Twój wszechświat czeka.

Rozpocznij bezpłatnie w kilka minut.Dodaj produkty, kiedy tylko będziesz gotowy — bez migracji, bez nowych logowań.

Bezpłatne na zawsze — nie wymaga karty kredytowej