Skip to content

Commit d9c9cf0

Browse files
committed
fix
1 parent b30fed7 commit d9c9cf0

4 files changed

Lines changed: 95 additions & 41 deletions

File tree

.github/scripts/process-case-issue.mjs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,60 @@ try {
4545
process.exit(1)
4646
}
4747

48+
/**
49+
* Wraps a plain string value into LocalizedString.
50+
* If the value is already localized ({ ko, en }), returns it as-is.
51+
*/
52+
function toLocalizedString(value) {
53+
if (value && typeof value === 'object' && ('ko' in value || 'en' in value)) {
54+
return value
55+
}
56+
return { ko: String(value ?? ''), en: '' }
57+
}
58+
59+
/**
60+
* Wraps a plain string array into LocalizedStringArray.
61+
* If the value is already localized ({ ko, en }), returns it as-is.
62+
*/
63+
function toLocalizedStringArray(value) {
64+
if (value && typeof value === 'object' && !Array.isArray(value)) {
65+
return value
66+
}
67+
return { ko: Array.isArray(value) ? value : [], en: [] }
68+
}
69+
70+
/**
71+
* Normalizes a raw issue JSON draft into the Accident type shape,
72+
* wrapping Korean-only fields into LocalizedString / LocalizedStringArray.
73+
*/
74+
function normalizeAccident(raw) {
75+
return {
76+
...raw,
77+
companyName: toLocalizedString(raw.companyName),
78+
leaks: toLocalizedStringArray(raw.leaks),
79+
tags: toLocalizedStringArray(raw.tags),
80+
rootCauses: toLocalizedStringArray(raw.rootCauses),
81+
causeAnalyses: Array.isArray(raw.causeAnalyses)
82+
? raw.causeAnalyses.map((step) => ({
83+
...step,
84+
content: toLocalizedString(step.content),
85+
}))
86+
: [],
87+
prevention: {
88+
personal: toLocalizedStringArray(raw.prevention?.personal),
89+
corporate: toLocalizedStringArray(raw.prevention?.corporate),
90+
},
91+
}
92+
}
93+
4894
mkdirSync(DATA_DIR, { recursive: true })
4995

5096
const accidentId = randomUUID()
5197
const filename = `${accidentId}.json`
5298

5399
const accident = {
54100
id: accidentId,
55-
...draft,
101+
...normalizeAccident(draft),
56102
createdAt: new Date().toISOString(),
57103
issueUrl,
58104
}

.github/workflows/case-submission.yml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ jobs:
3737
echo "exists=false" >> "$GITHUB_OUTPUT"
3838
fi
3939
40-
- name: Setup Node
41-
if: steps.check.outputs.exists == 'false'
42-
uses: actions/setup-node@v4
43-
with:
44-
node-version: 24
45-
4640
- name: Create branch
4741
if: steps.check.outputs.exists == 'false'
4842
run: |
@@ -57,6 +51,18 @@ jobs:
5751
ISSUE_URL: ${{ github.event.issue.html_url }}
5852
run: node .github/scripts/process-case-issue.mjs
5953

54+
- name: Setup Bun
55+
if: steps.check.outputs.exists == 'false'
56+
uses: oven-sh/setup-bun@v2
57+
58+
- name: Install dependencies
59+
if: steps.check.outputs.exists == 'false'
60+
run: bun install --frozen-lockfile
61+
62+
- name: Type check
63+
if: steps.check.outputs.exists == 'false'
64+
run: bunx tsc --noEmit -p apps/front/tsconfig.json
65+
6066
- name: Commit and push
6167
if: steps.check.outputs.exists == 'false'
6268
id: commit

apps/front/data/8870baf6-a1b2-4589-af16-b402da248ae6.json

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,57 @@
11
{
22
"id": "8870baf6-a1b2-4589-af16-b402da248ae6",
3-
"companyName": "쿠팡",
3+
"companyName": { "ko": "쿠팡", "en": "Coupang" },
44
"date": "2025-11-19",
55
"country": "KR",
66
"cause": "insider",
77
"damage": {
88
"value": 3370,
99
"unit": ""
1010
},
11-
"tags": [
12-
"침해사고분석",
13-
"개인정보보호",
14-
"보안거버넌스"
15-
],
16-
"leaks": [
17-
"이름",
18-
"이메일",
19-
"주소",
20-
"전화번호",
21-
"최근 주문 이력. 공동현관 출입 비밀번호"
22-
],
11+
"tags": {
12+
"ko": ["침해사고분석", "개인정보보호", "보안거버넌스"],
13+
"en": ["Incident Analysis", "Personal Data Protection", "Security Governance"]
14+
},
15+
"leaks": {
16+
"ko": ["이름", "이메일", "주소", "전화번호", "최근 주문 이력", "공동현관 출입 비밀번호"],
17+
"en": ["Name", "Email", "Address", "Phone Number", "Recent order history", "Shared entrance door password"]
18+
},
2319
"causeAnalyses": [
2420
{
25-
"content": "탈취한 보안 키를 이용해 쿠팡 데이터 베이스에 최초 비인가 접근 시작",
21+
"content": {
22+
"ko": "탈취한 보안 키를 이용해 쿠팡 데이터베이스에 최초 비인가 접근 시작",
23+
"en": "Initial unauthorized access to Coupang database using stolen security key"
24+
},
2625
"date": "2025-06-24"
2726
},
2827
{
29-
"content": "쿠팡 보안팀 이상 접근을 감지",
28+
"content": {
29+
"ko": "쿠팡 보안팀 이상 접근을 감지",
30+
"en": "Coupang security team detects abnormal access"
31+
},
3032
"date": "2025-11-18"
3133
},
3234
{
33-
"content": "대규모 유출 공식 공표일 및 대국민 사과 공지",
35+
"content": {
36+
"ko": "대규모 유출 공식 공표 및 대국민 사과 공지",
37+
"en": "Official announcement of large-scale data breach and public apology"
38+
},
3439
"date": "2025-11-29"
3540
}
3641
],
37-
"rootCauses": [
38-
"권한 관리 프로세스의 부재",
39-
"데이터 암호화 미비",
40-
"이상 징후 탐지 시스템(FDS) 오작동"
41-
],
42+
"rootCauses": {
43+
"ko": ["권한 관리 프로세스의 부재", "데이터 암호화 미비", "이상 징후 탐지 시스템(FDS) 오작동"],
44+
"en": ["Lack of access management process", "Insufficient data encryption", "Malfunction of anomaly detection system (FDS)"]
45+
},
4246
"prevention": {
43-
"personal": [
44-
"비밀번호 재설정 및 2단계 인증(2FA) 설정",
45-
"출처 불분명한 링크 주의"
46-
],
47-
"corporate": [
48-
"퇴사 처리와 동시에 모든 클라우드 보안 키 및 VPN 접근 권한 즉시 회수",
49-
"데이터를 볼 수 있는 권한을 세분화 하고 민감 정보 접근 시 2차 인증 의무화",
50-
"제로 트러스트(Zero Trust) 도입"
51-
]
47+
"personal": {
48+
"ko": ["비밀번호 재설정 및 2단계 인증(2FA) 설정", "출처 불분명한 링크 주의"],
49+
"en": ["Reset password and enable two-factor authentication (2FA)", "Be cautious of links from unknown sources"]
50+
},
51+
"corporate": {
52+
"ko": ["퇴사 처리와 동시에 모든 클라우드 보안 키 및 VPN 접근 권한 즉시 회수", "데이터를 볼 수 있는 권한을 세분화하고 민감 정보 접근 시 2차 인증 의무화", "제로 트러스트(Zero Trust) 도입"],
53+
"en": ["Immediately revoke all cloud security keys and VPN access upon employee departure", "Granularize data access permissions and mandate secondary authentication for sensitive data access", "Implement Zero Trust architecture"]
54+
}
5255
},
5356
"createdAt": "2026-05-14T01:57:39.158Z",
5457
"issueUrl": "https://github.com/dev-five-git/security-log/issues/7"

apps/front/src/static/accidents-data.generated.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
// AUTO-GENERATED FILE — do not edit by hand.
22
// Regenerated by .github/workflows/case-submission.yml when a new case is submitted.
33

4+
import accident3 from '../../data/67fcc242-f755-4c2c-bc9e-0ca952e1edb2.json'
45
import accident0 from '../../data/073ea6d3-0ea9-424c-a026-b525dd9cf7be.json'
56
import accident1 from '../../data/210fba9e-936a-45a5-8bd6-f6e5baf8e4e7.json'
6-
import accident2 from '../../data/67050736-cc5b-4955-a5d6-28157e1eaf4f.json'
7-
import accident3 from '../../data/67fcc242-f755-4c2c-bc9e-0ca952e1edb2.json'
8-
import accident4 from '../../data/701994cf-6327-4a39-9bba-2777a479fe8e.json'
97
import accident5 from '../../data/8870baf6-a1b2-4589-af16-b402da248ae6.json'
8+
import accident4 from '../../data/701994cf-6327-4a39-9bba-2777a479fe8e.json'
9+
import accident2 from '../../data/67050736-cc5b-4955-a5d6-28157e1eaf4f.json'
1010
import accident6 from '../../data/a01de281-92f3-4868-8415-9c12a1acfb0e.json'
1111
import accident7 from '../../data/c7fac9c5-898e-4219-8420-d4d29dcefa02.json'
1212
import accident8 from '../../data/e0e87a0d-39ce-46c7-bb79-ba2e023c0431.json'
13-
1413
import type { Accident } from './accidents'
1514

1615
export const ACCIDENT_DATA: Accident[] = [

0 commit comments

Comments
 (0)