변경 로그
무슨 일이야?
플랫폼에 대한 모든 개선 사항, 그것이 선적.
· kamo-internal
회원 실행 프록시 경로와 순수한 마법사 모델
8 1:1 경로: /api/docs/legal/member/** forwardToApi (PATH ONLY — forwardToApi는 쿼리 문자열을 소유하고 /api/esig/member/** 에 직접 ESIG SERVICE URL은 APIService가 /api/docs/**를 전달하기 때문에 생성하는 생성물과 /api/esig/**를 전달하지 않습니다. 1개의 OTK, 노선 당 1개의 상류 요구: OTKAuthFilter는 getAndDelete를 합니다. PDF 경로 스트림 바이트 및 업스트림 상태를 보존, 그래서 409 (the 언 콘텐츠 digest 더 이상 저장 된 바이트 일치)는 마법사에 도달 손상된 PDF보다 409. Consent는 파싱하지 않는 한 경로입니다. 그것의 성공 몸: ESigService는 빈 200에 그것을 대답합니다. 모든 마법사는 여기에 vitest이 수집하기 때문에 순수한 단위에 살고있다 노드 환경에서 .test.ts. 서명 가능한 문서는 esign에서 렌더링합니다. route — 그 바이트 ESigService flattens이며, 당신이 보는 것은 무엇인지 당신은 서명; DocsService의 버전 핀으로 인증 전용 문서 렌더링 오시는 길 단계 축선은 orderIndex 순서이고 attestation 단계는 또한 존재합니다 0개의 문서가 서명합니다.
· kamo-internal
Kamo-signer 서명 핵심을 kamo-internal에 항구하십시오
각 @kamo/* 포장은 개인적입니다: 수출을 가진 true: "/src/index.ts"와 건축 없음 단계, 그래서 게시 가능한 artifact가 없습니다 - 파일은 복사하고 다시 연결됩니다 상대 수입. Behaviour는 변경되지 않습니다; 단지 수입 및 i18n 이동. pdfjs-dist 4.10.38 와 SELF-HOSTED 노동자는 prebuild 단계에 의해 복사. 이름 * ****************는 cdnjs에서 pdf.js 4.4.168를 적재하는, 다른 엔진이고 법적으로 의무적인 표면을 위해 unacceptable, 그리고 2 GlobalWorkerOptions 객체는 모듈 인스턴스가 아니라 uncorrupted 유지 결코 만나지. FieldElement.tsx가 아닙니다. FieldControl는 렌더링합니다. pointerEvents:'none' previews with no value 바인딩 — 디자이너 미리보기, 아니 입력. useTranslations는 네 개의 서명 구성 요소가 있습니다. 그들은 kamo-signer의 호출 자신의 메시지 키, kamo-internal's 사전은 그들을 가지고하지 않습니다, 그리고 새로운 키 발명할 수 없습니다. 문자열은 props로 도착합니다. SIGNATURE FONTS는 너무 예쁘다. 4개의 next/font/google는 1개의 modal를 위해 적재합니다; 유형 글꼴 ID는 아직도 라이더를 라이더 CapturedSignature.typedFont를 통해 평평하고 인증서가 공개되지 않습니다. 2개의 표시된 편차는 verbatim 사본에서, signStore에서 둘 다: - 필수-ness now Skips readOnly 필드. kamo-signer 그들을 계산; ESigService의 FieldCompletion — 배송된 서버 측 시행 — 하지 않습니다 ("if (f == null ||f.readOnly() || !f.required()는 계속;"). 계속하기 signer copy stricter than the server will park a member on the gap they have no 서버가 envelope를 완료하는 동안 닫히는 제어. - 창 대신 localStorage를 보호합니다. 창은 잘못 질문: localStorage는 absent (서버 렌더링)일 수 있습니다 또는 접근에 던져 (개인 모드, 파티션 저장), 그리고 초안은 마법사를하지 않아야합니다. 그것으로 아래로.
· DocsService
/api/docs/legal/member/**에 회원 표면을 마운트
여기에 권한이 있기 때문에 별도의 깔때기를 가진 별도의 컨트롤러 정체성 및 HR 권리. 감시를 통해 이러한 여정()은 어느 것 각 직원을 자신의 Paperwork 또는 Widening LegalPackageAccess에서 잠금 템플릿 그리드와 관객 미리보기의 로스터가 전체로 열립니다. org; 클래스는 LegalPackageAccess에 대한 참조를 보유하지 않습니다. 없습니다. 맵핑은 회원 ID 또는 org ID가 없습니다. 둘 모두 세션에서 온다. (주) ResponseStatusExceptions는 상태를 유지 : 404 not-yours, 409 이미 완성, 422 Not-acknowledged 및 503 esign-unavailable는 4개의 다른 지시, 그들 중 하나는 회원이 이미 성공한 것을 의미합니다. 예기치 않은 예외는 고정 문자열 500: echoing e.getMessage()는 HR 표면에 허용되지만, 이것은 모든 직원은 도달 할 수 있습니다. KToken 추출은 security/SessionKToken로 이동하여 이것은 그 세 번째가 아닙니다. verbatim 사본.
· DocsService
끝에 포장 attestation, 그리고 EXECUTED/AWAITING OTHERS 쪼개지는
WORM LegalPackageAttestation 쓰기: FROZEN의 attestationTextSha256 버전 (패키지의 초안 낱말은 mutable이고 이미 가지고 있을지도 모릅니다 reworded), 주문한 [{documentUid, contentSha256, orderIndex}] 실제로, attestedAt 응용 프로그램 세트, sourceIp에서 발표 오른쪽 왼쪽 X-Forwarded-For walk, proofBlob 동사 다시 입력. 클라이언트는 완료를 위해 신뢰할 수 없습니다. 아무것도 쓰여지기 전에, 각 signable document's envelope는 ESigService에서 재읽습니다; 내 수신자는 있어야 합니다 SIGNED 및 PARTIALLY SIGNED는 DisclosureEnvelopeSyncService를 붕괴하지 않습니다. 그것을 붕괴, 그래서 보류 카운터 신호 수율 AWAITING OTHERS 오히려 실행해야 하는 패키지. 실패는 끝을 거부 - a timed-out 호출은 어떤 사람이 서명했는지 증거하지 않습니다. 0개의 서명 가능한 문서를 가진 포장은 봉투를 창조하지 않으며, ESigService를 부르지 않습니다 모든 것에, 그리고 attestation는 그것의 유일한 실행 증거입니다. 두 번째 끝 기존의 행을 반환합니다: entity's @PreUpdate는 디자인과 던지기 migration's UNIQUE index on assignment uid는 실제 serializer입니다.
· DocsService
Identity-authorized 회원은 할당을 위한 표면을 읽었습니다
LegalAssignmentOwnership는 목적에 LegalPackageAccess에서 SEPARATE 가드입니다. 자신의 합의를 실행하는 구성원은 HR 권리가 없으며, HR의 넓은 그들을 인정하기 위해 설정은 모든 구성원이 템플릿 그리드와 청중 미리보기의 전체 로스터 이메일. 콜러가 아닌 모든 것 자신의 할당은 동일한 404 - 403는 uid가 진짜인지 확인합니다. 자세히()는 HR 행(firstViewedAt, PENDING -> IN PROGRESS) 오히려 ESigService보다, 그래서 수신자 통계 기계는 터치되지 않고 배지가 정직합니다. 시험 단어는 온다 FROZEN 버전에서 패키지의 무균 초안에서 결코. 관련 기사 Pdf는 ACKNOWLEDGE-ONLY 문서를 제공하며 제공된 ImgDat's를 검증합니다. Content-address는 언 contentSha256에 대해 소화합니다. saveImgContent repoints img.setDat 모든 Docs 득점방해에, 그래서 drift는 살. 서명 가능한 문서는 esign 경로의 409 naming로 거부됩니다. - 그 바이트 그들에게 평평한 서비스를 제공해야합니다. KToken의 orgID/memberID는 primitive long이므로 계획의 "== null" identity 체크는 0 대신; extractKToken는 absent 세션 필드의 뒤에 0을 남깁니다.
· DocsService
Manifest canonical 모양과 spoof 저항하는 클라이언트 IP
alertSha256 hashes 명령 [{documentUid, contentSha256, orderIndex}] 회원이 실제로 보았고, 길이를 미리 설정했기 때문에 공예가가 잘못 될 수 없습니다. 필드 경계와 같은 두 개의 다른 문서 세트 해시를 만듭니다. proofJson는 입니다 동사 및 라운드 스트립을 같은 소화로 저장 — 증거 blob 그 자체 해시를 재생할 수 없습니다. LegalClientIp는 X-Forwarded-For RIGHT-to-LEFT를 걸어 첫 번째 공공 홉을 취합니다. DocumentAccessAuditor는 클라이언트 통제되는 그것 좌우에 읽습니다; 그 사전 노출 결함이 여기에 고정되지 않습니다, 하지만 그것은의 소스가되지 않아야 evidentiary 소스Ip.
· ESigService
/api/esig/member/**에 등록된 회원 등록 표면
OTKAuthFilter는 /actuator, /api/esig/public 및 /api/esig/internal만 우회합니다, 그래서이 접두사는 orgId/memberId를 가진 직원 OTK auth 뒤에 이미 있습니다 이름 * 수신자는 결코 경로를 변수: 그것은 일치에 의해 해결된다 EsignEnvelopeRecipient.memberId OTK 회원 ID, 그래서 매개 변수가 없습니다 회원은 동료의 행에 도달 할 수 있습니다. , not-your-org 및 not-on-this-envelope 모두 동일한 404에 응답합니다. no /delegate - 임의 외부 이메일에 대한 준수 문서 승인 및 사용하지 않는 플래그가 없습니다. omission에 의해 제외 된 플래그가 아닙니다. 없음 /decoder 및 /stepup 중 : 수신자 부담 디코더는 HR의 취약점에 속합니다. 경로 및 단계 업은 Redis Signer 세션에 키 입력되지 않습니다. signerIp주소는 오른쪽-에-LEFT X-Forwarded-For에서 옵니다. EsignPublicController.clientIp는 클라이언트 통제되는 좌측에, 읽습니다 그리고 그러므로 spoofable, 그리고 그 가치는 evidentiary 분야에 땅.
· kamo-internal
위탁된 포장 sub-tab 및 deliver/redeliver/void 활동
MUI-paginated fetch에 AG Grid Community - 커뮤니티에는 서버 측 행 모델이 없습니다. 그래서 서버 페이지와 그리드는 그것이 뭔지 정확히 렌더링. 실행하기 열은 동일한 상태에서 파생된 서버 측 칩 렌더링, 그래서 2는 할 수 없습니다 disagree, 그리고 envelope를 가진 signable 문서는 앉기 보다는 오히려 경고를 올립니다 "pending"으로 영원히. 오른쪽 필터 열은 org의 자신의 복수 팀 구성원 용어에 의해 머리 데이터, 독립 "모든"열과 함께 — deliberately not one interpolated "모든 {Team member}"string, 사전의 같은 메시지가 깨지기 때문에 12개의 지역 및 새로운 열쇠가 여기에서 발명될 수 있는 placeholder 세트. 로스터는 기존의 청중-preview endpoint를 대신하여 쓰고 있습니다. 회원 가입자의 13 번째 사본 + 팀 구성원 - 계약자 이중 fetch, PROSPECT, CANDIDATE, TERMINATED 및 RESIGNED 회원을 반환합니다. paginator의 "1-25 / 100"은 공통.table.of보다 오히려 데이터에서 내장되어 있습니다. 값은 pl.json의 EMPTY STRING입니다. 키 가드는 오직 키가 en에 존재합니다. Void는 고정 VOID 도전 단어를 사용합니다 : 그것은 실시간 법적 도구 org-wide를 취소합니다.
· kamo-internal
법적인 패키지 제공/redeliver/void 프록시 및 할당 클라이언트
얇은 1:1 forwardToApi 경로 — OTKAuthFilter가 있기 때문에, 1개의 상류 요구 getAndDelete와 다음 경로의 per-member 루프는 회원당 1 OTK가 필요합니다. 더 보기 listing pass a PATH ONLY; forwardToApi는 브라우저의 쿼리 문자열 자체를 병합합니다. status-to-i18n mapping은 실제 가드가 아닌 check-i18n-keys.mjs: 그 스크립트만 key가 en에 존재하고, 메시지/는 gitignored, 그래서 로컬로 추가된 키 패스 그리고 Docker 빌드가 실패합니다. 여기에 모든 키는 모든 22 로컬에서 확인되었습니다. 존재와 placeholder-set 평등, 그리고 4개의 알려진 아무도의 시험 핀 손상된 열쇠는 이제 돌려보내집니다. 빈 void 선택은 teamMemberIds 열쇠를 전혀 보냅니다 — 그 부재는 어떤 선택든지입니다 org-wide 지점; 빈 배열은 아무것도 할 수 없으며 아무것도보고하지 않습니다. RedeliverResult는 deliverResult를 확장하지 않습니다: RedeliverResultDto에는 versionNumber가 없습니다 필드, 만 *********** 그것을 선언 할 것 backend는 결코 보내지 않습니다, 그래서 deliverSummaryParts는 newVersionNumber를 읽습니다 redelivery 대신 보고 v0.
· DocsService
Org-scoped, 페이지, 필터링 가능한 법률 패키지 할당 목록
EntityManager에 내장되어 공유lib 저장소 방법: 필터 세트 kamo-shared-library에 동적 및 추가 공유-artifact 재건 쿼리에 대한 모든 소비자의 DocsService 문제. 조직은 전염성 및 첫 번째이며, 시험은 생존을 증명합니다. 모든 필터 조합 - endpoint는 org 매개 변수가 없다, 그래서 떨어졌다 또 다른 10개의 할당을 나열합니다. Paging는 uid tie-break를 운반합니다. 200-member 납품은 1 millisecond 안쪽에 deliverAt를 씁니다. 문서 수치는 2입니다. 그룹에 의해 쿼리, 아니 25 per-row 보기. 알 수없는 상태는 400, 결코 조용히 준수 그리드에 필터를 무시했습니다.
· DocsService
Void 법적인 패키지 할당, org-wide 또는 이름 회원
Per-assignment outcomes — voided, Skipped-executed, not-found — 때문에 관리자 이미 실행한 것을 알아야 할 6 명에 대한 패키지를 투표 (their) 증거는 의미하지 않았다 ( stale roster id). 베어 200은 할 수 없습니다 이름 * 할당 전환은 비동기적이다: 할당 행, e-sign 상태, 이다 어떤 문이 회원이며 배지를 구동합니다. 봉투 voids go off-thread 고 이다 voidEnvelope 409s가 완료된 봉투 및 인증된 문서는 모두에 봉투가 없습니다. 1명의 일원은 몇몇 줄을 붙들 수 있습니다 redelivery 후에, 그래서 각 행은 그것의 자신의 결정을 가져옵니다.
· DocsService
Redeliver는 변경된 포장, 열린 할당을 superseding
살아있는 지문이 출판 된 것에서 다르지 않는 한 Refusion. Binder.date 업데이트 죽은 Img에는 개정 카운터가 없습니다, 그래서 지문은 유일한 변화 신호입니다 거기 — 문 없이, Redeliver는 모두의 침묵하는 것 단추입니다 in-progress 작업 및 재발행 같은 악기. 기존 출판 경로를 통해 출판 (버전의 한 작가), 마크 모든 OPEN 과제 수료, 투표에 대한 자신의 비 최종 봉투를 수료, 및 수퍼스드 회원 세트에 재발생 - 새로 매칭 - re-resolved findAudience 그래서 회원은 첫 번째 배달이 교체되지 않기 때문에 종료. 할당을 실행하지 않습니다; 그들은 증거입니다.
· DocsService
청중에게 법적 패키지를 전달, 요청 스레드 오프
요청 스레드 계획 (2 개의 싼 쿼리, 그래서 응답은 누구에 대해 정확 포함 하 고 누가 건너 뛰고 왜), 그것을 작성: 200 회원 x 8 문서는 1,600개의 행과 ESigService 호출과 DocsService는 WOPI를 제공합니다. 풀은 봄 실행기 콩이 아닙니다. applicationTaskExecutor는 **************** 및 DocsService는 이미 @Async를 켜고 있습니다. KSessionService 및 DocumentService -- Executor bean 발행은 자동으로 이동 이 작은 경계 풀에 WOPI 세션 터치. 봉투는 거래 밖에서 생성됩니다. 20s는 timeout을 읽습니다. Hikari 연결은 10 별의 풀입니다. envelope의 서명 가능한 문서 실패는 null envelope uid를 유지, 이는 유일한 신호 그리드가 있습니다. redeliver/void/assignment 격자 매핑 땅은 여기 너무, 그래서 관제사에는 1가 있습니다 저자화 깔때기 작성 하 고 나중에 두 번째 하나 이상 한 번 증명; 그들의 서비스 응답 501 작업까지 4-6 몸 채우기.
· DocsService
배달 플래너 - incremental 타겟팅, 이메일 사전 필터, 마감일
전달은 새로운 경로이며, 다시 실행 될 의미, 그래서 이미 보유 회원 할당은 동일한 계기의 두 번째 사본을 주어진 보다는 오히려 빼고 있습니다. EsignEnvelopeService 는 이메일이 없습니다. 400s는 루프 내부에서 하나없이 서명자, 이전 회원이 이미 가지고 후 라이브 봉투. 청중 쿼리 ORs 3 predicates, 그래서 중복은 붕괴됩니다. 인정된 문서는 모두에 봉투가 없습니다.
· DocsService
ESigService 법률 패키지 납품을 위한 내부 클라이언트
DocsService의 첫 번째 아웃 바운드 서비스-서비스 클라이언트. 게시물 보기 ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** (오리진 MANUAL, 결코 미터로 재는) reasonInvite=true - HR는 1개의 통보를, 일원 당 문서 당 아무도 보냅니다. Timeouts는 명시되어 있습니다. EsignEmailClient는 아무도와 bare RestTemplate를 구축하고, 쐐기 포드 핀에 untimed는 재시작될 때까지 노동자 실을 핀으로 읽습니다. 아무것도에 던져 업스트림 오류, 팬 아웃 문제 1 회원 당 서명 가능한 문서 당 호출 1개의 나쁜 템플렛에 배치를 구부리지 않아야 합니다. Void 지도 409에 보고할 수 있는 오류가 아닌 Skipped-signed. 응답 레코드는 알 수없는 필드를 무시합니다. context ObjectMapper는 여전히 FAIL ON UNKNOWN PROPERTIES가 있습니다.
· kamo-internal
법률 및 규정 준수에 대한 패키지 템플릿 하위탭
HrTabPlaceholder body only - 경로, 탭 입력 및 게이트를 대체 이미 hrTabs.ts에 존재한다. AG Grid Community list와 Create/edit 대화 상자 HR RESOURCE에 따른 주문형 바인더 피커(일반 13세이상 15세이상), 업/다운 주문, 그리고 부서/Job 유형 다 선택은 모두 team-members toggle disables. 더 보기 toggle의 상표는 org의 자신의 복수 팀 구성원 기간, 결코 hardcoded 끈입니다. 새로운 i18n 키가 없습니다. 모든 라벨은 이미 사전을 정의하고 계산합니다. 데이터에서 렌더링.
· kamo-internal
법적인 패키지 프록시 경로, 클라이언트 api 및 순수 헬퍼
얇은 1:1 forwardToApi 경로 아래 /api/docs/legal — 하나의 상류 요청 각각, OTKAuthFilter가 getAndDelete이고 다음 경로의 팬 아웃 루프가 회원당 1 OTK가 필요합니다. Ids는 끝에 문자열을 유지합니다 (unique rowid). 주문은 감싸기 보다는 오히려 죄지고, 청중 명부는 모든 팀 때 빈 보내집니다 회원은 더 좁은 관객이 돌아갈 수 없습니다.
· DocsService
Audience 해상도 미리보기
TeamMemberRepo.findAudience를 통해 저장된 또는 초안 청중을 해결합니다. 필수 ACTIVE + recordState eligibility predicate를 나르는 유일한 독자 — team-members-contractors endpoint는 PROSPECT, CANDIDATE, TERMINATED 및 RESIGNED를 반환합니다. 이메일없이 플래그 회원 (EsignEnvelopeService hard-400s 없음) 및 회원 TEAM MEMBER 보안 아래 (ImagingController는 조용히 파일 복사본을 건너 뛰기). 이름 * 청중은 아무도로 해결하지 않고 빈 ID 목록이 sentinels가됩니다. OR'd IN 항목은 유효 SQL을 유지.
· DocsService
Byte-pinned 문서를 가진 버전을 동결
Pins img dat id plus content hash, not img id: saveImgContent는 동일한 지점을 모든 Docs 득점방해에 새로운 바이트에 Img, 및 fixSource는 dat 살아있는에 걷습니다 세션 빌드 및 평평한. Snapshots 대신 언 디자인 resolveDesignJson은 새로움을 거슬러 올라갑니다. PDF는 지문이 이동하지 않은 게시를 거부합니다.
· DocsService
/api/docs/legal/packages에서 법률 패키지 CRUD
List, create, get, update and delete, with order binder refs and 청중 행 설정으로 교체. Org는 각 경로의 세션에서 온다 — DocsService is 모든 및 OTKPreAuthFilter는 토큰없이 체인을 계속합니다. 컨트롤러의 ExtractKToken은 인증입니다. Cross-org 부서, 직책, 회원과 바인더 에이즈 400 명시적으로 침묵하지 않고 아무것도 쓰기.
· DocsService
법적인 포장 철사 계약 및 요구 normalization
문자열로 교차합니다 (unique rowid는 MAX SAFE INTEGER를 초과합니다). Binder 순서는 입니다 목록 순서, de-duplicated, 그리고 비 숫자 입력 400s 오히려 건너 뛰기 보다는 - Silent Skipping는 바인더를 잃는 방법입니다. 빈 청중 목록 붕괴 sendinel 그래서 또는 findAudience의 항목은 유효 SQL을 유지.
· DocsService
법률 패키지에 대한 콘텐츠 지문
Binder.dateUpdated 결코 INSERT 후 이동하지, 그래서 패키지의 내용이 변경되지 않습니다 비교할 신호. canonical에 SHA-256을 추가하면 binder/item tuple을 주문했습니다. saveImgContent 때문에 imgDatId를 포함하여 새로운 바이트에 동일한 Img를 다시 점합니다 모든 Docs 저장 — 과 attestation text hash. 인코딩은 길이 고정 그래서 만들어진 configJson은 다른 레이아웃을 강제 할 수 없습니다. 또한 저장소 스캔에 com.kamo.z.shared.hr.legal을 추가합니다.
· SecurityService
Push platform-admin state changes instead of being polled for them
Every platform screen backed by this service refreshed on a timer, because this service has no WebSocket and therefore no way to tell anyone anything: the closed-loan trainer tab re-read every 4 seconds while a run was live, DNS provisioning every 15, commerce sync logs and VOIP recording stats every 30, and the domain setup page asked verify-dns once a minute per open tab. PlatformEventPublisher sends these to core NATS and MediaService's new PlatformStompRelayController puts them on STOMP. Core NATS rather than JetStream, matching ThemeProvisionPublisher: this service's stream is CHAT_MESSAGES/chat.>, so a JetStream publish to security.* would fail expected-stream validation and be dropped. At-most-once is the right trade — every consumer also loads over REST when it mounts, so a lost event costs a refresh, never correctness. Wired at the points where the state actually moves: - ClosedLoanTrainerService on each progress write, on claim, and on every terminal state, so the monitor advances exactly when the walk does. - DnsProvisioningService as each record settles, rather than the panel re-reading the whole log hoping something landed. - RetailSyncLogBroadcaster on each sync-log row, via the new shared-lib listener seam, keyed by provider config so an org syncing several providers does not redraw all of them because one moved. Two counters have no such moment, and are handled honestly rather than pretended into events: - The VOIP recording backlog is written by another service entirely, so PlatformStatsWatcher samples it — but on the server, once, and it publishes only when the numbers actually change, so a quiet backlog produces no traffic where the old arrangement re-sent an identical payload to every viewer twice a minute forever. trigger-sync publishes immediately, since it knows the backlog is about to move. - Diagnostics is live JVM/host/database readings where essentially every field differs second to second, so there is nothing discrete to push. It gets a bare tick: one server timer deciding when "now" is worth re-reading, instead of one per open tab each pulling the full snapshot. DomainVerificationWatcher replaces the setup page's polling. DNS propagation and certificate issuance are genuinely external state with no event to subscribe to, so the checking has to happen somewhere — but not in every browser. One sweep covers every waiting domain, takes the 25 least-recently-checked so a backlog of misconfigured domains rotates instead of being re-queried in full, only probes HTTPS once DNS resolves, and publishes only when a domain actually advances. Two existing tests construct these classes directly and were updated for the new constructor parameters. Note: **************** fails on main already (unset EntityManager in the test's hand-built service) and is untouched by this change — verified against a clean HEAD worktree.
· EmailService
Mailbox-change 이벤트를 게시하므로 mail view stop polling
폴더 트리, 대화 목록 및 메시지 목록 각각 자신의 30 초 timer, 뭔가가 이동 한 기회에 다시로드. WebSocket은 이미 메일이 도착했을 때 그들에게 말했지만 mailbox가 변경되는 방법 중 하나입니다. - Roundcube 또는 휴대 전화에서 메시지를 읽고, 이동, 삭제, 또는 다음 틱이 될 때까지 모든 UI를 잘못 떠났습니다. EmailMailboxChanged는 폴더가 더 이상 무엇을 표시하고 운반하지 않습니다. 그래서 소비자는 그것에 대해 걱정할 수없는 종류를 무시 할 수 있습니다. 관련 기사 email.changed.<addr>와 릴레이 됨 **************** from IDLE 청취자 (arrival, expunge, flag change) 및 마크레드, 플래그에서, 이동, 삭제, 스팸, 전송 및 초안 엔드 포인트. EmailUnreadPublisher로 Deliberately 접히지 마십시오. 그 중 하나는 카운트를 소유하므로 공급 업체 및 석탄 파열에 도달 할 수 있습니다. 이 운반 아무 개도 읽고 아무것도 읽지 않습니다, 그래서 모든 변경에 보내서 싸고 창 뒤에 기다리지 마십시오. 이동은 두 개와 소스를 접촉하기 때문에 폴더가 항상 없습니다 콜러에 알려진 - 소비자는 "당신이 보여주는 모든 것을로드"라고 치료합니다.
· MediaService
STOMP에 릴레이 SecurityService 플랫폼 이벤트
SecurityService는 플랫폼 관리자 표면을 소유합니다 - 시스템 구성, DNS 프로비저닝, 상거래 동기화 — 하지만 WebSocket 엔드포인트가 없습니다, 그래서 모든 화면 그것에 의해 뒷받침은 아무것도 말하지 않고 대신 타이머에 새로 고침 : 닫히는 로난 트레이너 탭 매 4 초, 각 15, 상거래 DNS 제공 동기화 로그 및 VOIP 기록 통계 30. 그것은 코어 NATS에 게시; 이것은 STOMP에 그 메시지를 넣어, 동일 배열 지원StompRelayController 및 *********** 이미 사용. 대상은 기계적이다 — "보안"을 떨어 뜨리고 슬픔, 그래서 security.dns.log.42에 도착 /topic/dns/log/42 — 새로운 이벤트 유형은 게시자 및 가입자와 아무것도 필요합니다. 접두사는 보안보다 명시적으로 경계된다.> : catch-all double-deliver security.theme.provision.*, 어떤 ThemeProvisionStompRelay 이미 동일한 주제 모양에 릴레이.
· kamo-shared-library
Sync 진행 및 도메인 상태는 polled 대신 발표됩니다
SecurityService의 푸시 변환을위한 두 개의 후크, 몇 가지 플랫폼 화면은 타이머에 상쾌했습니다. 아무 것도 말할 수 없기 때문에. RetailSyncLogListener는 RetailSyncOrchestrator에 선택적인 통보 솔기입니다, sync run이 IN PROGRESS 행을 쓸 때 호출하면 다시 쓰기 맨끝 1. 관현관은 알림 여행과 구현이 등록되지 않고 정확히 이전대로 동작합니다. 공급자 sync 대시보드는 전체 로그 목록을 30 초마다 다시로드했습니다. 시작하기 ****** ********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 최상위 도메인 목록 완료 - DNS가 인증되지 않았거나 인증이 확인되지 않았습니다. 그것은 서버 측 검증 watcher에 대한 존재: 도메인 설정 페이지 polled 공개 DNS 전파를 기다리고있는 동안 열린 탭 당 1 분을 확인합니다. cert 발급. 먼저 주문하고 Pageable로 가져 오기 한 번의 스윕은 영구적 인 도메인의 수로 성장할 수 없습니다.
· ESigService
Per-envelope 초대 이메일 억제
Envelope unconditionally 이메일을 보내, 그래서 많은 콜러 배치 한 개의 알림 뒤에 봉투는 조용히 머물 수있는 방법이 없었다. Null 보존 기존의 행동; 액세스 토큰은 여전히 두 가지 방법을 발표했다.
· EmailService
Push INBOX unread counts over NATS/WebSocket instead of polling
The nav-top mail badge in kamo-internal refreshed itself by calling /api/email/folders every 30 seconds, per browser tab. That endpoint walks the entire folder tree and opens every folder read-only to answer, so the cost of one integer was a full mailbox summary, repeated indefinitely. The WebSocket that already existed only announced that mail had arrived and carried no count, so its one job was to trigger another poll. Publish the count itself: - EmailUnreadSnapshot on NATS email.unread.<addr>, relayed to STOMP /topic/email/unread/<memberId>. NATS is in the path because the pod that observes a change is routinely not the pod holding the member's WebSocket. - EmailUnreadPublisher coalesces per mailbox, so a ten-message IDLE delivery or a page of mail marked read is one IMAP round trip and one publish, off the caller's thread. - MailReader.getUnreadCount reads one folder. Graph answers it from the folder list it already returns; IMAP-backed providers override it with a single STATUS (UNSEEN). - A snapshot is published on subscribe, on IDLE messagesAdded/messagesRemoved, on IMAP flag changes, and from the mark-read / flags / move / delete / spam endpoints. Three gaps this also closes: - Flag changes were invisible. Reading mail in Roundcube or on a phone sets \Seen without adding or removing a message, so the badge only ever fell when the browser next polled. IDLE now carries a MessageChangedListener. - Cloud mailboxes got no push at all. EmailWebSocketController resolved credentials through the KamoMail virtual_users table, which has no row for a member on Microsoft 365 or Google Workspace, so subscribe() logged a warning and returned. It now resolves through MailProviderResolver, and IDLE connects with the credential spec (host/port/TLS/XOAUTH2) via a shared ImapStoreFactory.connect rather than assuming the KamoMail host and a password. - Sessions leaked. A closed tab never sends /email/unsubscribe, so mailboxes are now reference counted per STOMP session and released on SessionDisconnectEvent. Mailboxes with no live IDLE listener — Graph, past the 50-connection cap, or a dead IDLE thread — are swept server-side every 60s and published to the same topic. That replaces per-tab polling rather than push: one sweep serves every tab a member has open, membership is re-tested each pass so a dead listener is picked up, and the browser still receives the count over the WebSocket. MessageIndexer binds email.> and deserialized everything on it as a message, so it now skips subjects outside email.inbox. — filtered in the handler rather than by narrowing the subscription, because email-metadata-indexer is a durable consumer and changing its filter subject would reject the subscribe on every pod until the durable was deleted by hand.
· InitializerService
법적 패키지 schema 랜드
저장소 스캔 목록에 com.kamo.z.shared.hr.legal을 추가하고 보장 독특하고 룩업은 엔티티티 매핑을 안전하게 표현할 수 없습니다.
· kamo-shared-library
기록 패키지 attestation as append-only proof
패키지 레벨 '나는 읽고 동의합니다'는 다른 법률 기기입니다 E-SIGN은 모든 문서 서명을 전달하며, 표시 가능한 문서없이 패키지에 대한 유일한 증거. Guards는 업데이트 거부 그리고 PhiAccessLog 메서드를 삭제합니다.

당신의 우주는 기다리고 있습니다.
몇 분 안에 무료로 시작하세요. 준비가 되면 언제든지 제품을 추가할 수 있습니다.
영원히 무료 - 신용 카드 필요 없음