{
    "componentChunkName": "component---src-templates-plugin-docs-tsx",
    "path": "/plugins/scm-oauth2-plugin/docs/latest/SOURCECODE_STATISTIK/",
    "result": {"data":{"plugin":{"name":"scm-oauth2-plugin","displayName":"OAuth2/OIDC","description":"Authentication for SCM-Manager using OAuth2/OIDC","author":"Thorsten Ludewig","documentation":[{"version":"1.0.x","languages":["DATENSCHUTZ_FOLGEABSCHAETZUNG","PROZESS_BESCHREIBUNG","COMPLIANCE_BERICHT","SOURCECODE_STATISTIK","javadoc"]}]},"navigation":{"nodes":[]},"versions":{"group":[{"fieldValue":"1.0.x"}]},"languages":{"group":[{"fieldValue":"COMPLIANCE_BERICHT"},{"fieldValue":"DATENSCHUTZ_FOLGEABSCHAETZUNG"},{"fieldValue":"PROZESS_BESCHREIBUNG"},{"fieldValue":"SOURCECODE_STATISTIK"},{"fieldValue":"javadoc"}]},"markdownRemark":{"html":"<h1 id=\"sourcecode-statistik--scm-oauth2-plugin\" style=\"position:relative;\"><a href=\"#sourcecode-statistik--scm-oauth2-plugin\" aria-label=\"sourcecode statistik  scm oauth2 plugin permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sourcecode-Statistik — scm-oauth2-plugin</h1>\n<p><strong>Dokumentversion:</strong> 1.1 · <strong>Stand:</strong> 17.08.2026 · <strong>Softwarestand:</strong> scm-oauth2-plugin 1.0.2\n<strong>Erhebungsbasis:</strong> Arbeitskopie des Projektverzeichnisses, letzter Commit vom 10.08.2026</p>\n<p>Quantitativer Nachweis über Umfang, Testabdeckung und Dokumentationsgrad der Codebasis. Dient als\nBelegdokument für die Maßnahmen nach Art. 21 Abs. 2 lit. e und f NIS2\n(<a href=\"COMPLIANCE_BERICHT.md#3-pr%C3%BCfung-nach-nis2\">Compliance-Bericht, Abschnitt 3</a>). Alle Zahlen sind mit\nden in <a href=\"#8-reproduktion-der-messung\">Abschnitt 8</a> angegebenen Befehlen reproduzierbar.</p>\n<h2 id=\"1-umfang-auf-einen-blick\" style=\"position:relative;\"><a href=\"#1-umfang-auf-einen-blick\" aria-label=\"1 umfang auf einen blick permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. Umfang auf einen Blick</h2>\n<table>\n<thead>\n<tr>\n<th>Kennzahl</th>\n<th>Wert</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Quelldateien insgesamt (ohne generierte Artefakte)</td>\n<td>69</td>\n</tr>\n<tr>\n<td>Zeilen insgesamt</td>\n<td>8.970</td>\n</tr>\n<tr>\n<td>davon Code</td>\n<td>4.835</td>\n</tr>\n<tr>\n<td>davon Kommentar</td>\n<td>2.740</td>\n</tr>\n<tr>\n<td>davon leer</td>\n<td>1.228</td>\n</tr>\n<tr>\n<td>Java-Typen (Top-Level)</td>\n<td>40</td>\n</tr>\n<tr>\n<td>Öffentliche Member im Produktivcode</td>\n<td>71</td>\n</tr>\n<tr>\n<td>Automatisierte Tests</td>\n<td>185 (0 Fehler, 0 übersprungen)</td>\n</tr>\n<tr>\n<td>Paketgröße <code class=\"language-text\">.smp</code></td>\n<td>116 KB</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"2-verteilung-nach-bereich\" style=\"position:relative;\"><a href=\"#2-verteilung-nach-bereich\" aria-label=\"2 verteilung nach bereich permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. Verteilung nach Bereich</h2>\n<table>\n<thead>\n<tr>\n<th>Bereich</th>\n<th>Dateien</th>\n<th>Zeilen</th>\n<th>Code</th>\n<th>Kommentar</th>\n<th>Leer</th>\n<th>Kommentarquote</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Java, Produktivcode</td>\n<td>42</td>\n<td>5.236</td>\n<td>2.513</td>\n<td>2.122</td>\n<td>601</td>\n<td>45,8 %</td>\n</tr>\n<tr>\n<td>Java, Tests</td>\n<td>18</td>\n<td>2.982</td>\n<td>1.929</td>\n<td>460</td>\n<td>593</td>\n<td>19,3 %</td>\n</tr>\n<tr>\n<td>Frontend (TypeScript/TSX)</td>\n<td>6</td>\n<td>585</td>\n<td>393</td>\n<td>158</td>\n<td>34</td>\n<td>28,7 %</td>\n</tr>\n<tr>\n<td>Ressourcen (JSON, XML)</td>\n<td>3</td>\n<td>167</td>\n<td>—</td>\n<td>—</td>\n<td>—</td>\n<td>—</td>\n</tr>\n<tr>\n<td><strong>Summe</strong></td>\n<td><strong>69</strong></td>\n<td><strong>8.970</strong></td>\n<td><strong>4.835</strong></td>\n<td><strong>2.740</strong></td>\n<td><strong>1.228</strong></td>\n<td><strong>36,2 %</strong></td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"kommentarquote-ohne-lizenzkopf\" style=\"position:relative;\"><a href=\"#kommentarquote-ohne-lizenzkopf\" aria-label=\"kommentarquote ohne lizenzkopf permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Kommentarquote ohne Lizenzkopf</h3>\n<p>Jede Java- und TypeScript-Datei trägt einen 15-zeiligen AGPL-Lizenzkopf (66 Dateien = 990 Zeilen).\nOhne diesen Pflichtanteil ergibt sich der tatsächliche Dokumentationsgrad:</p>\n<table>\n<thead>\n<tr>\n<th>Bereich</th>\n<th>Fachkommentar</th>\n<th>Code</th>\n<th>Quote</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Java, Produktivcode</td>\n<td>1.492</td>\n<td>2.513</td>\n<td><strong>37,3 %</strong></td>\n</tr>\n<tr>\n<td>Frontend</td>\n<td>68</td>\n<td>393</td>\n<td>14,8 %</td>\n</tr>\n<tr>\n<td>Java, Tests</td>\n<td>190</td>\n<td>1.929</td>\n<td>9,0 %</td>\n</tr>\n</tbody>\n</table>\n<p>Der Produktivcode ist damit auf rund 3 Codezeilen mit 1 Zeile Erläuterung dokumentiert. <strong>Alle 40\nJava-Typen</strong> besitzen Javadoc; von den 71 öffentlichen Membern sind 45 dokumentiert — die\nverbleibenden sind überwiegend Injektions-Konstruktoren, deren Parameter sich unmittelbar aus\nden Feldern ergeben. Zusätzlich beschreiben zwei <code class=\"language-text\">package-info.java</code> die Gesamtarchitektur\n(180 Zeilen). Bei den Tests trägt der sprechende Methodenname den größten Teil der Dokumentation,\nergänzt um je eine Szenario-Beschreibung pro Testklasse.</p>\n<h2 id=\"3-produktivcode-nach-datei\" style=\"position:relative;\"><a href=\"#3-produktivcode-nach-datei\" aria-label=\"3 produktivcode nach datei permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3. Produktivcode nach Datei</h2>\n<table>\n<thead>\n<tr>\n<th>Datei</th>\n<th>Zeilen</th>\n<th>Aufgabe</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">TokenVerifier.java</code></td>\n<td>326</td>\n<td>Signatur- und Claim-Prüfung von ID Token und Access Token</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">OAuth2AuthenticationResource.java</code></td>\n<td>299</td>\n<td>Login- und Callback-Endpunkt, <code class=\"language-text\">state</code>-Prüfung, Nonce, Umleitungsvalidierung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">JwksClient.java</code></td>\n<td>220</td>\n<td>Abruf des JSON Web Key Sets, Rekonstruktion der öffentlichen Schlüssel</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">ConfigurationResource.java</code></td>\n<td>205</td>\n<td>REST-API der Konfiguration, Secret- und URL-Behandlung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AfterLogoutRedirectToIdp.java</code></td>\n<td>200</td>\n<td>RP-initiated Logout</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">JwsAlgorithm.java</code></td>\n<td>185</td>\n<td>Algorithmen-Allowlist mit Bindung an den Schlüsseltyp</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">OAuth2RestClient.java</code></td>\n<td>183</td>\n<td>Token-Tausch und Userinfo-Abruf</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">ForceOAuth2LoginFilter.java</code></td>\n<td>169</td>\n<td>erzwungene Anmeldung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">StateStore.java</code></td>\n<td>165</td>\n<td>offene Anmeldevorgänge: <code class=\"language-text\">state</code>, PKCE-Verifier, Nonce</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">OAuth2Configuration.java</code></td>\n<td>162</td>\n<td>Konfigurationsobjekt (21 Felder)</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">GroupSynchronizer.java</code></td>\n<td>161</td>\n<td>Gruppen und Mitgliedschaften</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">Jws.java</code></td>\n<td>159</td>\n<td>Zerlegen und Signaturprüfung eines Kompakt-JWS</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">UserInfoMapper.java</code></td>\n<td>153</td>\n<td>Claims → Benutzer und Gruppen</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">DiscoveryClient.java</code></td>\n<td>152</td>\n<td>OIDC-Discovery</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">UserMigration.java</code></td>\n<td>151</td>\n<td>Übernahme bestehender Konten</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">package-info.java</code> (Hauptpaket)</td>\n<td>139</td>\n<td>Architektur- und Ablaufübersicht</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">JwksProvider.java</code></td>\n<td>137</td>\n<td>Schlüssel-Cache mit Erneuerung bei Schlüsselrotation</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AuthenticationInfoBuilder.java</code></td>\n<td>132</td>\n<td>Orchestrierung der Anmeldung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">IndexConfigurationEnricher.java</code></td>\n<td>128</td>\n<td>Verlinkung für das Frontend</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AccessTokenRoleReader.java</code></td>\n<td>128</td>\n<td>Rollen aus dem geprüften Access Token</td>\n</tr>\n<tr>\n<td><em>weitere 22 Dateien</em></td>\n<td>je ≤ 117</td>\n<td>Endpunktauflösung, Wertobjekte, Stores, Erweiterungspunkte</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"4-struktur\" style=\"position:relative;\"><a href=\"#4-struktur\" aria-label=\"4 struktur permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>4. Struktur</h2>\n<table>\n<thead>\n<tr>\n<th>Merkmal</th>\n<th>Anzahl</th>\n<th>Bestandteile</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Erweiterungspunkte des Kerns (<code class=\"language-text\">@Extension</code>)</td>\n<td>6</td>\n<td>Shiro-Realm, <code class=\"language-text\">GroupResolver</code>, <code class=\"language-text\">LogoutRedirection</code>, Index-Enricher, <code class=\"language-text\">ExternalAuthenticationAvailableNotifier</code>, Guice-Modul</td>\n</tr>\n<tr>\n<td>Servlet-Filter (<code class=\"language-text\">@WebElement</code>)</td>\n<td>1</td>\n<td><code class=\"language-text\">ForceOAuth2LoginFilter</code></td>\n</tr>\n<tr>\n<td>JAX-RS-Ressourcen</td>\n<td>2</td>\n<td>Authentifizierung, Konfiguration</td>\n</tr>\n<tr>\n<td>REST-Endpunkte</td>\n<td>4</td>\n<td>2 × anonym (Login, Callback), 2 × rechtegeschützt (Konfiguration lesen/schreiben)</td>\n</tr>\n<tr>\n<td>Konfigurationsfelder</td>\n<td>21</td>\n<td>siehe <a href=\"../README_de.md#konfiguration\">README</a></td>\n</tr>\n<tr>\n<td>Berechtigungen</td>\n<td>2</td>\n<td><code class=\"language-text\">configuration:read:oauth2</code>, <code class=\"language-text\">configuration:write:oauth2</code></td>\n</tr>\n<tr>\n<td>Persistente Speicher</td>\n<td>2</td>\n<td><code class=\"language-text\">config/oauth2.xml</code>, <code class=\"language-text\">var/data/oauth2Groups/</code></td>\n</tr>\n<tr>\n<td>Flüchtige Speicher</td>\n<td>3</td>\n<td><code class=\"language-text\">StateStore</code> (10 min), <code class=\"language-text\">IdTokenStore</code> (12 h), <code class=\"language-text\">JwksProvider</code> (1 h, keine personenbezogenen Daten)</td>\n</tr>\n<tr>\n<td>Frontend-Komponenten</td>\n<td>4</td>\n<td>Login-Formular, Navigationslink, Konfigurationsseite, Konfigurationsformular</td>\n</tr>\n<tr>\n<td>Übersetzungsschlüssel</td>\n<td>57 je Sprache</td>\n<td>Deutsch und Englisch, vollständig paritätisch</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"5-tests\" style=\"position:relative;\"><a href=\"#5-tests\" aria-label=\"5 tests permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>5. Tests</h2>\n<p>185 Tests in 17 Klassen, alle grün, keine übersprungen. Verhältnis Testcode zu Produktivcode:\n<strong>1.929 : 2.513 Zeilen = 0,77 : 1</strong>.</p>\n<table>\n<thead>\n<tr>\n<th>Testklasse</th>\n<th>Tests</th>\n<th>Prüfschwerpunkt</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">GroupNameSanitizerTest</code></td>\n<td>35</td>\n<td>Namensnormalisierung, Gegenprüfung gegen die Namensvalidierung des Kerns</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">TokenVerifierTest</code></td>\n<td>28</td>\n<td>Signatur- und Claim-Prüfung gegen echte RSA-, EC- und HMAC-Signaturen</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">GroupSynchronizerTest</code></td>\n<td>22</td>\n<td>Anlage, Mitgliedschaften, Robustheit bei Einzelfehlern</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">OAuth2AuthenticationResourceTest</code></td>\n<td>16</td>\n<td><code class=\"language-text\">state</code>-Bindung, Einmaligkeit, Umleitungsziele, PKCE, Nonce, Fehlerbehandlung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">ConfigurationResourceTest</code></td>\n<td>13</td>\n<td>Secret write-only, URL-Validierung, Pflichtfelder</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AccessTokenRoleReaderTest</code></td>\n<td>9</td>\n<td>JSON-Pfade; keine Rollen ohne geprüftes Token</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">JwksClientTest</code></td>\n<td>8</td>\n<td>Rekonstruktion von RSA- und EC-Schlüsseln, Überspringen unbrauchbarer Schlüssel</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">UserMigrationTest</code></td>\n<td>9</td>\n<td>Kontoübernahme, Erhalt gespeicherter Attribute</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">UserInfoMapperTest</code></td>\n<td>7</td>\n<td>Claim-Auswertung, <code class=\"language-text\">sub</code>-Fallback, ungültige E-Mail</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">ForceOAuth2LoginFilterTest</code></td>\n<td>7</td>\n<td>Durchlass, gefälschtes Cookie, XHR-Behandlung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AdminGroupSynchronizerTest</code></td>\n<td>7</td>\n<td>Zuweisung und Entzug des Administratorrechts</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">StateStoreTest</code></td>\n<td>5</td>\n<td>Einmaligkeit, Ablauf, Eindeutigkeit</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">JwksProviderTest</code></td>\n<td>5</td>\n<td>Schlüssel-Cache, Erneuerung bei Schlüsselrotation, Ratenbegrenzung</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">EndpointResolverTest</code></td>\n<td>5</td>\n<td>manuelle Konfiguration, Discovery, Cache-Verhalten</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AfterLogoutRedirectToIdpTest</code></td>\n<td>4</td>\n<td>Logout-URL mit und ohne <code class=\"language-text\">id_token_hint</code></td>\n</tr>\n<tr>\n<td><code class=\"language-text\">DiscoveryClientTest</code></td>\n<td>3</td>\n<td>Normalisierung der Discovery-URL</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">AuthenticationInfoBuilderTest</code></td>\n<td>2</td>\n<td>Zusammenspiel aller Anmeldeschritte; kein Aufbewahren eines ungeprüften ID Tokens</td>\n</tr>\n<tr>\n<td>Frontend (Jest)</td>\n<td>1</td>\n<td>Testinfrastruktur</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Abdeckung der Schutzmaßnahmen:</strong> Für jede der 19 im\n<a href=\"COMPLIANCE_BERICHT.md#24-sicherheit-der-verarbeitung-art-32\">Compliance-Bericht</a> genannten\nMaßnahmen existiert mindestens ein Test oder eine strukturelle Zusicherung; die sicherheitsnahen\nTests machen mit 96 Fällen (<code class=\"language-text\">TokenVerifierTest</code>, <code class=\"language-text\">OAuth2AuthenticationResourceTest</code>,\n<code class=\"language-text\">JwksClientTest</code>, <code class=\"language-text\">ForceOAuth2LoginFilterTest</code>, <code class=\"language-text\">ConfigurationResourceTest</code>, <code class=\"language-text\">StateStoreTest</code>,\n<code class=\"language-text\">JwksProviderTest</code>, <code class=\"language-text\">AdminGroupSynchronizerTest</code>, <code class=\"language-text\">UserMigrationTest</code>) rund 52 % der Testfälle aus.</p>\n<p>Die Signaturprüfung wird nicht gegen Mocks getestet, sondern gegen <strong>echte Signaturen</strong>: die Tests\nerzeugen RSA- und EC-Schlüsselpaare, signieren die Tokens selbst und bauen den JSON Web Key Set\ndazu nach (<code class=\"language-text\">TestTokens</code>). Damit sind auch die Angriffsfälle abgedeckt — <code class=\"language-text\">alg: none</code>, fremder\nSchlüssel, fremdes Secret, manipulierte Signatur, fremder Aussteller, fremde Audience, abgelaufenes\nToken, falscher und fehlender Nonce.</p>\n<h2 id=\"6-abhängigkeiten-und-lieferkette\" style=\"position:relative;\"><a href=\"#6-abh%C3%A4ngigkeiten-und-lieferkette\" aria-label=\"6 abhängigkeiten und lieferkette permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>6. Abhängigkeiten und Lieferkette</h2>\n<table>\n<thead>\n<tr>\n<th>Ebene</th>\n<th>Umfang</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Laufzeit (Java)</td>\n<td><strong>keine eigenen Abhängigkeiten</strong> — der <code class=\"language-text\">dependencies</code>-Block ist leer; genutzt werden ausschließlich die vom SCM-Manager-Kern bereitgestellten Bibliotheken (Shiro, Jackson, Guava, Guice, JAX-RS). Die Signaturprüfung ist bewusst mit den Krypto-Primitiven des JDK umgesetzt (<code class=\"language-text\">java.security</code>, <code class=\"language-text\">javax.crypto</code>) statt mit einer JWT-Bibliothek, damit diese Eigenschaft erhalten bleibt</td>\n</tr>\n<tr>\n<td>Build (Java)</td>\n<td><code class=\"language-text\">org.scm-manager.smp</code> 0.18.0, Ziel-Kernversion 3.9.0, Lombok 1.18.46 (bewusst auf eine JDK-taugliche Version fixiert), MapStruct über das smp-Plugin</td>\n</tr>\n<tr>\n<td>Frontend</td>\n<td>19 Laufzeit- und 19 Entwicklungsabhängigkeiten laut <code class=\"language-text\">package.json</code>, 1 Resolution; alle aus dem SCM-Manager-UI-Ökosystem bzw. dem React-Umfeld</td>\n</tr>\n<tr>\n<td>Lizenz</td>\n<td>AGPL-3.0-only; Lizenzkopf in allen 66 Java- und TypeScript-Dateien sowie in <code class=\"language-text\">permissions.xml</code>, geprüft durch <code class=\"language-text\">./gradlew checkLicenses</code></td>\n</tr>\n</tbody>\n</table>\n<p>Die leere Laufzeit-Abhängigkeitsliste ist für die Lieferkettensicherheit (Art. 21 Abs. 2 lit. d\nNIS2) der wesentliche Punkt: das Plugin vergrößert die Angriffsfläche des Kerns nicht um\nzusätzliche Fremdbibliotheken.</p>\n<h2 id=\"7-artefakte-und-historie\" style=\"position:relative;\"><a href=\"#7-artefakte-und-historie\" aria-label=\"7 artefakte und historie permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>7. Artefakte und Historie</h2>\n<table>\n<thead>\n<tr>\n<th>Artefakt</th>\n<th>Wert</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Plugin-Paket <code class=\"language-text\">scm-oauth2-plugin.smp</code></td>\n<td>116 KB</td>\n</tr>\n<tr>\n<td>API-Dokumentation <code class=\"language-text\">docs/javadoc</code></td>\n<td>47 HTML-Seiten, 67 Dateien, 920 KB</td>\n</tr>\n<tr>\n<td>Betriebsdokumentation</td>\n<td><code class=\"language-text\">README.md</code> (englisch), <code class=\"language-text\">README_de.md</code> (deutsch), inhaltlich paritätisch</td>\n</tr>\n<tr>\n<td>Compliance-Dokumentation</td>\n<td>4 Dokumente in <code class=\"language-text\">docs/</code></td>\n</tr>\n<tr>\n<td>Commits</td>\n<td>9 Commits bis 10.08.2026 plus die Änderungen des Release 1.0.2</td>\n</tr>\n<tr>\n<td>Freigaben</td>\n<td>Tag <code class=\"language-text\">v1.0.1</code>, Release 1.0.2 vom 17.08.2026</td>\n</tr>\n<tr>\n<td>Qualitätssicherung im Build</td>\n<td><code class=\"language-text\">checkLicenses</code>, <code class=\"language-text\">validate</code>, <code class=\"language-text\">validatePluginJson</code>, <code class=\"language-text\">test</code>, <code class=\"language-text\">ui-test</code>, Javadoc ohne Warnungen</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"8-reproduktion-der-messung\" style=\"position:relative;\"><a href=\"#8-reproduktion-der-messung\" aria-label=\"8 reproduktion der messung permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>8. Reproduktion der Messung</h2>\n<p>Alle Zahlen dieses Dokuments entstehen aus der Arbeitskopie. Ausführung im Plugin-Verzeichnis:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Zeilen je Bereich</span>\n<span class=\"token function\">find</span> src/main/java <span class=\"token parameter variable\">-name</span> <span class=\"token string\">'*.java'</span> <span class=\"token operator\">|</span> <span class=\"token function\">wc</span> <span class=\"token parameter variable\">-l</span>\n<span class=\"token function\">find</span> src/main/java <span class=\"token parameter variable\">-name</span> <span class=\"token string\">'*.java'</span> <span class=\"token parameter variable\">-exec</span> <span class=\"token function\">cat</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> + <span class=\"token operator\">|</span> <span class=\"token function\">wc</span> <span class=\"token parameter variable\">-l</span>\n\n<span class=\"token comment\"># Klassifikation Code / Kommentar / Leerzeile</span>\n<span class=\"token function\">find</span> src/main/java <span class=\"token parameter variable\">-name</span> <span class=\"token string\">'*.java'</span> <span class=\"token parameter variable\">-exec</span> <span class=\"token function\">cat</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> + <span class=\"token operator\">|</span> <span class=\"token function\">awk</span> <span class=\"token string\">'\n  BEGIN{code=0;com=0;blank=0;inblock=0}\n  {\n    line=$0; gsub(/^[ \\t]+|[ \\t]+$/,\"\",line);\n    if (inblock) { com++; if (line ~ /\\*\\//) inblock=0; next }\n    if (line == \"\") { blank++; next }\n    if (line ~ /^\\/\\*/) { com++; if (line !~ /\\*\\//) inblock=1; next }\n    if (line ~ /^\\/\\//) { com++; next }\n    if (line ~ /^\\*/)  { com++; next }\n    code++\n  }\n  END{printf \"code=%d comment=%d blank=%d\\n\", code, com, blank}'</span>\n\n<span class=\"token comment\"># Testanzahl und Ergebnis</span>\n./gradlew <span class=\"token builtin class-name\">test</span>\n<span class=\"token function\">grep</span> <span class=\"token parameter variable\">-h</span> <span class=\"token parameter variable\">-o</span> <span class=\"token string\">'tests=\"[0-9]*\"'</span> build/test-results/test/*.xml <span class=\"token operator\">|</span> <span class=\"token function\">awk</span> -F<span class=\"token string\">'\"'</span> <span class=\"token string\">'{s+=$2} END {print s}'</span>\n\n<span class=\"token comment\"># Struktur</span>\n<span class=\"token function\">grep</span> <span class=\"token parameter variable\">-rl</span> <span class=\"token string\">\"@Extension\"</span> src/main/java <span class=\"token parameter variable\">--include</span><span class=\"token operator\">=</span><span class=\"token string\">'*.java'</span> <span class=\"token operator\">|</span> <span class=\"token function\">grep</span> <span class=\"token parameter variable\">-v</span> package-info <span class=\"token operator\">|</span> <span class=\"token function\">wc</span> <span class=\"token parameter variable\">-l</span>\n<span class=\"token function\">grep</span> <span class=\"token parameter variable\">-cE</span> <span class=\"token string\">\"^  private (String|boolean) \"</span> src/main/java/de/l9g/scm/oauth2/plugin/OAuth2Configuration.java\n\n<span class=\"token comment\"># Artefakte</span>\n./gradlew smp <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">ls</span> <span class=\"token parameter variable\">-lh</span> build/libs/*.smp\n./gradlew javadoc <span class=\"token parameter variable\">-Pstage</span><span class=\"token operator\">=</span>release <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">find</span> docs/javadoc <span class=\"token parameter variable\">-type</span> f <span class=\"token operator\">|</span> <span class=\"token function\">wc</span> <span class=\"token parameter variable\">-l</span></code></pre></div>\n<p><strong>Methodische Hinweise:</strong> Die Klassifikation ist zeilenbasiert und ordnet eine Zeile mit Code und\nnachgestelltem Kommentar dem Code zu; Kommentare innerhalb von Zeichenketten werden nicht erkannt\n(im vorliegenden Code nicht vorhanden). Generierte Artefakte (<code class=\"language-text\">build/</code>, <code class=\"language-text\">node_modules/</code>,\n<code class=\"language-text\">docs/javadoc/</code>) sind in den Zeilenzahlen der Abschnitte 1 bis 3 nicht enthalten.</p>\n<hr>\n<p><strong>Weiterführend:</strong> <a href=\"/66f566365a7b7d96ac97a1fc2225bcc5/PROZESS_BESCHREIBUNG.md\">Prozessbeschreibung</a> ·\n<a href=\"/ecfb48f1b860871431a8d921521c8fd4/COMPLIANCE_BERICHT.md\">Compliance-Bericht</a> ·\n<a href=\"/2b8b96ac9620994e713b5a4607d53444/DATENSCHUTZ_FOLGEABSCHAETZUNG.md\">Datenschutz-Folgenabschätzung</a></p>","description":"Sourcecode-Statistik — scm-oauth2-plugin Dokumentversion: 1.1 · Stand: 17.08.2026 · Softwarestand: scm-oauth2-plugin 1.0.2\nErhebungsbasis: Arbeitskopie des…","tableOfContents":"<ul>\n<li>\n<p><a href=\"#sourcecode-statistik--scm-oauth2-plugin\">Sourcecode-Statistik — scm-oauth2-plugin</a></p>\n<ul>\n<li>\n<p><a href=\"#1-umfang-auf-einen-blick\">1. Umfang auf einen Blick</a></p>\n</li>\n<li>\n<p><a href=\"#2-verteilung-nach-bereich\">2. Verteilung nach Bereich</a></p>\n<ul>\n<li><a href=\"#kommentarquote-ohne-lizenzkopf\">Kommentarquote ohne Lizenzkopf</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"#3-produktivcode-nach-datei\">3. Produktivcode nach Datei</a></p>\n</li>\n<li>\n<p><a href=\"#4-struktur\">4. Struktur</a></p>\n</li>\n<li>\n<p><a href=\"#5-tests\">5. Tests</a></p>\n</li>\n<li>\n<p><a href=\"#6-abh%C3%A4ngigkeiten-und-lieferkette\">6. Abhängigkeiten und Lieferkette</a></p>\n</li>\n<li>\n<p><a href=\"#7-artefakte-und-historie\">7. Artefakte und Historie</a></p>\n</li>\n<li>\n<p><a href=\"#8-reproduktion-der-messung\">8. Reproduktion der Messung</a></p>\n</li>\n</ul>\n</li>\n</ul>","frontmatter":{"title":"","subtitle":null,"description":null,"keywords":null,"displayToc":null,"image":null}}},"pageContext":{"name":"scm-oauth2-plugin","slug":"/plugins/scm-oauth2-plugin/docs/1.0.x/SOURCECODE_STATISTIK/","version":"1.0.x","latestVersion":"1.0.x","latestPageVersion":"1.0.x","language":"SOURCECODE_STATISTIK","canonicalPath":"/plugins/scm-oauth2-plugin/docs/latest/SOURCECODE_STATISTIK/","latestRootPath":"/plugins/scm-oauth2-plugin/docs/1.0.x/SOURCECODE_STATISTIK/"}},
    "staticQueryHashes": ["1973669194","2742214048","2956773653","2957019495","698804963"]}