Probe 마스터 모델 엔드포인트 및 수정 적용모델 org ID
- applyModel.source 기반 게이트를 직접 프로브로 교체 /api/security/master-model on mount; r.ok=false (409)는 org를 의미합니다 분기 유형에 의해 지배된다 — 같은 체크 백엔드 사용 - useAppliedModel에 null을 ...
Gate censorship tab options by applied model constraints
- Hide EDIT MASTER MODEL button when org is governed by a branch type (use appliedModel.source instead of unreliable org context branchTypeID) - Hide ATF fiel...
Mark-as-read and message fetch for shared/member mailboxes
Classic mode now loads shared mailbox messages via the correct /messages/{folder} endpoint (was calling the non-existent /conversations endpoint). Fetching a fu...
Mark-as-read for shared and member mailboxes
EmailController.setFlags now accepts an optional mailboxId query param and routes through resolveProviderWithMailbox so member-mailbox flags are set against the...
Use extensionId as external ID, not Relay node id
FreePBX returns the same Relay id (ZXh0ZW5zaW9uOg== = "extension:") for every extension because the id field is not populated. Using it caused all extensions to...
ClassCastException을 방지하기 위해 getMessage에서 IMAPInputStream 처리
JavaMail 대신 IMAPInputStream을 반환할 수 있습니다. part.getContent() 메시지 내용이 예쁘지 않은 경우. 더 보기 직접 (String)는 parseMultipart () threw ClassCastException에 캐스팅 영향을받는 메시지, fetch...
살아있는 schema introspection에 대한 모든 GQL 쿼리 / mutations를 보충
모든 필드 이름과 실제 FreePBX 17 스키마에 대한 유형 확인. 개정의 가득 차있는 세트: 질문: - fetchAllExtensions: 확장에서 non-existent 'voicemail' 필드를 제거 - fetchAllUsers → allCoreUsers { coreUser ...
SelectFolder를 ThreadDetailView로 전달하십시오
chat.folder는 Java ConversationEntity로 항상 정의되지 않습니다. folderIds (text[])는 폴더 문자열 필드가 아닙니다. 이것은 loadThread를 call markConversationRead 및 그 후 이메일 발송:폴더 변경 폴더:undefin...
GraphQL 필드 이름 fetchAsteriskDetails
FreePBX API는 "Did you mean fetchAsteriskDetails?"를 반환합니다. - 건강 이름을 바꾸십시오. 쿼리 및 그 데이터 경로 accessor에 따라 확인합니다.
XHR/Accept 헤더 및 문자열 응답을 GraphQL 클라이언트로 파싱
FreePBXTokenCache와 같은 패턴: X-Requested-With + Accept: application/json FreePBX의 HTML 리디렉션 응답을 억제하고 모든 3 개의 호출 사이트를 전환 (queryOnce, restGet, restPost) 의 응답Entity<J...
Sync mailbox dropdown 에 기본 mailbox 에 로드
SelectMailbox가 초기화되기 때문에 첫 번째 목록 항목에 기본적으로 드롭다운 mailboxId없이, currentValue가 'personal'으로 해결하기 위해 어떤 옵션이 없습니다. 이제 선택된Mailbox를 1 차 (또는 first) mailbox 접근 가능한 우편함 짐.
파일 업로드 크기 제한 500MB
봄 부트는 1MB에 모자 multipart 부속, 배경 이미지를 일으키는 원인이 되었습니다 으로 실패 500 요청에.getParts(). SecurityService의 일치 기존의 500MB의 한계 그래서 APIService는 큰 파일 업로드 할 수 있습니다.
Surface HTTP errors 그래서 업로드 실패가 표시됩니다
Un-OK 상태에 thrown Error를 가진 Silent console.warn를 대체했습니다, 그래서 사용자는 실제 실패 이유 (status + 응답 몸)를 참조 대신 침묵으로 계산을 업데이트합니다. console.log 추가 몇 가지 새로운 이미지가 누락되는지 추적하고 POSTe...
토큰 엔드포인트에 대한 Accept+XHR 헤더와 raw-string 응답 패싱 추가
FreePBX는 클러스터 DNS를 통해 호출 할 때 텍스트 / HTML을 반환했습니다. Host header는 구성 된 PBX HOSTNAME과 일치하지 않았습니다. 더 보기 수락: application/json 및 X-Requested-With: XMLHttpRequest는 FreeP...
애니메이션 컨트롤을 통해 최소화된 tab 엔트리를 구동
Animate={...} 를 animate={tabControls} 로 바꾸기 생기: tabControls에는 산에 queued 표적이 없습니다, 그래서 단추 체재했습니다 처음 { y : 100 } 위치 (아래 화면). useEffect 추가 명시적으로 y를 시작 위젯State에 key...
FreePBX API에 대한 정확한 OAuth2 범위 문자열
FreePBX 범위는 최상위 식별자입니다: 'gql' (모든 GraphQL) 과 'rest' (모든 REST). 'gql:read' 형식은 모듈의 GQL을 의미합니다. invalid scope 400 오류가 발생하지 않는 'read'로 이름을 붙입니다.
ClusterIP 서비스에 직접 8088 노출
서비스는 항구 80→8088 매핑이 있었습니다. 내부 서비스 *************** (예: VOIPService API 토큰 요청) 포트 8088가 듣지 않았기 때문에 타이밍되었습니다. 클러스터IP.
Trust backend pendingCount, 드롭 클라이언트 오프셋
Backend pendingCount는 이제 읽지 않은 기반 (counts SUPPORT TICKET 세션)입니다. 소유자의 lastViewed보다 더 새로운 메시지). 에이전트가 열릴 때 티켓, markAsRead → 백엔드 방송 → frontend는 새로운 반영 자동 계산. fet...
K1m1에 대한 누락된 고장2ban-config ConfigMap 추가
배포 참조 실패2ban-config ConfigMap (jail.local + asterisk-security.conf) 하지만 존재 하지 않았다, 팟을 차단 마운트볼륨. 시작에서 FreePBX를 설정하고 방지합니다.
MarkAsRead 후 에이전트는 이렇게 lastViewed advances
지원 티켓에, 둘 다 방문자 및 대리인 메시지는 아래에 저장됩니다 같은 systemMember, 그래서 읽지 않은 계정 쿼리는 멤버 agnostic 및 lastViewed에 완전히 의존합니다. 에이전트가 MarkAsRead하지 않는 경우 전송, 자신의 대답은 새로운 방문자 메시지로 계산...
지원 티켓 필요 회원-agnostic 읽지 않은 수
지원 티켓의 방문자 메시지는 같은 systemMember에 저장됩니다. 그 대리인은, 그래서 기존의 CHAT-session 읽었습니다 queries - m.member.id를 제외한 = :memberId - 항상 0을 반환 지원 세션. 티켓 목록 배지 그러므로 결코 등장하지 않았습니다....
LoadThread retry 버튼을 패스하십시오
loadThread는 (threadId, 폴더); 과실 상태 재량 단추만 걸립니다 threadId를 통과, kamo-internal 구조. 전화 일치 서명.
정확한 JsonIdentity 'uniqueId'의 정보 속성
@JsonIdentityInfo(property = "uniqueId")를 선언했지만 실제 기본 키 필드는 'id'로 지정됩니다. 잭슨 threw 'uniqueId'라는 이름을 가진 속성을 찾을 수 없습니다. 즉, PUT /org/{id}를 사용하는 멤버(예: 조직)을 참조하여 반환 4...
SSR 가드를 제거하여 수분 잡기를 유발합니다. 웹소켓을 위한 드롭 SockJS
- Hero.tsx : ParticleField 주변의 Typeof 창 체크 제거 - 이미 ParticleField ssr:false 그래서 감시는 서버/클라이언트 나무 mismatch (React #418)를 생성했습니다 - LiveSupportPanel.tsx : @stomp/sto...
대화가 열릴 때 명확한 읽지 않은 표시
ThreadDetailView 이제 이메일 발송 : markConversation 후 폴더 변경자세히 보기 MailButton은 navtop inbox 배지 카운트를 refetches로 성공합니다. 계정 만들기 최적화된 제로 읽지 않은 항목 선택에 즉시 선택된 스레드 그래서 목록 배지는...
Move CORS to Traefik via kamo-middlewares, remove in-app CorsFilter
The CorsFilter @Bean in the Spring app was silently not applying headers after WebConfig.java was removed. CORS is now handled entirely at the Traefik layer by ...
Use /public/{mainDomain}-{tld} path matching actual MinIO bucket layout
The getThemePath() was generating /domain/{tld}/{split}/kamosite paths that don't exist in MinIO — theme files live in the public bucket under kamocrm-com/, bad...
Break min-w-0 chain to contain email scroll in body column only
Add min-w-0 to outer container and main content flex div so flex children cannot expand to email min-content width, which was causing the page-wide horizontal s...
ToolProviders의 호이스트 공급자
ChatWebSocketProvider 호이스트와 같은 루트 원인: SupportTicketWindow 이름 * *********** 및 ChatBox 통화 useUnread().markAsRead(), 하지만 ToolDock 내부의 도구 창 렌더링 ABOVE PresenceWrappe...
BoostHydrationWarning 및 수정 깨진 placeholder 이미지 추가
억제HydrationWarning on <html>는 React 오류 #418을 브라우저에 의해 발생시킵니다. extensions (e.g. 번역, 어두운 모드) SSR과 html 속성을 mutating 고객 수화. placehold.co를 사용하여 via.placeholder.com...
허용 /domain / 경로는 테마 IngressRoute에 CORS
Theme.kamocrm.com/domain/...에서 테마 구성은 일치하지 않았습니다 기존의 경로 규칙(만 /public/ 및 /internal/은 허용), 그래서 Traefik CORS 헤더가없는 503를 돌려 브라우저가 fetch를 거부합니다. PathPrefix('/domain/...
게이트웨이에서 중복 필터 및 스트립 업스트림 CORS 헤더 제거
WebConfig.java는 CorsConfig과 비교하여 두 번째 CorsFilter bean을 정의했습니다. java의 bean, 위험 중복 헤더 쓰기. 하나의 CorsFilter가 존재합니다. 앞으로 () 방법은 또한 상류에서 Access-Control-Allow-Origin을 ...
두 배 접근 통제 Allow Origin 우두머리를 일으키는 원인이 되는 CorsFilter 콩을 제거하십시오
명시된 CorsFilter bean은 두 번째 CORS 필터가 봄에 발생했습니다. Security의 내장 CORS 지원 (CORSConfigurationSource를 사용하는 경우). 두 필터는 기원 패턴을 해결하고 같은 헤더를 썼다, 생성 중복 'https://www.kamocrm.c...
Debug console.log 문 제거 및 누락된 경로 추가
WebSocket에 추가된 모든 임시 디버그 로깅 제거 ChatBox, TicketChat, MemberItem, ChatTool 및 useChatWebSocket; 추가 /help → /support 및 /settings/member → /settings/team-member에 대한 ...
긴 주소에서 열 확장에서 메시지 헤더를 방지
헤더의 왼쪽 플렉스 아이는 min-w-0이 없었다, 그래서 긴 깨지지 않는 이메일 from/To/Cc에 있는 주소는 성장하는 최소한도 내용 폭을 강제했습니다, 끌기 헤더 (과 열 레이아웃) 더 넓은. min-w-0, Break-all 추가 주소 텍스트, from/date 행에 flex-...
ToolProviders의 위 호이스트 ChatWebSocketProvider
ToolDock (과 같은 도구 창은 SupportTicketWindow → TicketChat) 나무에 ABOVE PresenceWrapper 앉아있는 ToolProviders 내부에 장착 auth/navigation 변경에 해제를 피하기 위해. ChatWebSocketProvider...
드롭 섀도 DOM 이메일 렌더링기 그래서 오버 플로우 X 자동 화재
Shadow DOM은 뿌리 원인이었습니다. 넓은 이메일 내용 (fixed-width 테이블) 그림자 나무 안쪽에 기여하지 않고 호스트를 그린 호스트의 레이아웃 상자, 그래서 부모 바디 래퍼의 오버 플로우 X 자동 오버플로를 감지하지 않고 스크롤바를 제작하지 않았습니다. 일반 div +...
Align ChatWebSocketContext 가져오기 경로에 매치 공급자
TicketChat 및 ChatNotificationListener는 컨텍스트를 통해 수입 '@/app/contexts/...' alias while PresenceWrapper (제공자) 가져오기 상대를 통해 '../contexts/...' 경로. Next.js 번들러는 이러한 것을 ...
인라인 스타일 +를 가진 힘 그림자 주인 containment는 포함합니다: 배치
그림자 호스트의 Class-based overflow-x-auto는 믿을 수 없을 것 그림자에 대하여 ':host { all: 초기 }' 리셋, 그래서 넓은 이메일 content (fixed-width table)는 호스트의 과거에 시각적으로 그림이었습니다. 레이아웃 상자와 3-colu...
Shadow DOM 내부의 넓은 이메일 내용, 외부
이전 시도 overflow-x-auto 에 빛 DOM 조상 그림자 나무의 시각 때문에 넓은 이메일 내용을 잡을 수 없습니다 페인트 오버플로우는 호스트의 레이아웃 박스에 기여하지 않습니다. 이름 * 넓은 테이블이 과거에 그려진 동안 란 폭에 체재해, 타격 외부 오버 플로우 x-숨겨진 및 ...
사용 getHasAttachments() Boolean 래퍼 유형 일치
***********는 Boolean (wrapper), 그래서 Lombok입니다 getHasAttachments()를 생성합니다. 후자의 만 primitive boolean에 대한 존재. 안전하게 취급하기 위하여 Boolean.TRUE.equals ()를 사용하십시오 null의 경우.
JPA 저장소 스캔을 확장하여 상거래 패키지를 포함
새로운 kamo-shared-library에서 가져옵니다 *********** 제품 설명 *************** (com.kamo.z.shared.commerce에서). MediaService는 donotmodify.dao.repos 만 스캔했습니다. 그리고 응용 프로그램은 시작 ...
ChatWebSocketController에서 HashMap 가져오기 복원
이전 refactor는 HashMap 가져 오기를 제거하지만 HandleTyping 여전히 태핑 이벤트 페이로드에 대한 HashMap을 구성, 원인 Forgejo는 '암호를 찾을 수 없습니다. class HashMap'.
이메일 내용에 min-w-0을 추가하십시오 div 그래서 overflow-x-auto 불
Min-w-0 없이, flex-col 아이의 과태 최소한도 폭: 자동차는 해결합니다 min-content, 넓은 이메일 테이블 확장 div 과거 열 폭. 외부 오버 플로우 x-숨겨진 다음 확장 된 div 대신 scrollbar 생산 min-width 설정:0 div를 유지 열의 할당된 ...
SendMessage에 중복 connectStomp 호출 제거
첫 번째 메시지가 새로운 세션을 만들 때, onSessionCreated update props useEffect를 트리거하여 connectStomp를 호출합니다. sendMessage의 인라인 호출 redundant 였고, useEffect 의 splitStomp에 의해 즉시 사망 할...
세션 생성에 NATS 소비자를 활성화하여 메시지 손실을 방지합니다
NATS JetStream 푸시 소비자는 STOMP 클라이언트가 만들 때만 생성되었습니다. /app/chat/subscribe를 보냈습니다. DeliverPolicy로. 새로운, 어떤 메시지가 전에 출판 소비자는 영구적으로 손실되어 있습니다. 방문자 메시지 및 이름 변경 에이전트가 먼저...
실시간 메세지를 떨어뜨리는 reconnect gap
구독 useEffect deps에서 `connected` 제거 채팅박스. 너무 이른, 모든 WebSocket reconnect 트리거 효과 unsubscribe()라고 하는 정리, 세션을 삭제 구독지도 및 /app/chat/unsubscribe를 백엔드에 전송 — NATS→STOMP 브...
시스템 사용자를 허용 org 브랜딩 및 수정 로고 auth
- canManageOrgBranding에 있는 첫번째 감시로 체계 사용자 우회를 etc로 추가하십시오 체계 사용자는 모든 non-parent orgs에 가득 차있는 브랜딩 통제가 있습니다 - bypassed의 raw org-owner-only check가 있는 uploadLogo en...