콘텐츠로 건너뛰기
KAMOUniverse

변경 로그

무슨 일이야?

플랫폼에 대한 모든 개선 사항, 그것이 선적.

  1. · SecurityService

    기록 지도는 읽고 un-auditable 수출을 거부합니다

    보안 서비스에 대한 HIPAA §164.312 (b). 플랫폼은 모든 리드를 기록 CHANGE (LeadHistory) 및 모든 로그인 (SystemAccessLog) 및 레코드 없음 모두 읽기, 그래서 "이 차용차에서 본다"- 첫번째 질문 §164.402 breach 평가 요청 — unanswerable이었다. PhiAccessAuditor OTK/*** 세션 맵에서 이벤트를 구축 endpoint 이미 해결, 그래서 감사 행의 정체는 동일 요청을 승인 한 ID. 클라이언트 IP는에서 옵니다 X-Forwarded-For; Traefik 뒤에, RemoteAddr는 진입 팟을 기록하고 탐지에 대한 가치. Denials는 너무 기록됩니다 - probing은 무엇입니까? 검색 결과 — and the sessionless caller lands on the sentinel org 오히려 떨어졌다. 읽기 : 단일 리드 fetch = VIEW, 그리드 = 1 리드 당 LIST 이벤트 실제로 배송 (프로젝트 DTOs에서 취함, 그래서 리드 필터링 VIEW UNASSIGNED LEADS는 읽은 것 같지 않습니다. 401/403/404년 모든 기록 denial. 수출은 닫히지 않습니다 — 접근 로그인 CSV, HMDA LAR, QC 훈련 corpus 플랫폼 전체 추출 corpus. 각 기록 1 당 사건 BEFORE 파일이 내장되어 있으며 실패한 감사 쓰기는 503을 반환합니다. "우리는 데이터를 입력하지만 기록을 잃었다"는 하나의 대답이다 걸어갈 수 없습니다. 플랫폼 넓은 corpus는 각 tenant, 그래서 교차합니다 각 레코드는 연산자가 아닌 org에 속성됩니다. 식별자는 로그인하지 않습니다. *********** memberId)는 사라집니다: 지금 수출은 가지고 있습니다 그들이 누구를 기록하는 행을 잡아.

  2. · kamo-signer-monorepo

    /{locale}/q/{token}에서 상표가 붙은 인용문/estimate 문서

    상업적인 인용 체계를 위한 고객 직면 표면. 서버 렌더링 org의 브랜딩은 첫 번째 페인트에 있습니다. - 상업 문서의 unbranded flash 이 작업을 수행하지 않는 것이 정확하고, 페이지가 브랜드 사용자 정의를 방출하는 이유입니다. QuoteBrandVars를 통해 속성 인라인으로 수화 후 스왑하는 것보다 오히려. 이미 HostRegexp ingress를 가지고 있기 때문에 kamo-signer의 라이브 적용, DNS 별칭 및 hostnameOverride와 테마 패키지 - 그리고 때문에 인용 -> 수락 -> e-sign은 EsignGenericEnvelope 바인드 이후 하나의 hop입니다. (context type, context id)를 통해 레코드. /{locale}/를 한번만 사용할 수 있었습니다. i18n work landed; 모든 31 문자열은 사전에서 번역 키입니다. Money and date format through next-intl using the Quote's 자신의 통화 및 날짜 형식 Server-resolved timezone (recipient member -> org -> UTC), 뷰어의 장치가 없습니다. 잘못된 영역에서 렌더링 된 expiry는 제안이 이미 날짜를 명할 수 있습니다. 이름 * 플랫폼의 첫번째 진짜 @media 인쇄 구획을 추가하십시오. kamo-internal의 "Print Invoice" @media print 규칙이 존재하지 않기 때문에 항상 전체 앱 크롬을 인쇄했습니다. 어디에; 여기에 같은 마크 업은 브랜드와 깨끗한 편지 문서로 인쇄 악센트 보존 (print-color-adjust: 정확한 — 무색 따옴표는 초안으로 읽습니다), 동작 바 억제, 페이지 break-inside: 행과 총을 피하십시오. 터미널 상태는 deliberately asymmetric: EXPIRED는 정직한 브랜딩 페이지를 가져옵니다 날짜와 org의 연락처 세부 사항, 이미 호출기 때문에 안전 256 비트 토큰의 소유를 증명; 알 수없는/revoked/wrong-org 모든 붕괴 일반 페이지 그래서 표면은 프로브 될 수 없습니다. 클라이언트 whitelists 이유 렌더링하기 전에. 토큰은 URL을 통해 결코 여행하지 않습니다 — 서버 측은 게시물을 해결 몸과 BFF는 APIService 우표 때문에 명시적으로 실제 클라이언트 IP를 전달합니다. X-Forwarded-For는 자체 인바운드 요청에서, 그렇지 않으면 모든 것을 넣어 pod IP에 키운 한 속도 제한 버킷의 뷰어. configmap에 SECURITYSERVICE URL 추가 (확인: kamowssecurity-service가 존재합니다) kamo 네임스페이스에서.

  3. · SecurityService

    Quote REST surface — staff management and public share links

    Staff endpoints at /api/security/commerce/quotes and an unauthenticated resolver at /api/security/public/quotes. QuoteController extends BaseLosController rather than copying POSController's preamble: CallerSessionResolver accepts the X-OTK attribute, the X-***-Token header AND the *** cookie, where POSController's private getOrgId reads only the OTK attribute. Every handler is rights-gated (VIEW/MANAGE/SEND_QUOTES). Most of the commerce surface is session-only — any authenticated member of any org can mutate orders — and that is deliberately not repeated here, because a quote commits the org to a price in front of a customer. QuotePublicController needs no security-config carve-out: the Spring chain is anyRequest().permitAll() and OTKPreAuthFilter only acts on an X-OTK header, which a browser following an emailed link never sends. Design points: - The token arrives in the POST body, never a URL. APIApp.forward() logs request lines, and a bearer credential in a path would land in those logs. - Not an enumeration oracle: unknown, revoked and org-mismatched tokens all return one indistinguishable generic failure. Only EXPIRED gets a specific, honest answer, which is safe because the caller already proved possession of a 256-bit token. - The org derived from the request host is cross-checked against the org on the link row. Without it, a valid link for org A opened under org B's host would render A's pricing wearing B's branding — a phishing primitive. - no-store / Referrer-Policy: no-referrer / X-Robots-Tag: noindex on every response. The page loads logos from theme.<org>, and a Referer would carry the token off-origin. PublicLinkRateLimiter is Redis-backed because SecurityService is multi-replica — in-process counters would be a limiter in name only. It is explicitly DoS and log-hygiene protection, NOT the anti-guessing control: 256 bits of entropy is. Failures are counted far more harshly than successes, since one office opening a forwarded quote fifty times is normal while fifty misses is not. It fails open, so a Redis outage cannot take the quote page down. QuoteEmailClient reuses the EmailService transactional path (X-Internal-Auth, QUOTE_SENT template) and sends only the headline figure plus the link — never the itemised pricing, so a forwarded email is not itself the disclosure. Pre-existing test failures unchanged by this commit (verified by stashing this work and re-running on clean HEAD): **************** NPE on a null EntityManager, and the legacy com.retval SecurityServiceApplicationTests missing a @SpringBootConfiguration. REQUIRES a KamoInitializerService run before these endpoints work: the quote tables are new and ddl-auto is none here, so the service boots normally and only the quote endpoints 500 on a missing relation until KI has run.

  4. · kamo-shared-library

    Quote/estimate domain — entities, pricing engine, share links

    Adds a first-class Quote alongside the existing commerce spine. The pre-existing "ServiceQuote" is an Intent plus a JSON blob carrying one offering and one flat amount, with no recipient, no expiry and no UI; it is not a foundation. Extending Intent directly was rejected too: commerce_intents is shared by LOAN_APPLICATION, RENTAL_REQUEST, SUBSCRIPTION_SIGNUP and PURCHASE_REQUEST, so ~25 quote columns would put permanent NULLs on the mortgage and rental paths. Entities **************** Quote engagement-linked, versioned, valid_until + valid_for_days QuoteLineItem snapshots name/sku/price so a sent quote never re-prices QuoteShareLink bearer credential, SHA-256 at rest, revoke/expiry/view counts QuoteLinkView per-open audit (ip, user-agent) QuoteEvent append-only lifecycle trail Totals are server-authoritative. QuoteTotals is the single writer of every money field and the request DTOs carry no totals at all — deliberately unlike createRetailOrder, which takes subtotal/tax/total verbatim and can be handed a populated order with total = 0. Line discounts apply before the quote-level discount, discounts can never exceed their base, intermediate maths stays at scale 4 and only the grand total rounds to the currency's minor unit. Share tokens: 32 bytes of SecureRandom as 43 base64url chars (256 bits). Same entropy as the e-sign signer token but 21 chars shorter, keeping the emailed URL under the 76-char plain-text wrap limit. Only the SHA-256 is persisted. Tax is honest rather than invented: the platform has no tax engine (TaxClass/ TaxZone/TaxRate are authorable and read by no calculation), so ENGINE mode reports NOT_CONFIGURED instead of fabricating a figure on a commercial document. QuoteLineItem.taxClassId is UUID, matching TaxClass's real PK — Offering.taxClassId is a Long against a UUID-keyed table and is structurally unresolvable. Also: rights 178-180 (VIEW/MANAGE/SEND_QUOTES) and the QUOTE_SENT canonical email template, registered in CANONICAL_KEYS (absent there means a permanent 404). 35 tests covering the pricing engine and token hygiene. Full suite: 896 passing. Schema note: these are new tables. KamoInitializerService must run before SecurityService serves the quote endpoints — ddl-auto is none there, so the service boots fine and the endpoints 500 on a missing relation until it does.

  5. · KlusterServices

    CiliumNetworkPolicy로 아바타 결심자에 대한 Egress 포함

    Reinstates 무엇 8f6c672 reverted, 실제로 작동 유일한 형태로. 일반 NetworkPolicy가 이것을 표현할 수 없기 때문에 이전 시도가 실패했습니다. 클러스터의 topology. SecurityService의 4가지 중요한 의존성 노드는 파드 네트워크에서 아닙니다. - cockroachdb-0 및 nats-k1m1-0는 hostNetwork를 실행합니다. 그리고 MinIO는 호스트 프로세스입니다. 그래서 podSelector는 결코 일치 할 수 없습니다. 더 보기 비 명백한 부분, 그리고 이유 첫 번째 패치 시도도 실패, 이다 ipBlock for the node subnet is not fix it one: Cilium classizes the node as 예약된 호스트/레모드 노드 정체성 및 CIDR 규칙은 부정적으로 일치하지 않습니다 아이덴티티 toEntities는 표현하는 유일한 구성입니다. 실패 형태는 쓰기 전에 throwaway 운하 팟에 대하여 reproduced 이것은, 오히려 생산에 대하여. 운하는 같은 규칙을 수행 ipBlock 버전이 침묵적으로 차단 된 방법 인 명백한 라벨 CockroachDB, NATS 및 MinIO를 완벽하게 합리적으로 찾고 있습니다. 재시작 및 재시작 없이 SecurityService에 확인된 후 연결 오류: ALLOW dns, crdb:26257, nats:4222, minio:9000, redis:6379, 주사위:80, 세계:443 BLOCK 노드:22, 노드:443, kube-api:443, redis-via-node:6379, 169.254.169.254, 루프백:9000 마지막 4는 포인트입니다 : 해결사에 SSRF는 이제 갈 곳이 없습니다. 더 보기 in-code guard는 기본 제어를 유지 - 그것은 이해하는 유일한 레이어입니다 DNS rebinding — 그리고 이것은 뒤에 방어입니다. Header는 운하 절차를 운반합니다. 누구나 이것을 바꾸면 다시 실행해야 합니다. 그것에 대해 이유보다; Cilium의 정체성 모델은 평범한 방법을 행동하지 않습니다 NetworkPolicy intuition은 제안하고, 노후화 환경이 없습니다.

  6. · kamo-internal

    그룹 대화에 대한 facepile보기

    5 명 정도의 실은 1 arbitrary 얼굴에 의해 표현되었습니다. 한 사람의 메시지로 읽습니다. 지금 3명의 참가자까지, 그래서 "several people"은 이름 줄을 파고 필요없는 한 눈에 다리가 있습니다. 3에서 모자를 씌우는: 과거에 원형은 인식과 줄의 밑에 수축합니다 정보보다는 질감이되고 나머지는 이미 명시되어 있습니다. "및 N 다른"텍스트가 바로 옆에 있습니다. 독자는 자신의 스레드 목록에서 필터링하고 다른 파티 리드 - 얼굴은 오른쪽으로 왼쪽을 읽습니다, 그래서 1 차적인 대응은 왼쪽으로해야 그리고 읽지 않은 배지를 나르는 것. 각 얼굴은 줄에 반지를 가져옵니다 배경 색깔; 유사한 사진의 더미 없이는 1개의 모양으로 합병합니다. 해결책은 지금 단지 지도 보다는 오히려 첫번째 몇몇 참가자를, 덮습니다 그렇지 않으면 두 번째와 세 번째 얼굴은 영구적으로 모노그램으로 앉을 것입니다.

  7. · SecurityService

    계기 사슬, reap에 의하여 만료되는 입장, 기록적인 disclosures

    이 기능의 모든 실패 모드는 침묵합니다. latched 회로 차단기, 노동자 queue는 모든 작업, HTML을 반환하는 공급자를 무시 — 각 보기 정확히 같은 "이 대응은 사진이 없다" 행동은 좋아 보인다. 작업과의 사용자 가시성 차이는 없습니다. 완전히 죽은, 그래서 그것은 측정 될 수있다. 미터 (Prometheus는 이미 유선되었습니다, 그래서 이것은 주로 naming입니다) : 캐시 히트 비율, 사슬 내구 태그 계층에 의해 대답, per-provider hit/miss, 노동자 큐 깊이, 그리고 discarded-task 총. 그게 이전에 사용 된 것 DiscardPolicy, 이는 디자인에 의해 조용히 방울; 그것은 지금 카운터를 증가, 필드 초기화기가 실행되기 때문에 카운터가 선언됩니다. source order and relying on 게으른 캡처는 무해한 주문에 깰 것입니다. 그들의 자신의 logger로 이동. 오직 정체 계층은 개인 disclosure - 도메인 계층은 주소의 오른쪽을 전달합니다. 아무도를 식별하지 않습니다 - 그리고 그 이후 전화 전에 기록됩니다, 그래서 요청이 실패했을 때에도 트레일이 존재합니다. 주소는 전체로 작성됩니다. deliberately: 포인트는 "이 사람이 공유 한 데이터"에 응답하는 것입니다. 그리고 해시는 대답할 수 없습니다. reaper는 누출을 닫습니다. deleteExpiredBefore는 존재하지 않으며 불명하지 않습니다. sender identity는 영원히 자랐습니다. 바쁜 mailbox는 수천 명의 대응자들을 접촉합니다. 각각 한 번씩 한 번씩 한 번에 음절을 나눕니다. 테스트는 실제 소켓에 대한 fetcher를 커버, 흥미로운 경우이기 때문에 논리 보다는 오히려 모든 공급자 행동: 유효한 이미지를 나르는 404 (DuckDuckGo), HTML을 제공하는 soft-404, 원본의 통계 내용 길이, a 1x1 스텁, 그리고 팟 네트워크에 대 한 리디렉션. 생산 클라이언트는 할 수 없습니다 루프백 테스트 서버에서 pointed - 그것의 DNS 핀은 아무것도 해결할 것을 거부 개인, 전체 포인트는 - 그래서 그들은 휴식 클라이언트와 핀은 따로따로 asserted 입니다.

  8. · kamo-internal

    콘솔에서 조정으로 ingested LLPA matrix를 홍보

    Ingestion 패널은 비율 시트 만 게시 할 수 있습니다. LLPA MATRIX 소스 이제 문서는 "Promote as LLPA Adjusts"카드를 보여줍니다. LLPAs는 (선택적인 그룹)를 조정하고, 각 승인되는 FICO/LTV 물통은 조건부 가격 조정이 됩니다. 결과 이름 방법 많은 저자 및 정직, 얼마나 많은 행이 버킷 때문에 건너 갔다 안전하게 읽을 수 없습니다. ingestionApi.promote조정 새로운 게이트웨이 릴레이에 게시물.

  9. · SecurityService

    게이트웨이 릴레이는 LLPA 매트릭스를 조건 조정으로 홍보합니다

    **************** 이익 승진 조정, 거울 홍보-rate-sheet 릴레이: god-eligible gate, organizationId 서버 샘플 쓰기를 통해 페이로드 (), 다운스트림 4xx는 verbatim을 릴레이. 스튜어드를 켭니다 LLPA matrix를 콘솔에서 실제 per-scenario 가격 조정으로 검토했습니다.

  10. · VOIPService

    녹음, 음성메일 및 성적표

    녹화 재생은 추적하지 않습니다. 기록 된 통화는 가장 오래된 PHI입니다. 플랫폼 상점 - 확실한 대화 - 그리고 "이를 듣고 전화"는 unanswerable, 이는 첫 번째 질문 §164.402 breach 평가 요청. Wires CallRecordingAuditor는 모든 것을 읽습니다. - GET /recordings/{id}/audio CALL RECORDING / 다운로드 * * * * * * * * CALL RECORDING / 다운로드 - GET /recordings/{id} CALL RECORDING + TRANSCRIPT / 조회 * * * * * * * * CALL RECORDING / 다운로드 - GET /instances/{id}/voicemails TRANSCRIPT / LIST, 행당 성적표는 숨겨지는 것. 그것은 미디어 다운로드되지 않습니다; 그것은 타고 metadata JSON과 각 voicemail 행 안에, 그리고 동일하다. PHI는 그리스 형태로 오디오로. 그것은 자신의 이벤트 때문에 disclosures의 회계는 자원 당 조립됩니다. Byte 서빙은 닫히지 않고 PhiAuditAvailabilityAdvice는 unloggable를 켭니다 500 미만의 503로 읽으십시오. 요청은 괜찮았습니다. 우리는 PHI를 제공 할 수 없습니다. Refusals는 너무 기록됩니다; probing는 어떤 탐지도 봅니다. 또한이 배선 중에 발견 된 허가 간격을 닫습니다 : POST /recordings/lookup은 요청 몸에서 인스턴스를 가져왔고 결코 콜러의 org가 그것을 소유, 그래서 다른 tenant의 공급자 해결 녹음 ids에 ids를 호출합니다. 다른 모든 인스턴스의 endpoint 이미 findByIdAndOrgId를 통해 간다; 이 것은 이제 너무. 녹음 재생 허가는 그대로 남아 있으며 장소로 문서화 : org 소유권은 유일한 체크입니다, 그래서 어떤 회원은 어떤 기록든지에서 재생할 수 있습니다 그들의 org. "own extension"이 무엇인지 결정하는 것을 의미한다. 경계와 오른쪽 상승 - 그 제품 결정, 아니 여기에 할 추측, 모든 액세스는 적어도 기록된다.

  11. · AIService

    저장된 AI 대화 역사의 모든 읽기에 대한 PHI 액세스

    공유된 §164.312 (b)를 유선으로 회전시키는 경로에 persisted prompts 그리고 완료. 조수는 모듈을 준수 평가를 넣어 경계를 OUTSIDE — 프롬프트는 BAA가 아닌 외부 공급자로 팬을 그런 다음 무한하게 유지 - 그래서 그 저장의 읽음은 가장 불쾌한 길의 필요, 그들은 아무도 없었다. 감사 : 세션 목록 및 역사 검색 (1 회 대화 당 이벤트, 아니 요청 당 하나), 단일 대화의 메타 데이터와 그 메시지, 공개 위젯은 자신의 성적을 다시 읽고, 그리고 Handoff 번들. 추천 상품 너무 기록 - 또 다른 org의 guids는 검색 결과가 무엇인지 - 그리고 unauthenticated 시도는 떨어졌다 보다는 오히려 sentinel org에, 레코더가 속성을 거부하고 이벤트가 가장 계속하기 Handoff 번들은 VIEW가 아닌 DISCLOSE입니다. 그것은 방문자의 AIService의 대화와 다른 제품에 인간의 앞에. 이름 * 친절은 폐쇄, 그래서 지금 잃어버린 기록은 성적 및 답변을 보라 503 오히려 서빙 데이터보다 그것은 계정 할 수 없습니다. Identifiers 만. 메시지 바디, 제목, 또는 검색 용어 - 회원 그들의 조력 유형의 차용인의 이름을 그것으로 검색, 그리고 신속한 재현 된 감사 트레일은 PHI를 PHI로 이동했습니다. 로그 스트림. d428ee3를 완료하면 동시 세션이 중간 교환을 중단합니다. 감사 failed recordDeniedInternalView, 그리고 PublicAiChatController의 새로운 constructor 인수는 테스트에 도달하지 않았습니다.

  12. · MediaService

    Record chat message reads on the endpoints that return bodies

    Sending a message left a row; reading one left nothing. Every chat, support and social thread on the platform renders from a handful of endpoints here, and none of them recorded anything, so "who read this conversation" had no answer — which is the first question a 164.402 breach assessment asks. ChatMessageAccessAuditor emits a PhiAccessEvent (CHAT_MESSAGE) from the five paths that hand a caller message text: GET **************** LIST GET /api/media/sessions/chat LIST POST **************** VIEW GET **************** LIST POST **************** VIEW One event per message, not one per request. "They opened the thread" is not an answer to "was this individual's message disclosed", and the message ids are already in hand at every call site, so a request-shaped row would have been a choice rather than a limitation. The thread read records AFTER the mute filter, so a row means a body that caller was actually handed. The chat list is in scope because each row carries up to 140 characters of the thread's last message — that is content, not metadata. Rows with an empty preview record nothing. Deliberately NOT recorded: unread counts, presence, last-seen, typing, read receipts, session-member lists, mutes, ticket detail (metadata plus status history, no bodies) and support reporting aggregates. A trail is only useful if a row means someone saw content; rows that stand for nothing bury the ones that do. Refusals are recorded too, against the thread guid — no message id exists yet at the point of refusal, and repeated refusals against thread guids is the shape probing has. An unauthenticated reader is attributed to a sentinel org rather than dropped: the recorder rejects unattributable events, and that is the single most interesting event this trail can hold. Client IP comes from X-Forwarded-For with remoteAddr as fallback — everything arrives via Traefik, so remoteAddr alone records the ingress pod. Public chat takes a second hop through APIService, which sets X-Forwarded-For to the visitor address and moves the browser's User-Agent to X-Original-User-Agent, so the auditor prefers that header; the literal User-Agent on that hop is APIService's own HTTP client and identifies nobody. Visitor reads are attributed to the org from X-Public-Chat-Org-Id with no member id: a visitor has no member identity of their own, but the org owns the records, so the read stays attributable. Identifiers only, never message text. An audit trail that reproduces the message it audits has just copied the PHI into the log stream. Also completes eed3817, which swept this work in mid-edit and left MediaController referencing PhiAccessKind before the import existed — that revision does not compile. This one does: mvn -o test is 16/16 green.

  13. · DocsService

    기록 byte 액세스 4 문서 경로에 아무것도 기록

    /download 이미 로깅을 통해 *********** 그리고 그것은이었다 플랫폼의 byte-access 주입 사이트. sibling endpoints 서빙 정확히 동일한 바이트 — /stream, /bulk-download, 템플릿 변환 PDF 및 Template page thumbnail — 기록된 아무것도, 그래서 누구 원하는 문서 바이트 흔적을 남기지 않고 다른 URL을 선택해야합니다. 모든 4 이제 포인트 액세스에서 PhiAccessEvent를 방출하고 확인되었습니다. 바이트가 제공됩니다. 대량 다운로드는 요청 당 1개 이상 문서 당 1개의 사건을 방출합니다. "그녀 수출 400 문서"는 "이 개인의 기록에 대한 대답이 아닙니다. 공개됨, 그리고 per-document 행은 6 년 후 답변 가능한 것 §164.528에서. 클라이언트 IP는 X-Forwarded-For에서 fallback로 RemoteAddr로 옵니다: 모든 요구 Traefik을 통해 도착, 그래서 RemoteAddr 혼자는 팟을 기록 할 것 모든 접근 및 탐지에 대한 가치. unauthenticated 시도는 오히려 sentinel 조직에 근거를 둡니다 떨어졌다 - 레코더는 unattributable 이벤트를 거부하고 문서에 대한 요청 세션이 없는 바이트는 정확히 유지되는 이벤트입니다. 이것은 기존의 ImgLogDownload Rows와 함께 앉아서 교체하는 것보다: 그곳에는 영상도메인 레코드가 있습니다. disclosures는에서 조립됩니다. 참고 ImgLogService, 그 행을 읽는, 여전히 플랫폼에서 Zero Callers가 있습니다.

  14. · KlusterServices

    아바타 결의자에서 탈출을 포함; Redis eviction 풀에주의

    SecurityService는 이제 타깃 URL을 무수히 선택한 fetcher를 실행합니다. party — BIMI 레코드는 전송 도메인을 소유한 사람에 의해 간행된 DNS 내용입니다. 그리고 누구도 전송 도메인이 열렬한 이메일을 통해. 이 클러스터에서 아무것도 그런 요청이 갈 수있는 곳을 제약 : Redis는 6379에 비난 답변, 9000에 MinIO 루트 자격 증명, 26257에 CockroachDB, 그리고 노드 메타 데이터 endpoint는 어떤 pod든지에서 유효합니다. 해결자는 코드를 자체 제어를 시행하고, 그 중 하나는 그들은 DNS rebinding을 이해하는 유일한 층이기 때문에 방어. 이것은 두 번째, 그래서 버그는 여전히 개인 주소를 도달 할 수 없습니다. 허용 목록보다 훨씬 적습니다. 이 서비스는 합법적으로 도달 해당 이용 후기에 달린 코멘트가 없습니다. 자주 묻는 질문 해당 이용 후기에 달린 코멘트가 없습니다. 그런 다음 특정 in-cluster 포트가 실제로 필요합니다. 팟에 스코프 untrusted fetches를 수행합니다. namespace-wide를 적용하면 차단됩니다. egress가 감사하지 않은 서비스. Redis 변경은 댓글과 데이터베이스의 범프, 행동 변화가 아닙니다. · sender-avatar 캐시가 짧은 메타 데이터 문자열만 저장하는 이유를 기록합니다. maxmemory 전체 인스턴스에서 allkeys-lru evicts와 2gb, 그리고 DB 0은 모든 라이브를 보유 세션, 그래서 여기에 대량 바이트 캐시는 압력 아래 무작위로 사용자를 표시 할 것 그리고 일 동안 잘못.

  15. · kamo-internal

    쇼 sender 및 수신 사진

    Mailbox는 모든 사람에게 한 번 공유하는 글래드런에 단일 문자를 렌더링했습니다. 모든 행은 동일하고 원은 정보를 수행하지 않습니다. 그것은 지금 보여줍니다 1개가 알려져있을 때 대응자의 실제 사진, 그리고 2-letter monogram 때 아니다. One SenderAvatar는 7개의 손 압연된 초기 원형을 대체합니다. 그것은 중요 더 이상 견실함: 각각은 주소를 분할하는 방법의 자신의 아이디어를 실시하고, 아바타 캐시는 그 분할에 열쇠가, 그래서 목록과 사이 어떤 disagreement 독서 팬은 침묵적으로 타격 비율을 halve하고 동일한 사람 2를 보여줍니다 1개의 스크린에 다른 방법. parseAddress는 이제 유일한 RFC 5322를 배치합니다. 주소는 출발합니다. 목록과 실 전망은 또한 원시 우두머리 인쇄를 멈춥니다 "Jane Doe <jane@acme.com>"과 같은 이름을 보여줍니다. Identity는 주소로 키워 자체 저장소에 살고, 메시지 개체에 절대. 목록보기 모두 30s 및 모든 websocket 알림에, 각 시간 메시지 배열 도매 교체 - 메시지에 병합 된 것은 2 분 두 번 닦아, 그래서 아이들 inbox는 모노그램에 사진과 뒤를 흔들 것입니다 모든 제품 주소로 이동하면 늦은 도착 대답이 페인트 할 수 없습니다. 행이 중요하지 않기 때문에 잘못된 행. 요청은 석탄 스크린 당 1개의 배치로: 자주 묻는 fifty 줄은 fifty일 것입니다 요청, 그리고 이 서비스에 모든 호출 이후는 첫 번째 일회성 키, 실제로 100. 서버 측이 45s 후에 한 번 재작업 해결책은 2 단계이고 알 수없는 주소는 나중에 전화에서만 응답됩니다. 연구분야 ListView가 가상화되었습니다. 그것은 50 행 페이지와 재 렌더링 모든 그들 내부 AnimatePresence 와 a per-index stagger 에 모든 poll; 각 이미지 추가는 mailbox에서 heaviest 표면을 만들었습니다. No-reply 및 mailer-daemon senders는 모노그램 보다는 오히려 중립적인 표를 얻습니다 — a 바운드 통지 옆에는 적극적으로 misleading입니다. 사진 장식 (alt="") 이름은 항상 그 옆에있는 텍스트이기 때문에, 수행 referrerpolicy="no-referrer" 그래서 스레드 식별자는 이미지 호스트에 도달하지 않습니다. 모든 avatar는 우리의 자신의 근원에서 봉사합니다 — 제삼자 이미지는 fetched, validated and re-hosted server-side — 이는 새로운 per-request를 허용하는 것 img-src 정책은 tenant's 자신의 도메인에 pinned. 그 정책은 내장 다음보다 프록시. 이 플랫폼이 흰색 라벨이 있기 때문에 구성 : a 정적 정책은 한 번 이름을 입력하고 나머지 이미지를 깰 것입니다. 그것은 또한 접촉부터 사전 노출 저장 추적 픽셀 벡터를 닫습니다. 다운로드 여러 <img src>에서 직접 렌더링 된 무료 텍스트 URL입니다. next/image 더 이상 리모트 SVG를 받아들입니다. 그것은 단지 때 허용 위험이었다 SVGs는 우리의 자신의 테마 로고이었다; 그것은 이제 플랫폼은 마크를 ingests하지 않다 제3자 DNS에 게시됨. 연락처 콜러 드롭 hardcoded ORG ID = 1 및 orgId 쿼리 매개 변수, 세션에서 열렬한 변화를 일치시킵니다.

  16. · EmailService

    Avatar endpoints; fix unauthenticated reachability and contact tenancy

    Adds the mailbox side of sender avatars, and fixes three pre-existing holes this work would otherwise have built on top of. AUTHENTICATION. OTKPreAuthFilter used to reject a *bad* OTK but treat *no* OTK as anonymous-and-allowed, falling straight through to the filter chain — and the Spring Security chain here is anyRequest().permitAll(). Every mailbox, contact and calendar endpoint was therefore readable by anything that could reach the ClusterIP. Protected prefixes now fail closed. The fix lives in the filter rather than in the security chain deliberately: reshaping the chain would touch thirty unrelated surfaces at once, including two servlets and the DAV endpoints. The exempt list is the complete set of genuinely session-less entry points — the CAN-SPAM opt-out link, the OAuth redirect target where the tenant rides in the signed state parameter, and the server-to-server surfaces that authenticate with X-Internal-Auth. CONTACT TENANCY. Every contacts endpoint took orgId as a query parameter, or reached a book by id with no ownership check at all, so changing a number in the URL read another tenant's contacts — names, addresses, phone numbers, notes. The org now comes from the session and every book- or group-scoped operation proves the target belongs to it. Absent targets return 404 rather than 403 so an id in another tenant is not confirmed to exist. orgId is still accepted on the two list endpoints and ignored, so clients do not break mid-deploy. That change also fixes a silent bug: searchContacts derived orgId from bookId and passed null when no book was selected, into a query whose first predicate is contactBook.organization.id = :orgId. Book-less search therefore always returned nothing — which is exactly how the mail recipient autocomplete calls it. EMAILLOGOSERVICE. It fetched an operator-supplied URL with no scheme or address check, and transcoded the result on a Batik that resolves external references by default. A logo SVG containing <image **************** would have been dereferenced from inside the cluster. Now guarded on both ends. MESSAGEINDEXER. resolveMemberIdFromEmail pulled the entire members table into heap and filtered it in Java, once per indexed message, on a 1Gi pod — the code said so in a TODO. Same semantics, one indexed query. The avatar surface is one batched endpoint rather than a field on the message DTOs. Both list views poll every 30s and replace their message array wholesale, so an avatar carried on a message would be wiped twice a minute and the UI would flicker forever; and EmailMessage is shared by the folder list, reading pane, thread view and search, so changing its shape would touch all of them at once. The directory-photo endpoint is server-to-server only — exposed to a browser it would be a directory-enumeration oracle for the tenant.

  17. · SecurityService

    Sender-avatar resolution chain for the mailbox

    Resolves a correspondent's email address to a picture, working outward from what Kamo already knows: member photo, then a photo someone attached to a contact, then the tenant's connected Microsoft/Google directory, then the sender domain's BIMI mark, then its favicon, then Gravatar. Anything unresolved renders a monogram, so the chain always terminates locally. The directory tier is worth calling out: the connect flows here already request admin.directory.user (Google) and User.ReadWrite.All + Directory.Read.All (Microsoft) alongside the mail scopes, so for Workspace and 365 tenants this returns authoritative photos with no re-consent and no third party involved. It should beat anything on the public internet and usually will. Two phases, never one. A request reads cache only; unknowns go to a bounded worker with DiscardPolicy — running an overflowed task on the caller would hand a request thread to a third-party host, and a discarded resolve costs nothing because the next poll asks again. A full-miss chain is DNS plus four HTTP calls, and a page carries dozens of addresses; nothing about opening a folder may depend on third-party availability. Decoupling also keeps resolution from correlating with a human opening a message, which would make it a read receipt — the exact behaviour the mailbox already blocks by default for remote images. This is the platform's first fetcher whose target URL is chosen by an untrusted party: a BIMI record is DNS content published by whoever owns a sending domain, and anyone becomes a sending domain by emailing a tenant. There is no egress NetworkPolicy and no forward proxy, so the controls are in code. SafeImageFetcher pins DNS — a custom resolver hands OkHttp only the addresses that passed PublicHostGuard, closing the rebinding window that defeats a naive pre-flight check — refuses redirects, caps bytes as they stream rather than trusting Content-Length, and requires an image content-type. SvgSanitizer parses and re-serializes against an allowlist instead of rasterizing. Batik 1.17 resolves external resources by default, so handing it a hostile SVG would dereference <image **************** from inside the cluster after the URL check already passed. The Tiny PS profile forbidding that is a statement about conforming files, not about bytes fetched from an attacker's URL. Provider miss semantics are all different and all cache-poisoning if treated as hits: Gravatar is asked with d=404 because every other default returns 200 with a placeholder; Google's no-match is a 404 carrying a byte-identical globe, so it is rejected by content hash; DuckDuckGo returns 404 with a real image body, so status decides. Bytes are re-hosted under a random name — never one derived from the address, which would let anyone probe whether a given person corresponds with this platform — and served through an authenticated route. Redis holds metadata only. That instance is 2GB with allkeys-lru on an emptyDir, sharing a keyspace with every live session; caching image bytes there would evict sessions and sign users out at random.

  18. · kamo-shared-library

    Sender identity model + org-scoped batch email lookups

    Backing store and queries for the mailbox sender-avatar chain. SenderIdentityEntity is the durable tier of the avatar cache. org_id is part of the natural key rather than decoration: USERS.EMAIL is unique only per security provider, so an answer derived from tenant data must not be visible to another tenant. External-tier answers (BIMI/favicon/Gravatar) are genuinely global and share a sentinel org so every tenant shares the hit rate. Misses are stored as rows, not absences — without that, every unresolvable sender re-runs the whole provider chain on every inbox poll. OrgAvatarSettingsEntity splits the chain by what actually leaves the building. The identity tier defaults OFF because it discloses a digest of a correspondent's full address to a third party, which on a lending CRM is a decision about a borrower identifier rather than a display preference. The repository additions exist because none of this was reachable before: - ContactEmailRepository had no lookup by address at all — only substring LIKE for the autocomplete — so a contact that had a photo could not be resolved from a From: header. - Member/User batch lookups are org-scoped and take pre-lowercased input. LOWER() is applied to the stored column only; emails are persisted verbatim (EmbEmail has no normalizer) and CockroachDB equality is case-sensitive. - The avatar-id projections return ids rather than entities on purpose. Both Member.avatar and User.avatar are lazy associations onto a JOINED hierarchy: a caller outside a transaction gets LazyInitializationException, and one inside gets a base-type proxy that never narrows to AvatarPhoto, putting the file extension needed to build the URL out of reach. - **************** replaces a findAll() full-table scan that ran once per indexed message. PublicHostGuard is shared rather than duplicated because it is a security control: it decides whether an address is somewhere we will send a request that an untrusted party chose. Tested against the real bypass techniques — IPv4-mapped IPv6, 6to4, NAT64, CGNAT and link-local metadata. Right 177 gates the disclosure decision.

  19. · kamo-shared-library

    Audit spine for PHI access — §164.312(b)

    The Security Rule requires recording access to ePHI, which means reads. The platform records changes well — LeadHistory, SystemAccessLog, UserHistory, LoanAuditEvent — and reads almost nowhere, which is why "who viewed this record" is currently unanswerable. That is also the first question a §164.402 breach assessment asks, so this one gap blocks both the audit control and the four-factor analysis. Capture layer only; no schema. The durable store sits behind PhiAccessLogWriter so call sites can be wired now and the sink can evolve — plain table, then append-only with a hash chain, then a signed export to object-locked storage — without rippling back through hundreds of call sites. Two properties carry the weight: - Failure handling belongs to the access kind, not the caller. EXPORT, DOWNLOAD and DISCLOSE fail closed: an unlogged bulk export is exactly the event you cannot reconstruct afterwards, and "we served the data but lost the record" is the worst answer to give an investigator. VIEW, LIST and SEARCH fail open and log loudly, because losing one line is not worth taking the product down. That asymmetry is deliberate and wants signing off rather than assuming. Callers under pressure resolve policy questions in whichever direction unblocks them, so the policy is not at the call site. - A denied read is still a read. Refused attempts are recorded, because the access pattern of someone probing records they cannot reach is what detection needs and is invisible if only successes are logged. Startup safety, which nearly went wrong: PhiAccessRecorder is a @Component and every service component-scans com.kamo, so a hard dependency on a writer bean would have failed context startup across ~40 services at once — a whole-platform outage from a feature nothing had called. The first fix, a @Configuration with @ConditionalOnMissingBean, does not work: component-scanned configuration is processed alongside user configuration rather than after it, so both writers register and injection fails on ambiguity. PhiAuditContextWiringTest caught that. The fallback now lives in the recorder via ObjectProvider.getIfUnique, where no ordering question exists, and ambiguous writers degrade to the default rather than failing startup. The default Slf4j writer is a starting point, not the destination — log lines are not tamper-evident and retention is 14 days against a six-year obligation. It exists so call-site wiring does not wait on the store. Identifiers are logged, content never is: an audit trail that reproduces the record it audits has just moved the PHI into the log stream.

  20. · SecurityService

    403 미만 500 준수 경계가 거부 될 때

    FeatureService.enableFeature의 두 개의 호출 사이트 이제 HIPAA 경계를 이해: - /enable 지도 PhiModuleNotPermittedException 에 403 이유, AppliedModelViolationException 핸들링을 바로 위에 놓습니다. 없음 이 넓은 캐치 아래는 500에 deliberate 정책 refusal을 돌렸다. - isPhiPermitted와 목록 경로의 자동 활성화 루프 한국어 그것은 모든 완료된 ServiceType을 통해 실행됩니다. *listing* 조직의 특징은, 그래서 첫번째 막힌 단위에 던지고 PHI tenant 대신 하나의 입력을 숨길 수없는 기능 페이지. 오늘 주장 — 모든 조직은 handlePhi=false입니다.

  21. · kamo-shared-library

    기능 스위치에서 준수 경계를 강화

    Wires PhiTenantGuard는 FeatureService로 단일 초크 포인트를 통해 모듈은 조직에 전환됩니다. 이것은 경계선이되는 곳이다. 정책 객체를 시작하고 시행을 시작합니다. halves 둘 다, 혼자서 간격을 떠나기 때문에: - enableFeature는 PhiModuleNotPermittedException을 던져, 그래서 PHI tenant는 할 수 없습니다 모듈 Kamo의 스위치는 비즈니스 동료로 뒤를 수 없습니다. - isFeatureEnabled(Organization, ServiceType)은 모듈을 비활성화하여 10개의 손잡이 PHI와 단위는 경계의 외부, 무엇이든입니다 OrgFeature 행 말한다. 행은 합법적으로 행동 할 수 있습니다 — 그것은 활성화되었습니다 tenant가 PHI tenant가되기 전에 enableFeature가 다시 실행되지 않습니다. 그 전환. isPhiPermitted는 그것을 이더레이트 콜러에 대한 논스톱 형태입니다. 기능제어기 auto-enables 각 완료된 기능 동안 *listing*, 그래서 첫 번째에 던져 차단된 모듈은 전체 기능 페이지가 하나 이상의 항목이 실패합니다. PhiServiceTypeMapping는 PhiModule에 ServiceType를 결합하고, 시험과 더불어 합계 입니다 그것은 어떤 unmapped 값에 빌드 실패. 그 테스트는 첫 번째에 유지 실행: 그것은 ServiceType.STORAGE를 잡았고, enum의 grep이 놓았고, 그 후에 AI CHAT, DOC MANAGER, DOCS EDITOR 및 DOC CLASSIFIER. 그것 없이, 5개의 서비스 유형은 경계 밖에서 조용히되었습니다. - 동일한 배출 실패 PhiModule의 constructor는, 1개의 층을 새롭게 개조했습니다. 이전 unmapped 서비스 유형을위한 새로운 모듈, 각 명시 disposition: 객체 저장, 문서 편집기 및 클래스터, 지원 티켓, HR, 재고, 법적, 계산기 및 활동 피드는 내부; 클럽 하우스와 게임은 BLOCKED PENDING WORK 그들이 평가되지 않은 땅에, 이는 가정보다 오히려 차단하는 이유. 모든 조직은 handlesPhi=false 오늘, 그래서이 변경에 행동 없음 생산. 그것은 순간을 불러일으킵니다.

  22. · kamo-shared-library

    응용 프로그램 생성에 MERS 호환 대출 번호를 할당

    LoanFile.loanNumber는 생성에 null이었습니다 (빈 창조와 지도 promote) 스튜어드가 한 번 입력했을 때만 설정했습니다. minting (MIN의 10-digit 세그먼트는 대출 번호입니다) 및 모든 다운스트림 머리없는 대출에 대한 식별자. AppMortgageService는 이제 두 개의 생성 사이트에서 대출 번호를 할당합니다. 깨끗한 10자리 숫자 (MinMinter strips non-digits and needs <=10자리 세그먼트, 그래서 순수한 숫자는 유일한 안전한 모양입니다), org 당 유일한 (org id, 대출 number) 경계 재량 지수. FAILS는 null을 엽니다. 충돌 streak 또는 사용할 수없는 재포 - 이전 설명서로 분해 애플리케이션 생성을 끊는 것보다 행동. 아 lender-supplied 대출 파일 패치 경로를 통해 여전히 overrides. schema 변화 없음 ( 열은 이미 존재, 색인).

  23. · kamo-signer-monorepo

    수령인의 해결 된 timezone에서 서명 날짜 렌더링

    SigningSession은 ESigService가 해결하는 데 필요한 `timeZone`(IANA id)을 얻습니다. 받는 사람의 회원 영역에서, 그 다음 org의, 그때 UTC. 현재 위치 형식자에 명시적으로 전달, 그래서 만료 날짜는에 따라 달라집니다 viewer의 장치 설정 및 공급자의 UTC 기본값. 회사연혁 선택 사항보다는 1 리터 세션 건설 현장을 잡았다 컴파일 시간에 (preview.ts). 또한: - setRequestLocale 으로 locale layout 그래서 번역 URL에 바인딩 미들웨어 헤더에 의존하지 않는 세그먼트 - 메시지가 살아남은 Dockerfile에서 assert, 그리고 문서 왜 .dockerignore는 빌드 컨텍스트에서 .gitignore를 유지해야 합니다. 연결 prune는 번역을 떨어 뜨리고 이미지 배는 익지않는 열쇠를 연출합니다 signer가 문서를 열 때까지 실패하지 않고

  24. · ESigService

    회원의 기호 표시 시간대를 해결, 다음 org

    서명 날짜는 기본적으로 클라이언트가 어떤 영역에서 렌더링되었습니다, 그래서 2026-08-03T05:00Z는 Pacific signer에 "Aug 3"를 읽을 수 있었습니다 링크가 이미 8 월 2 일 저녁에 죽었는지 SigningSession 이제 서버 해결 IANA timeZone을 수행합니다. 자신의 member.timezone 때 그들은 회원이며 하나를 설정, 다른 전송 Organization.timezone, 다른 UTC. SignerZone은 테스트와 순수한 해결자입니다. 모든 TimezoneType 맵을 자신의 ZoneId에 포함 enum 값은 클라이언트 측 RangeError를 발송할 수 없습니다. 또한 SigningSession.locale를 수정하여 enum name ("SPANISH")을 방출합니다. 대신 서명 URL의 Locale 세그먼트에 사용되는 BCP-47 코드 ("es")보다.

  25. · InitializerService

    Orgs에 HANDLES PHI 및 PHI EFFECTIVE DATE 생성

    OrgBrandingFieldsMigration의 두 가지 새로운 조직 필드를 미러링 규칙, 그래서 열은 어떤 환경에 재현 가능 ddl-auto pass가 실행되는 존재. HANDLES PHI는 NULL DEFAULT FALSE가 아닙니다. 준수 경계. PHI EFFECTIVE DATE는 TIMESTAMP, TIMESTAMPTZ입니다. 엔티티티 필드가 LocalDateTime이기 때문에. 이 테스트는 드리프 가드, restatement: 그것은 열 이름을 읽습니다 법인을 반영하고 엔터가 없을 때 빌드를 실패합니다. 이름 * 이 컨벤션의 실제 실패 모드 - 누군가가 필드를 추가, 잊지 이동 및 ddl-auto : 생산으로 표면 서비스 중 하나 빌드 시간에 대신 쿼리 오류. mutation에 의해 확인: 제거 PHI EFFECTIVE DATE 대한민국 ALTER는 행동 메시지와 실패, 그것을 복원 녹색을 간다. 두 열은 이미 클러스터에 존재합니다. 이 ALTERs는 idempotent입니다.

  26. · kamo-shared-library

    Persist handlePhi와 phiEffectiveDate 에 조직

    Backs PhiTenantGuard 와 실제 열. HANDLES PHI는 NULL DEFAULT FALSE가 아닙니다. ****** ****** ***** 본, 그래서 모든 기존의 tenant 규정을 명시적으로 외부로 갖는다. PHI EFFECTIVE DATE는 위반 평가 및 보존 의무를 준수합니다. 오른쪽 창 - "since when"는 "what was exposed"후 묻는 첫 번째 질문입니다. 로 변환 정책 *********** 더 감시 자체는 무료로 유지됩니다. 그래서 콜러는 세션 캐드 플래그 만 보유합니다. 행을 로드 할 필요가 없습니다. 푸시에 안전: 두 열은 이미 클러스터에 존재하고 12의 모든 것 조직은 false를 읽습니다. 착륙하기 전에 information schema에 대해 확인 — handle phi boolean NOT NULL DEFAULT false, phi effective date 타임스탬프 NULL. 재현 가능한 형태로 KamoInitializer 마이그레이션을 참조하십시오.

  27. · kamo-shared-library

    PhiTenantGuard 및 모듈 준수 경계

    HIPAA 준수 경계의 핵심 요소 : 어떤 모듈이 열렬한 도달 할 수 있습니다, 그 10대는 보호된 건강 정보를 취급합니다. 모든 것 downstream key off it — 통합이 비활성화되어 있는지, MFA가 강제 여부, 어떤 세션은 더 엄격한 타임 아웃을 얻을, 어떤 감사 척추를 커버해야. Carries no schema 의존성. 이전 시도 hung 이 떨어져서 새로운 Organization.handlesPhi 열과 거꾸로했다 : 서비스 CI 복제 KamoInitializer가 손으로 실행하는 동안 빌드 시간에 공유 리브 메인, 그래서 main breaks에 대한 엔티티티티 컬럼은 다음의 서비스 배포를 누군가의 마이그레이션까지 방해합니다. 기업의 정책이 토지를 의미하고 지금 시행 할 수 있습니다, 그리고 열은 독립적인 단계가 됩니다. 3개의 재산 디자인은 주변에 건설됩니다: - 실패. PhiModule의 생성자는 PhiDisposition와 이유를 요구합니다, 그래서 모듈은 나중에 omission에 의해 허가를 상속 할 수 없습니다 — 그것은 아닙니다 결정없이 컴파일하고 PERMITTED denies 이외의 다른 것들. 그것은 실패 모드 준수 경계는 살아있다 : 모듈 배, 아무도 PHI에 대해 생각하고, 클리닉은 그것을 사용합니다. - 녹지 않는 tenant는 안전한 tenant 아닙니다. 경비원 PhiTenantStatus 오히려 불린, 그래서 "나는 조직을로드 할 수 없습니다" "이 조직은 PHI가 아닙니다"와 같은 방법을 뿌릴 수 없습니다. 지원하다 boolean, 오류 경로 isPermitted (false, ...) - 쉽게 도달 할 수, 리뷰의 대상 UNKNOWN 모든 것. - 높이는 아무것도. 결정은 (status, module)의 순수한 기능입니다 caller, session, right 또는 god-mode 매개 변수. "우리의 지원 직원은 그것을 돌 수 있습니다 off"는 해당 법인의 리뷰가 실패한 답변입니다. 분해는 kamo-internal에 있는 scoping 분석을 따릅니다 ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 허가: CRM, 연락처, 문서 볼트, 자체 호스팅 이메일, e-sign, 메모, 작업, 달력, 내부 채팅, in-cluster 쓰레기통/번역 더미, MLOS. 얻지 않는 BAA와 차단: 사회 메시징, Canva, 전자 상거래 동기화, MCP 게이트웨이. Blocked pending 이름 작업: AI 라우터, RAG 검색, 회의 녹음, VOIP 녹음, 마케팅 캠페인, 분석 수출. 아직 가드를 호출하지 않습니다, 그래서 이것은 유선까지 주장합니다.

  28. · InitializerService

    Orgs에 HANDLES PHI 및 PHI EFFECTIVE DATE 생성

    Kamo-shared-library의 조직에 두 개의 새로운 필드를 미러링, OrgBrandingFieldsMigration 협약을 따르십시오. HANDLES PHI는 NULL이 아닙니다. DEFAULT FALSE 그래서 모든 기존의 테넌트는 규정외에 명시되어 있습니다. 그것을 내부에 조용히 이상 경계. PHI EFFECTIVE DATE는 TIMESTAMP입니다. 엔터프라이즈 필드가 LocalDateTime이기 때문에 TIMESTAMPTZ. SEQUENCING - 다음 서비스 배포 전에 실행해야합니다. 서비스 핀 kamo-shared-library 에 republished 에 위치, 그래서 첫 번째 라이브러리 변경이 열을 선택 한 후 재건축하는 서비스, ddl-auto :이 러너가 실행될 때까지 실패한 서비스 중 하나. 동반된 시험은 무려 감시, restatement 아닙니다: 그것은 란을 읽습니다 반사에 의해 엔티티티티티티 필드가없는 경우 빌드를 실패 한국어 그것은 실패 모드 이 전체적인 컨벤션이 있다 — 누군가가 필드를 추가, 마이그레이션을 잊고, 대신 생산 쿼리 오류로 표면 시간 구축. mutation에 의해 확인: PHI EFFECTIVE DATE ALTER 제거 행동 메시지와 실패, 복원 녹색 간다.

  29. · ESigService

    로그인 링크에서 Signer Locale 세그먼트를 전송

    Byte-for-byte duplicated buildSignLink를 SignLinkBuilder로 추출 and add a locale 세그먼트 sourced from Organization.language, 떨어지는 번역없이 4 개의 LanguageType 값에 대한 영어로 돌아가십시오. kamo-signer /{locale}/ 라우팅을 먼저 배포합니다.

  30. · kamo-shared-library

    HandlesPhi tenant 플래그 및 PhiTenantGuard 추가

    HIPAA 준수 경계의 키스톤 : 조직 플래그 플러스 조직이 도달 할 수있는 모듈을 결정한다. 모든 downstream key off it — 통합이 비활성화되어 MFA가 강제되는지 여부 세션은 더 엄격한 타임 아웃을 얻을, 감사 척추가 커버해야. 조직은 HANDLES PHI (BOOL DEFAULT FALSE)와 PHI EFFECTIVE DATE를 얻습니다. 기존 *********** 패턴을 따르십시오. 기본 false, 그래서 이것은 기존의 모기지 및 CRM 책에 대한 주장입니다. 3개의 재산 디자인은 주변에 건설됩니다: - 실패. PhiModule의 생성자는 PhiDisposition와 이유를 요구합니다, 그래서 모듈은 나중에 omission에 의해 허가를 상속 할 수 없습니다 — 그것은 아닙니다 결정없이 컴파일하고 PERMITTED denies 이외의 다른 것들. 그것은 특정한 실패 형태는 수락 경계를 살아야 합니다: 단위 배, 아무도 PHI에 대해 생각, 클리닉 그것을 사용하여 시작. - 우회할 수 없습니다. 결정은 (조직, 단위)의 순수한 기능입니다 caller, session, right 또는 god-mode 매개 변수가 없습니다. 높은. "우리의 지원 직원은 꺼낼 수 있습니다"는 실패한 대답입니다 기업의 리뷰. - Denials는 "denied"가 지원되지 않기 때문에 이유를 수행 엔지니어 또는 고객. 분해는 kamo-internal에 있는 scoping 분석을 따릅니다 ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 오늘 허가: CRM, 연락처, 문서 vault, 자체 호스팅 이메일, e-sign, 메모, 작업, 캘린더, 내부 채팅, in-cluster transcription/translation stack, 그리고 MLOS. 얻지 않고 차단 BAA : 소셜 메시징, Canva, 전자 상거래 동기화, MCP 게이트웨이. 이름 변경 일: AI 대패, RAG 수색, 회의 기록, VOIP 기록, 마케팅 캠페인, 분석 수출. Schema 주의: HANDLES PHI와 PHI EFFECTIVE DATE는 다음에 적용됩니다. KamoInitializer 실행, CI가이 공유 라이브러리 빌드를 게시 한 후. 아무것도 읽습니다 아직 깃발, 그래서 주문은 안전합니다.

당신의 우주는 기다리고 있습니다.

몇 분 안에 무료로 시작하세요. 준비가 되면 언제든지 제품을 추가할 수 있습니다.

영원히 무료 - 신용 카드 필요 없음