The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
204 lines
37 KiB
XML
204 lines
37 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="3626" viewBox="0 0 1200 3626" role="img">
|
|
<title>terminal evidence</title>
|
|
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
|
|
<rect x="1" y="1" width="1198" height="3624" rx="14" fill="#0d1117" stroke="#30363d"/>
|
|
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
|
|
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
|
|
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
|
|
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
|
|
<circle cx="64" cy="22" r="6" fill="#28c840"/>
|
|
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
|
|
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ set -e
|
|
set -o pipefail
|
|
S=src/messaging/messaging-security/src/main/java/dev/caskeleton/messaging/security/BrokerAclMan</tspan><tspan x="24" dy="22">ifest.java
|
|
strip() { sed -E 's#^src/[^:]*/src/(main|test)/[^:]*/([^:/]+):([0-9]+):# \1 · \2:\3 #'; }
|
|
cut_range() { awk</tspan><tspan x="24" dy="22"> -v f="$2" -v a="$3" -v b="$4" 'NR>=a && NR<=b {printf " %s:%d %s\n", f, NR, $0}' "$1"; }
|
|
|
|
printf " %s : %s 줄\n" "Bro</tspan><tspan x="24" dy="22">kerAclManifest.java" "$(wc -l < $S)"
|
|
echo "# 자바독이 적어 둔 두 검사"
|
|
cut_range $S BrokerAclManifest.java 12 20
|
|
|
|
echo
|
|
e</tspan><tspan x="24" dy="22">cho "# 그 두 성질에 대응하는 코드가 이 타입 안에 있다"
|
|
cut_range $S BrokerAclManifest.java 94 95
|
|
cut_range $S BrokerAclM</tspan><tspan x="24" dy="22">anifest.java 98 111
|
|
cut_range $S BrokerAclManifest.java 113 128
|
|
cut_range $S BrokerAclManifest.java 130 140
|
|
|
|
echo
|
|
echo "</tspan><tspan x="24" dy="22"># 간결 생성자는 그 검사를 하지 않는다"
|
|
cut_range $S BrokerAclManifest.java 81 87
|
|
|
|
echo
|
|
echo "# 그 세 메서드를 부르는 자</tspan><tspan x="24" dy="22">리 전부"
|
|
git grep -n 'requireApplicationRuntime\|destructiveGrants()\|\.undeclared(\|\.missing(' -- 'src/messaging/**/*.</tspan><tspan x="24" dy="22">java' | strip
|
|
echo " 그중 BrokerAclManifest.java 밖의 main 코드 :"
|
|
o=$(git grep -n 'requireApplicationRuntime\|destruct</tspan><tspan x="24" dy="22">iveGrants()\|\.undeclared(\|\.missing(' -- 'src/messaging/**/*.java' | grep -v '/BrokerAclManifest.java:' | grep '/main/</tspan><tspan x="24" dy="22">' || true)
|
|
if [ -z "$o" ]; then echo " 0 건"; else echo "$o" | strip; fi
|
|
|
|
echo "# 이 타입을 만들거나 받는 프로덕션 코</tspan><tspan x="24" dy="22">드"
|
|
h=$(git grep -n 'BrokerAclManifest' -- 'src/**/*.java' | grep -v '/BrokerAclManifest.java:' | grep '/main/' || true)</tspan><tspan x="24" dy="22">
|
|
if [ -z "$h" ]; then echo " main 에서 0 건"; else echo "$h" | strip; fi
|
|
echo -n " 자기 파일 밖에서 이 이름이 나오는 </tspan><tspan x="24" dy="22">파일 수 : "
|
|
git grep -l 'BrokerAclManifest' -- 'src/**/*.java' | grep -vc '/BrokerAclManifest.java' || true
|
|
git grep -l </tspan><tspan x="24" dy="22">'BrokerAclManifest' -- 'src/**/*.java' | grep -v '/BrokerAclManifest.java' | sed 's#^src/# #'
|
|
echo " 그 시험이 단언</tspan><tspan x="24" dy="22">하는 것 :"
|
|
awk 'NR>=167 && NR<=201 && (/void |assertThat/) {printf " CredentialRuntimeRegistryTest.java:%d %s\n", NR, $</tspan><tspan x="24" dy="22">0}' \
|
|
src/messaging/messaging-security/src/test/java/dev/caskeleton/messaging/security/CredentialRuntimeRegistryTest.j</tspan><tspan x="24" dy="22">ava
|
|
|
|
echo
|
|
echo "# 파괴적 권한이 값으로 표시되는 방식"
|
|
awk 'NR>=49 && NR<=66 && (/enum Operation/ || /\(true\)/ || /\(fal</tspan><tspan x="24" dy="22">se\)/) {printf " BrokerAclManifest.java:%d %s\n", NR, $0}' $S
|
|
|
|
echo
|
|
echo "# 기동 시점 검증으로 감싸인 프로파일은 셋이다</tspan><tspan x="24" dy="22">"
|
|
for f in $(git grep -l 'new StartupProfileValidation' -- 'src/**/*.java'); do
|
|
awk -v n="$(basename $f)" '/new Startu</tspan><tspan x="24" dy="22">pProfileValidation/{c=4} c&&c--{printf " %s:%d %s\n", n, NR, $0}' "$f"
|
|
done
|
|
|
|
echo
|
|
echo "# 파괴 연산 자체를 막는 다른 장</tspan><tspan x="24" dy="22">치"
|
|
git grep -n 'DestructiveMessagingAdmin' -- 'src/**/*.java' | strip
|
|
n=$(git grep -l 'implements DestructiveMessagingA</tspan><tspan x="24" dy="22">dmin' -- 'src/**/*.java' 2>/dev/null | grep -c '/main/' || true)
|
|
echo " 그 인터페이스를 구현하는 main 클래스 : ${n:-0} </tspan><tspan x="24" dy="22">건"
|
|
|
|
echo
|
|
echo "# 브로커에 권한을 질의하는 코드"
|
|
for pat in describeAcls DescribeAclsResult AclBinding createAcls AclOp</tspan><tspan x="24" dy="22">eration Authorizer listPermissions checkPermissions; do
|
|
n=$(git grep -l "$pat" -- 'src/**/*.java' 2>/dev/null | wc -l </tspan><tspan x="24" dy="22">|| true)
|
|
printf " %-22s %s 파일\n" "$pat" "$n"
|
|
done
|
|
echo " 그 0 들의 의미를 정하는 사실 — Kafka AdminClient 자체의 </tspan><tspan x="24" dy="22">소스 세트별 분포 :"
|
|
git grep -l 'org.apache.kafka.clients.admin\|AdminClient' -- 'src/**/*.java' 2>/dev/null \
|
|
| sed -</tspan><tspan x="24" dy="22">E 's#^src/[^/]*/[^/]*/src/([a-zA-Z]+)/.*# \1#' | sort | uniq -c | sed -E 's#^ *([0-9]+) +(.*)# \2 : \1 파일#' || e</tspan><tspan x="24" dy="22">cho " 0 파일"
|
|
</tspan></text>
|
|
<text x="24" y="706" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template</tspan></text>
|
|
<text x="24" y="728" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-04T01:21:20+00:00 · exit 0</tspan></text>
|
|
<line x1="24" y1="742" x2="1176" y2="742" stroke="#30363d"/>
|
|
<text x="24" y="782" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java : 141 줄</tspan></text>
|
|
<text x="24" y="804" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 자바독이 적어 둔 두 검사</tspan></text>
|
|
<text x="24" y="826" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:12 * <p>Written down so the grant can be reviewed and diffed rather than discovered from a broker</tspan></text>
|
|
<text x="24" y="848" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:13 * dump. The manifest is what the platform checks itself against at startup: a runtime that holds</tspan></text>
|
|
<text x="24" y="870" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:14 * more than it declares is a finding, because the extra permission is the one nobody reasoned</tspan></text>
|
|
<text x="24" y="892" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:15 * about.</tspan></text>
|
|
<text x="24" y="914" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:16 *</tspan></text>
|
|
<text x="24" y="936" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:17 * <p>Destructive permissions are named separately from ordinary ones. {@code DELETE_TOPIC} and</tspan></text>
|
|
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:18 * {@code PURGE} are not "write, but more"; they destroy data an application can never restore, so</tspan></text>
|
|
<text x="24" y="980" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:19 * an application runtime declaring one is rejected outright.</tspan></text>
|
|
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:20 *</tspan></text>
|
|
<text x="24" y="1024" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="1046" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 두 성질에 대응하는 코드가 이 타입 안에 있다</tspan></text>
|
|
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:94 public List<Grant> destructiveGrants() {</tspan></text>
|
|
<text x="24" y="1090" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:95 return grants.stream().filter(grant -> grant.operation().isDestructive()).toList();</tspan></text>
|
|
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:98 /**</tspan></text>
|
|
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:99 * Refuses a manifest that gives an application runtime destructive power.</tspan></text>
|
|
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:100 *</tspan></text>
|
|
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:101 * @throws MessagingConfigurationException when a destructive grant is declared</tspan></text>
|
|
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:102 */</tspan></text>
|
|
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:103 public void requireApplicationRuntime() {</tspan></text>
|
|
<text x="24" y="1244" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:104 List<Grant> destructive = destructiveGrants();</tspan></text>
|
|
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:105 if (!destructive.isEmpty()) {</tspan></text>
|
|
<text x="24" y="1288" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:106 throw new MessagingConfigurationException(</tspan></text>
|
|
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:107 "APPLICATION_HOLDS_DESTRUCTIVE_GRANT",</tspan></text>
|
|
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:108 "principal %s declares %s, which an application runtime must never hold"</tspan></text>
|
|
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:109 .formatted(principal, destructive.stream().map(Grant::operation).toList()));</tspan></text>
|
|
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:110 }</tspan></text>
|
|
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:111 }</tspan></text>
|
|
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:113 /**</tspan></text>
|
|
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:114 * Reports the permissions the runtime holds but never declared.</tspan></text>
|
|
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:115 *</tspan></text>
|
|
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:116 * <p>Excess is the finding, not the shortfall: a missing grant fails loudly on first use, while</tspan></text>
|
|
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:117 * an undeclared extra one sits unnoticed until it is abused.</tspan></text>
|
|
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:118 *</tspan></text>
|
|
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:119 * @param observed the grants the broker actually reports for this principal</tspan></text>
|
|
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:120 * @return the observed grants that this manifest does not declare</tspan></text>
|
|
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:121 */</tspan></text>
|
|
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:122 public Set<Grant> undeclared(Set<Grant> observed) {</tspan></text>
|
|
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:123 Objects.requireNonNull(observed, "observed must not be null");</tspan></text>
|
|
<text x="24" y="1662" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:124 Set<Grant> extra = new LinkedHashSet<>(observed);</tspan></text>
|
|
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:125 extra.removeAll(Set.copyOf(grants));</tspan></text>
|
|
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:126 return Set.copyOf(extra);</tspan></text>
|
|
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:127 }</tspan></text>
|
|
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:128 </tspan></text>
|
|
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:130 * Reports the declared permissions the broker does not actually grant.</tspan></text>
|
|
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:131 *</tspan></text>
|
|
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:132 * @param observed the grants the broker actually reports for this principal</tspan></text>
|
|
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:133 * @return the declared grants that are missing</tspan></text>
|
|
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:134 */</tspan></text>
|
|
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:135 public Set<Grant> missing(Set<Grant> observed) {</tspan></text>
|
|
<text x="24" y="1904" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:136 Objects.requireNonNull(observed, "observed must not be null");</tspan></text>
|
|
<text x="24" y="1926" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:137 Set<Grant> absent = new LinkedHashSet<>(grants);</tspan></text>
|
|
<text x="24" y="1948" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:138 absent.removeAll(observed);</tspan></text>
|
|
<text x="24" y="1970" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:139 return Set.copyOf(absent);</tspan></text>
|
|
<text x="24" y="1992" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:140 }</tspan></text>
|
|
<text x="24" y="2014" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2036" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 간결 생성자는 그 검사를 하지 않는다</tspan></text>
|
|
<text x="24" y="2058" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:81 public BrokerAclManifest {</tspan></text>
|
|
<text x="24" y="2080" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:82 Objects.requireNonNull(grants, "grants must not be null");</tspan></text>
|
|
<text x="24" y="2102" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:83 if (principal == null || principal.isBlank()) {</tspan></text>
|
|
<text x="24" y="2124" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:84 throw new IllegalArgumentException("principal must not be blank");</tspan></text>
|
|
<text x="24" y="2146" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:85 }</tspan></text>
|
|
<text x="24" y="2168" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:86 grants = List.copyOf(grants);</tspan></text>
|
|
<text x="24" y="2190" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:87 }</tspan></text>
|
|
<text x="24" y="2212" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2234" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 세 메서드를 부르는 자리 전부</tspan></text>
|
|
<text x="24" y="2256" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:94 public List<Grant> destructiveGrants() {</tspan></text>
|
|
<text x="24" y="2278" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:103 public void requireApplicationRuntime() {</tspan></text>
|
|
<text x="24" y="2300" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · BrokerAclManifest.java:104 List<Grant> destructive = destructiveGrants();</tspan></text>
|
|
<text x="24" y="2322" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · CredentialRuntimeRegistryTest.java:181 assertThatThrownBy(manifest::requireApplicationRuntime)</tspan></text>
|
|
<text x="24" y="2344" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test · CredentialRuntimeRegistryTest.java:200 assertThat(manifest.undeclared(Set.of(declared, extra)))</tspan></text>
|
|
<text x="24" y="2366" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그중 BrokerAclManifest.java 밖의 main 코드 :</tspan></text>
|
|
<text x="24" y="2388" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 0 건</tspan></text>
|
|
<text x="24" y="2410" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 이 타입을 만들거나 받는 프로덕션 코드</tspan></text>
|
|
<text x="24" y="2432" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main 에서 0 건</tspan></text>
|
|
<text x="24" y="2454" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 자기 파일 밖에서 이 이름이 나오는 파일 수 : 1</tspan></text>
|
|
<text x="24" y="2476" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> messaging/messaging-security/src/test/java/dev/caskeleton/messaging/security/CredentialRuntimeRegistryTest.java</tspan></text>
|
|
<text x="24" y="2498" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 시험이 단언하는 것 :</tspan></text>
|
|
<text x="24" y="2520" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:167 void anApplicationRuntimeMayNotHoldADestructiveGrant() {</tspan></text>
|
|
<text x="24" y="2542" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:181 assertThatThrownBy(manifest::requireApplicationRuntime)</tspan></text>
|
|
<text x="24" y="2564" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:187 void aGrantTheBrokerHoldsButNobodyDeclaredIsTheFinding() {</tspan></text>
|
|
<text x="24" y="2586" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> CredentialRuntimeRegistryTest.java:200 assertThat(manifest.undeclared(Set.of(declared, extra)))</tspan></text>
|
|
<text x="24" y="2608" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2630" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 파괴적 권한이 값으로 표시되는 방식</tspan></text>
|
|
<text x="24" y="2652" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:49 public enum Operation {</tspan></text>
|
|
<text x="24" y="2674" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:51 WRITE(false),</tspan></text>
|
|
<text x="24" y="2696" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:53 READ(false),</tspan></text>
|
|
<text x="24" y="2718" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:55 DESCRIBE(false),</tspan></text>
|
|
<text x="24" y="2740" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:57 CREATE(false),</tspan></text>
|
|
<text x="24" y="2762" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:59 ALTER(true),</tspan></text>
|
|
<text x="24" y="2784" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:61 DELETE(true),</tspan></text>
|
|
<text x="24" y="2806" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> BrokerAclManifest.java:63 PURGE(true);</tspan></text>
|
|
<text x="24" y="2828" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="2850" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 기동 시점 검증으로 감싸인 프로파일은 셋이다</tspan></text>
|
|
<text x="24" y="2872" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:59 return new StartupProfileValidation<>(</tspan></text>
|
|
<text x="24" y="2894" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:60 () -></tspan></text>
|
|
<text x="24" y="2916" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:61 java.util.stream.Stream.concat(</tspan></text>
|
|
<text x="24" y="2938" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> KafkaMessagingAutoConfiguration.java:62 compiled.kafkaBrokers().stream(), profiles.orderedStream())</tspan></text>
|
|
<text x="24" y="2960" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:221 return new StartupProfileValidation<>(</tspan></text>
|
|
<text x="24" y="2982" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:222 () -></tspan></text>
|
|
<text x="24" y="3004" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:223 java.util.stream.Stream.concat(compiled.security().stream(), profiles.orde</tspan><tspan x="24" dy="22">redStream())</tspan></text>
|
|
<text x="24" y="3048" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> MessagingCoreAutoConfiguration.java:224 .toList(),</tspan></text>
|
|
<text x="24" y="3070" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:55 return new StartupProfileValidation<>(</tspan></text>
|
|
<text x="24" y="3092" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:56 () -></tspan></text>
|
|
<text x="24" y="3114" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:57 java.util.stream.Stream.concat(</tspan></text>
|
|
<text x="24" y="3136" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> RabbitMessagingAutoConfiguration.java:58 compiled.rabbitBrokers().stream(), profiles.orderedStream())</tspan></text>
|
|
<text x="24" y="3158" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="3180" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 파괴 연산 자체를 막는 다른 장치</tspan></text>
|
|
<text x="24" y="3202" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · DestructiveMessagingAdmin.java:21 public interface DestructiveMessagingAdmin {</tspan></text>
|
|
<text x="24" y="3224" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · MessagingAdminService.java:21 * <p>Destructive operations live in {@link DestructiveMessagingAdmin}, a separate inter</tspan><tspan x="24" dy="22">face that an</tspan></text>
|
|
<text x="24" y="3268" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> main · MessagingAdminAutoConfiguration.java:22 * <p>{@link dev.caskeleton.messaging.admin.runtime.DestructiveMessagingAdmin}</tspan><tspan x="24" dy="22"> is deliberately</tspan></text>
|
|
<text x="24" y="3312" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 인터페이스를 구현하는 main 클래스 : 0 건</tspan></text>
|
|
<text x="24" y="3334" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
|
<text x="24" y="3356" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 브로커에 권한을 질의하는 코드</tspan></text>
|
|
<text x="24" y="3378" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> describeAcls 0 파일</tspan></text>
|
|
<text x="24" y="3400" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> DescribeAclsResult 0 파일</tspan></text>
|
|
<text x="24" y="3422" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> AclBinding 0 파일</tspan></text>
|
|
<text x="24" y="3444" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> createAcls 0 파일</tspan></text>
|
|
<text x="24" y="3466" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> AclOperation 0 파일</tspan></text>
|
|
<text x="24" y="3488" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> Authorizer 0 파일</tspan></text>
|
|
<text x="24" y="3510" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> listPermissions 0 파일</tspan></text>
|
|
<text x="24" y="3532" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> checkPermissions 0 파일</tspan></text>
|
|
<text x="24" y="3554" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> 그 0 들의 의미를 정하는 사실 — Kafka AdminClient 자체의 소스 세트별 분포 :</tspan></text>
|
|
<text x="24" y="3576" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> test : 5 파일</tspan></text>
|
|
</svg>
|