TopLogic - the automated application engine
  • Releases
  • Dokumentation
  • Github
  • Discord
  1. Home
  2. Releases
  3. TL_8.0.0-alpha9
  4. #29637

8.0.0-alpha9
TopLogic Release

2026-10-01

enhancement

major
#27490
Historie begrenzen/abschneiden/aufräumen
#29004
Allow to use a virus scanner for uploads
#29006
Uniqueness constraint
#29421
Add a React calendar view control and declarative <calendar> UIElement.
#29429
Complete the view designer so a view can be built with it end to end
#29462
React: Generisches Formularelement zum Bearbeiten von Konfigurationen
#29487
React view: <form> exposes neither column count nor label position, and there is no <group> element
#29499
Hinweis auf den Wartungsmodus in der React-Oberfläche
#29507
Hinweis auf den bevorstehenden Session-Timeout in der React-Oberfläche
#29523
<sidebar> exposes two of the five sidebar item kinds ReactSidebarControl renders, and none of the badge
#29525
Offer the app-bar user menu in the core view layer
#29528
Let the UI theme follow the system's dark/light preference
#29529
Stellvertreter als explizite Sicherheitsaktion im Einstellungsdialog der TL Views benennen (mit Passwortbestätigung, auch für die Passwortänderung)
#29530
URL routing in TL Views: model objects in route parameters, drill-down path in the URL, query bindings
#29531
Filterleiste für Tabellen: Presets, Freitextsuche über die sichtbaren Spalten und benutzereigene gespeicherte Filter
#29532
Object navigation in TL Views: display targets, a reveal protocol for containers, and a show-object action
#29540
Usability feedback on the user menu and the personal settings dialog
#29542
TL Views: channel-bound value inputs for every primitive and reference type, with a submit hook
#29543
TL Views: conditional branches in a generic-command action chain
#29544
TL Views table: row activation by double-click or Enter, and a grouping UI over the existing table model
#29545
TL Views table: drag and drop of rows between tables and onto rows
#29546
TL Views: colors for enumeration literals and classifier objects rendered as pills, and a progress control
#29547
Generierte React-Bundles nicht mehr einchecken
#29548
React view UI: URL, e-mail and phone attributes are edited as typed inputs and displayed as links
#29551
TL Views: only registered entry points may be loaded top-level via URL
#29557
React view commands: the ExecutableState reason of a disabled command never reaches the client, and there is no disabled-if rule beside visible-if
#29567
TL Views: Mehrfachauswahl für Tabellen und Bäume (selection-mode="multi")
#29575
TL Views: UI-Inspektor – Zustand eines Elements der React-Oberfläche einsehen (z. B. durch Zugriffsrechte ausgeblendete Tabellenzeilen) und als Skript-Zusicherung aufzeichnen
#29596
TL Views: Gestaltungsoptionen für app-spezifische Oberflächen (css-class, Text-Varianten, Layout-Optionen, Anzeigevarianten für Eingaben, Theme-Tokens)
#29597
TL Views: object-list als generischer Repeater (Elemente ohne Container, Raster-Layout, Index für gestaffelte Animation)
#29598
TL Views: image mit URL-/Ressourcen-Quelle, Seitenverhältnis, Füllmodus und überlagerten Inhalten; avatar mit Foto
#29599
TL Views: Wizard-/Stepper-Element für mehrstufige Dialogflüsse (statische und dynamische Schritte, Fortschritt, Übergänge, Auto-Weiter)
#29600
TL Views: Anzeige lang laufender Server-Aufträge (Phasen, Fortschritt, unbestimmter Fortschritt, verstrichene Zeit)
#29601
TL Views: Anzeige von HTML-Inhalten und HTML-Dokumenten (Agenten-Antworten, Exposés) mit Vorschau und Druck/PDF
#29603
Physisches Löschen gelöschter Objekte aus versionierten Tabellen (Purge): Abschlussmenge über Pflichtreferenzen und Inhalte, optionale Verweise werden geleert
#29605
TL Views table filter bar: an initially active preset, and the active preset and search term as channels for query bindings
#29607
TL Views: a display target reveals a tab inside a pushed frame (a <show> is located within the view shown before it)
#29608
TL Views: value-input mit Platzhalter, zugänglicher Name bei verborgenem Label, bedingte Anzeige von Elementen mit visible-if
#29615
TL Views: a <form> spanning a page does not take part in the fill contract, so a split panel or filling panel inside it is sized by its content
#29617
Design System: Tokens and base classes as own package (wave 0)
#29625
TL Views: a page layout of weighted columns (main 2/3, side 1/3) that reflows to one column on a narrow viewport; the split-panel keeps its sashes and clips the side pane at 400 px
#29629
TL Views: `<show-view>` / `<show-views>` actions reveal a mounted view by name and write its channels from a command chain without a model object
#29630
TL Views: a chunked, transactional job body for <start-job> - scripted init / elements / steps / finish, one transaction per chunk, per-item retry and skip, phases and progress derived from the steps
#29637
Modellbasierte Berechtigungsdefinition: Zugriffselternobjekt (Delegation der Zugriffsentscheidung an Container oder Referenz, Standard für Kompositionsteile, Entscheidungs-Cache je Interaktion), Rollenelternobjekt statt Security-Parent, Vollständigkeitsprüfung und Assistent
#29640
TL Views: Gruppen einer gruppierten Tabelle werden nach dem Komparator der Gruppierungsspalte sortiert, nicht in zufälliger Reihenfolge
#29641
TL Views: Der React-TL-Script-Editor zeigt Hilfetexte zu Funktionen und Modellelementen an (Kontexthilfe zur Vervollständigung, Hover-Tooltips) und springt beim Tippen nicht mehr an den Textanfang
#29643
TL Views: Anpassung der React-Oberfläche an das Corporate Design eines Kunden mit eigener React-Komponentenbibliothek (Leitfaden und fehlende Erweiterungspunkte)
#29671
TL Views: Drag & Drop in Tabellen nach Regeln einschränken, mit Rückmeldung pro Ziel während des Ziehens
#29681
TL-Script modifiedRevision() berücksichtigt Referenz- und Übersetzungsänderungen; Attribut-Storages "touchen" das Besitzerobjekt nicht mehr
#29690
Option zum Deaktivieren des Browserstarts beim Hochfahren
#29706
Speed up slow unit tests in tl-core and tl-element
minor
#28324
Create documentation for layout overlays
#29500
No way to show a master-detail as an overlay: the detail always costs the list half its width
#29506
A dashboard tile cannot be the entry point it looks like: neither <tile> nor <card> carries an action
#29550
React controls do not consume the theme's radius and surface tokens consistently; a flat theme needs per-component CSS overrides
#29553
React view <table>: <column> has no width, every column defaults to 150 px, so a table with more than six columns overflows a 940 px pane
#29611
TL Views: `<notify>` action shows a translated notice in a generic-command chain (snackbar or OK dialog, optionally stopping the chain); `<throw-error>` removed
#29624
SSO-Login ohne registrierten Benutzeraccount: konfigurierbare Hinweisseite (ApplicationPages.unknownAccountPage) statt Login-Maske, mit Standardseiten für die klassische und die React-Oberfläche
#29670
TL-Script: Funktionen trim, trimStart und trimEnd entfernen Leerraum am Anfang und Ende einer Zeichenkette
#29675
TL Views: Anlegen und Löschen richten sich nach den Modell-Zugriffsrechten, statt erst nach dem Ausfüllen mit „Kopieren nicht erlaubt“ abgelehnt zu werden
#29683
TL-Script: htmlText(html) cannot carry images, so an HTML text with <img> referencing files cannot become a structured text

defect

critical
#29665
TL Views: a click into a rich-text field with a hidden label focuses the editor's Bold button, so the typed text is lost
#29682
TL Views: ConcurrentModificationException in ReactToolbarControl.replaceGroups on a page reload shows the "Internal error" page
major
#25723
Missing check against attribute name clashes during inheritance
#29438
React view layer displays date attributes in a hard-wired format instead of the annotated one
#29474
Neither React drag handle shields the page (or locks the cursor) while dragging
#29502
<tree> does not follow model changes: a delete never arrives, a create collapses the whole tree
#29504
Zwangsabmeldung erreicht die React-Oberfläche nicht
#29509
Die Cookie-Prüfung weist den erneuten Aufruf ihrer eigenen URL ab und meldet dabei die Sitzung ab
#29512
Attribute in tl.model, die de-facto mandatory sind, auch als mandatory deklarieren
#29533
TL Views: executability rules and derived channels must follow changes of the object on a channel, not only of the channel value
#29534
TL Views tile-stack: frames get no definite height, and a frame that is uncovered again is rebuilt from scratch
#29535
TL Views table: a selection channel value that is not among the rows must not be cleared by the table
#29541
Single-valued drop-down select shows two clear buttons
#29554
React view <table>: Spalten für beliebige Zeilenobjekte – berechnete Spalten, eingebettete Spalten referenzierter Objekte, dynamische Spalten; transiente Zeilen
#29556
react-api/tooltip runs without a TLSubSessionContext: a cell tooltip over a derived attribute using label() answers HTTP 500 (NullPointerException in Label.eval)
#29560
React view <upload-command>: Fehler beim Upload (Ausnahme in der Aktionskette, überschrittenes Größenlimit) erreichen den Benutzer nicht; Upload-Größenlimit konfigurierbar
#29562
security.xml grants for a SecurityScopeService scope are lost on the start that introduces the scope: AccessConfigurationSetupService imports before the scope exists and stores the file hash anyway
#29564
SecurityConfigurationService: an application cannot add a role to a framework type's grant — a <class> grant is keyed by operation and replaces the earlier entry, silently revoking the framework's roles
#29568
TL Views: Eine ohne Anmeldung aufgerufene Route geht beim Login verloren
#29573
TestReactStylesheetTokens fails on master: the pill and progress rules of tlReactControls.css do not keep the theme-token contract
#29574
TL Views: Veto eines verschachtelten Channel-Schreibzugriffs bricht die Benachrichtigung des äußeren Channels ab (Tabelle und Detailbereich bleiben nach "Verwerfen" auf dem alten Objekt)
#29576
React-Controls-Bundle enthält eine zweite React-Instanz (createPortal-Import in TLDropdownSelect)
#29586
tl-layout-react test compilation fails on master: TestSelectValueObservation and TestResourceCellObservation use the DefaultReactContext constructor that #29552 removed
#29590
React view: Mehrwertige String-Werte werden in Tabellenzellen und Anzeigefeldern ohne Trennzeichen aneinandergehängt
#29602
TL Views: a URL adopted into an existing session keeps the slot content of the sidebar item that was active before
#29604
ElementSecurityUpdateManager: quadratic collection diff on commit (AbstractSet.removeAll over a List) makes appending to a large reference take seconds
#29609
TL Views: a `<progress>` (ChannelObjectObserver) evaluates its expression on a deleted object and logs an ERROR when an observed object is deleted
#29610
TL Views: a table on an inactive tab shows stale cell values after the displayed objects changed, until its rows are refreshed
#29613
TL Views: a `<dashboard>` tile gets no definite height, so a table in a tile grows with its rows instead of scrolling
#29618
TL Views: a URL switches the sidebar away from an item with unsaved changes without asking
#29619
TL Views: a warning-level configuration constraint is dropped, so the model editor shows nothing
#29620
TL Views: a tree node is never a link to where its object is displayed, although the display targets declare one
#29622
TL Views: a `<flow-diagram selection="ch">` writes its channel but does not follow it, so a node selected elsewhere is not marked in the diagram
#29623
Build: the translate goal re-translates committed German messages after a pull or branch switch when the doclet did not run in the same build
#29626
TL Views: a panel toolbar has no overflow mode; at 400 px width the ticket page's six commands run 908 px wide, three of them unreachable, and the panel title is pushed out
#29627
TL Views table: an I18NString cell wraps its text and is clipped mid-glyph by the 36 px row instead of ending in an ellipsis; header labels are cut without an ellipsis
#29631
TL Views: Escape closes a <window> dialog while a <start-job> it started is still running; the job runs on with nothing left to show or cancel it
#29634
TL Views: the configuration editor builds a text field for a property whose format is parse-only, so selecting a derived attribute in the model editor fails with "There is no normative way to serialize a locator configuration"
#29635
TL Views: a <tree> renders every node as a link, so a click on the label navigates away instead of just selecting the node
#29639
TL-Script objectResolve(id, typeOrTable): resolution via a type including its subtypes or via a table name, objectTable delivers the table of an object, and an object the current user may not read is not resolved
#29644
Inkrementelle Security unvollständig bei Verwendung von scripted-steps
#29648
TL Views: Die über ClientResources ausgelieferten Skripte und Stylesheets tragen keine Version in der URL, der Browser verwendet nach einer Aktualisierung veraltete Client-Dateien
#29649
TL Views: a job's final state is overwritten by a stale "running" snapshot, so <job-status> shows a completed job as running
#29666
TL Views: leaving a frame by breadcrumb, Back, navigate-pop, show-object or logout discards a form's unsaved changes without asking
#29667
TL Views: a form in edit mode keeps showing stale values after a command committed a change to the same object
#29672
TL Views: initial-edit-mode, an object switch and the edit-mode channel enter edit mode without asking <edit-executability>
#29674
TL Views: after a page load, app-bar command labels appear in the browser's language instead of the user's ("Record" in a German session)
#29677
TL Views: a card in a content-sized column stack shrinks below its content; a table beside it takes more height than it reports
#29678
BoundHelper: Einstellung use-default-security-parent entfernen – ohne konfigurierte Security-Parent-Regel hat ein Objekt keinen Security-Parent
#29680
Classic UI: the anonymous session is offered the developer options and can run "Ressourcen neu laden"
#29698
CollectionUtil.removeDuplicates() verliert die Reihenfolge der Elemente
#29705
Workspace/PathInfo: web-fragment.war eines Moduls wird nicht gefunden, wenn Jar und Fragment aus verschiedenen lokalen Maven-Repositories aufgelöst werden (maven.repo.local.tail)
minor
#27889
Switch to SNAPSHOT version does not work
#28474
Background colors of the buttons are not consistent
#29496
React table: a column resize is rejected with "Integer value expected" and the new width is lost when the client sends a fractional width
#29497
React UI tooltips: clipped table cells and column headers, compact toolbar buttons and attribute descriptions get tooltips; native title attributes replaced by bridge tooltips
#29503
TLResourceCell ships no CSS: icon and label touch wherever a resource cell shows both
#29505
Panel header changes height when its toolbar has no commands, so master-detail headers do not line up
#29508
Weitere QueryExecutor bedürfen keiner Security
#29552
TLPhotoViewer fetches its image after the control was disposed when a <switch> replaces it (404 on react-api/data, "Command target NOT FOUND" WARN)
#29555
TL-Script label(<constant>) is folded at compile time: the result is fixed to the compiling thread's locale instead of the reading user's
#29558
XMLInstanceImporter silently imports an internationalized attribute given as value="…" as empty, even when the attribute is mandatory
#29561
TL Views: display of a referenced object does not follow a change of its label (table cell, form field)
#29563
Standardgruppe: das persistierte Gruppen-Flag "defaultGroup" wird aus der Konfiguration abgeleitet statt in der Datenbank gespeichert; Semantik der Standardgruppe dokumentiert
#29591
ResKey.decode akzeptiert in #(…)-Literalen nur doppelt gequotete Übersetzungen — #('Travel'@en) schlägt fehl, obwohl TL-Script beide Quote-Arten erlaubt
#29606
TL Views: a `<color token>` naming a token the React theme does not emit renders the pill untinted, silently
#29628
TL Views: "Reset personal settings" clears the stored configuration, but the running session keeps its table state and writes it back; the declared column widths return only after a new login
#29636
TL Views: a click on a <tree> node clears the selection channel before setting it, so every dependent display and command flips to empty and back
#29663
TL Views: a <form> no longer insets itself; a <fields> grid inside a form got the page inset twice
#29664
TL Views: the form's Edit, Save, Cancel and Apply commands are labelled with a trailing period ("Bearbeiten.", "Speichern.")
#29668
TL Views: the rich-text editor's toolbar overflows a narrow field; table and undo/redo buttons are cut off
#29669
A request with a malformed query string ("?q=50%") is answered with an "Internal error" page (HTTP 500) instead of 400
#29673
TL Views: personalization commands ("Layout bearbeiten", "Diesen Filter speichern") are offered to the anonymous session
#29676
TL Views admin: deleting an account logs "Target object is deleted" from the still-open account form; delete asks for no confirmation
#29679
TL Views: a command refused by its executability rule is reported with the title "Interner Fehler"

task

minor
#29612
FAQ: Migration guide for upgrading an application from TL 7.11 to 8.0
#29702
Mindestversion von Maven im Build auf 3.8.9 anheben
enhancement

major

#29637

Modellbasierte Berechtigungsdefinition: Zugriffselternobjekt (Delegation der Zugriffsentscheidung an Container oder Referenz, Standard für Kompositionsteile, Entscheidungs-Cache je Interaktion), Rollenelternobjekt statt Security-Parent, Vollständigkeitsprüfung und Assistent

ReactUI

Kontext

Mit der modellbasierten Berechtigung (SecurityConfigurationService, ModelAccessRights) braucht jeder Fachtyp eine vollständige Berechtigungsdefinition, sonst sind seine Objekte für normale Nutzer nicht zugreifbar:

  • eine Rollenregel im AccessManager (<role-rules>), die auf Objekten des Typs Rollen liefert, oder
  • eine Rollenelternregel (<security-parents>; bisher „Security-Parent“ genannt), die festlegt, an welchem anderen Objekt die Rollen geprüft werden,
  • und eine Freigabe (<grant>) im SecurityConfigurationService, die einer dieser Rollen die Operation (mindestens Read) auf dem Typ erlaubt.

Fehlt die Rollenquelle, fällt ein Objekt höchstens auf die globale Security-Root zurück (nur wenn use-default-security-parent aktiv ist, was standardmäßig nicht der Fall ist), d.h. es ist nur noch für Inhaber von Root-Rollen sichtbar. Fehlt die Freigabe, ist das Objekt für keinen Benutzer zugreifbar. Diese Definitionen sind mühsam anzulegen, verteilen sich auf mehrere Konfigurationsabschnitte, und es ist schwer zu prüfen, ob sie für alle Typen einer Anwendung vollständig sind. Ein vergessener Typ fällt erst auf, wenn ein Nutzer ihn nicht sieht.

Die Vollständigkeitsprüfung hat zudem eine Lücke im Konzept sichtbar gemacht: In der alten Welt, in der Zugriffsrechte an Sichten definiert waren, wurden viele Objekte nie nach einem Zugriffsrecht gefragt, weil nur der Code sie handhabte. Jetzt braucht jeder Zugriff eine Freigabe – auch für die vielen Hilfstypen (Zeilen von Kompositionstabellen, Kommentare, Anhänge, …), die nie als eigenständige Objekte angezeigt werden. Ein Rollenelternobjekt reicht für sie nicht aus: Es vererbt nur die Rollen, so dass jeder dieser Typen trotzdem eigene, redundante Freigaben braucht.

Verbesserung

Neues Konzept: Zugriffselternobjekt (access-parent). Ein Typ mit Zugriffselternobjekt hat keine eigene Berechtigungsdefinition: keine Freigaben, keine Kennzeichen, keine Rollen. Ob ein Benutzer ein Objekt des Typs lesen, schreiben oder exportieren darf, ist die Frage, ob er dasselbe mit dem Zugriffselternobjekt darf; Anlegen und Löschen eines Objekts ist Schreiben des Zugriffselternobjekts. Anlegen ohne Kontext (das Muster „transient anlegen, dann persistent kopieren“ des Sichtsystems) ist nicht beschränkt: Das Objekt ist unzugreifbar, bis es in einen Container gelegt wird, und das ist ein Schreiben des Containers, das für sich geprüft wird. Das Zugriffselternobjekt kann seinerseits delegieren; die Kette wird zur Laufzeit verfolgt. Ein Objekt, dessen Beziehung ins Leere führt, ist nicht zugreifbar; eine zyklische Kette wird abgelehnt (und als Fehler protokolliert). Attributfreigaben (<part>) eines delegierenden Typs werden gegen die Rollen am Ende der Kette geprüft. Spezialisierungen erben die Einstellung, sofern sie keine eigene haben.

  • Definition am <class>-Eintrag des SecurityConfigurationService: Die Art der Beziehung wird explizit angegeben (access-parent), die Referenz getrennt davon (access-reference). Die Navigationsrichtung wird nicht mehr aus der Form der Referenz geraten, so dass auch eine einwertige Komposition, die ein Typ zugleich besitzt und in der er liegt, eindeutig ist:
    • access-parent="container" ohne Referenz: der Container, welche Komposition das Objekt auch hält – der Standard für Kompositionsteile, explizit angegeben.
    • access-parent="container" access-reference="demo.tickets:Ticket#comments": der Container, nur wenn er das Objekt über diese Komposition hält (rückwärts navigiert).
    • access-parent="target" access-reference="demo.tickets:Reminder#ticket": das Ziel einer einwertigen Referenz des Typs (vorwärts navigiert); die Referenz ist Pflicht.
    • access-parent="self": keine Delegation – der Typ entscheidet über eigene Freigaben und Rollen. Schaltet den Standard für Kompositionsteile ab und hebt ein von einer Generalisierung geerbtes Zugriffselternobjekt auf.
    • access-parent="auto" (Standard, entfällt im XML): die Einstellung der Generalisierungen, sonst der Standard für Kompositionsteile.

Eine Referenz, die nicht zur Art passt (keine Komposition, die den Typ hält, für container; keine einwertige Referenz des Typs für target; überhaupt eine Referenz für self/auto), ist ein Konfigurationsfehler. Ein Eintrag, der ein delegierendes Zugriffselternobjekt (container, target) mit Freigaben oder Kennzeichen kombiniert, wird beim Start und vom Editor abgelehnt (Constraint AccessParentStandsAlone); target ohne Referenz meldet der Editor über AccessReferenceRequired. Die Auswahlliste des Editors (AccessReferenceOptions) bietet je nach Art die Kompositionen, die Objekte des Typs halten, bzw. die einwertigen Referenzen des Typs, jeweils mit dem besitzenden Typ beschriftet (TLPartInOwnerResourceProvider).

  • Standard für Kompositionsteile: Ein Typ, dessen Objekte in einer Komposition liegen und für den weder eine (auch geerbte) Rollenregel noch eine Rollenelternregel gilt, der nicht gekennzeichnet ist und keine eigene oder geerbte access-parent-Einstellung hat, delegiert an seinen Container – welche Komposition ihn auch hält (TLObject#tContainer()). Die meisten Hilfstypen einer Anwendung brauchen damit keinerlei Konfiguration. Jede explizite Definition schaltet den Standard für den Typ ab. access-parent="container" ist nötig für Kompositionsteile, die eine Rollenregel erben, aber trotzdem delegieren sollen (die Prüfung meldet dann die überdeckten Regeln), target für Typen, die über eine einwertige Referenz erreicht werden, und self für Kompositionsteile, die selbst entscheiden – etwa mit eigenen Freigaben und direkt an ihren Objekten vergebenen Rollen, die für den Standard nicht als Rollenquelle zählen.
  • Cache: Jede Entscheidung von isAllowed wird je Interaktion (Request) im AccessDecisionCache am InteractionContext gemerkt, Schlüssel: Person, Objekt, Operation. Eine Kompositionstabelle mit 200 Zeilen, die alle an einen Container delegieren, kostet eine echte Prüfung des Containers. Der Cache wird ersetzt, sobald die Knowledge-Base eine neuere Revision hat, damit ein Kommando, das committet und dann rendert, keine Entscheidungen von vor seiner Änderung wiederverwendet. Der Cache erkennt auch Zyklen: Eine Entscheidung wird während der Berechnung markiert; erreicht eine Kette von Zugriffselternobjekten die Markierung erneut, wird abgelehnt.
  • Umbenennung: Das bisherige „übergeordnete Sicherheitsobjekt“ (Security-Parent) heißt in Oberfläche, Befunden und Dokumentation jetzt Rollenelternobjekt (role parent), weil es Rollen vererbt, nicht die Zugriffsentscheidung. Konfigurations-Tag (<security-parents>) und Java-API (BoundObject#getSecurityParents()) behalten ihren Namen.

Die Anwendung prüft die Vollständigkeit ihrer Berechtigungsdefinition selbst, und die Definition lässt sich aus der Administration heraus vervollständigen. Die Definitionen bleiben Konfiguration (Rollenregeln und Rollenelternregeln in der AccessManager-Konfiguration, Freigaben, Kennzeichen und Zugriffselternobjekte im SecurityConfigurationService).

Analyse. Für jeden konkreten Typ des Anwendungsmodells wird ermittelt:

  • Keine Rollenquelle: weder eine (auch geerbte) Rollenregel noch eine Rollenelternregel gilt für den Typ, und keine Komposition hält seine Objekte. Der Befund nennt, ob der Rückfall auf die Security-Root aktiv ist. (Eine direkte Rollenzuweisung an Objekten ist Daten, keine Definition, und zählt hier nicht.)
  • Keine Lesefreigabe: für den Typ (bzw. sein Modul, bzw. geerbt) ist keine Read-Freigabe konfiguriert.
  • Wirkungslose Freigabe: eine freigegebene Rolle kann weder auf dem Typ noch auf einem Typ, zu dem seine Rollenelternpfade führen, jemals gehalten werden – weder durch eine Rollenregel noch durch eine direkte Rollenzuweisung an einem Objekt dieses Typs (statisch über die Zieltypen der Pfade berechnet; ein statisch nicht auflösbarer Pfad erzeugt keinen Befund).
  • Überdeckte Regeln: der Typ hat ein konfiguriertes Zugriffselternobjekt, aber es gelten Rollenregeln oder Rollenelternregeln für ihn; sie sind wirkungslos.

Ein Typ mit Zugriffselternobjekt (konfiguriert oder Standard) hat den Status „Delegiert“ und keine weiteren Befunde; ob das Elternobjekt zugreifbar ist, meldet dessen Typ. Die Befunde zu fehlender Rollenquelle und fehlender Lesefreigabe weisen darauf hin, dass ein nur vom Code der Anwendung verwendeter Typ als internal zu kennzeichnen ist.

Ausgenommene Typen. Ein Typ, der als without-security konfiguriert ist, und ein Typ, der als internal konfiguriert ist (Attribut an <class> und <module> im SecurityConfigurationService; vererbt sich auf Spezialisierungen), erhält keine Befunde und den Status „Ausgenommen“. internal kennzeichnet Typen, deren Objekte nur vom Code der Anwendung verwendet werden – transient oder in einem Kontext ohne Zugriffsprüfung –, so dass kein Benutzer eine Rolle auf ihnen benötigt; die Zugriffsprüfung selbst ändert sich nicht, und ein interner Typ delegiert nicht. So gekennzeichnet sind die Module tl.login und tl.admin (tl-layout-view), tl.changelog und tl.imagegallery (tl-element) sowie tl.devtools (tl-dev-tools).

Meldung beim Start. Der Dienst SecurityCoverageCheck (in tl-element konfiguriert, Erweiterung des AccessManager, startet also mit ihm) führt die Analyse beim Start aus und protokolliert je Befund eine Zeile sowie eine Zusammenfassung (n types analysed, m with findings) – auf der Stufe INFO, da die Test-Infrastruktur für Anwendungen Warnungen beim Start als Fehler wertet; die aktiven Hinweise sind der Reiter „Abdeckung“ und der wiederverwendbare Test. Konfiguration: excluded-modules (Module, die bewusst ohne Definition bleiben) und log-findings (Standard true).

Administrationssicht. Im React-Administrationsbereich hat der Abschnitt „Zugriffskontrolle“ den Reiter „Abdeckung“: eine Tabelle aller analysierten Typen, nach Modul gruppiert (die Modulspalte selbst ist zunächst ausgeblendet), mit den Spalten Typ (Objektreferenz mit Icon), Status (Icon: Haken = abgedeckt, Pfeil = delegiert, Warndreieck = unvollständig, Strich = ausgenommen), leseberechtigte Rollen (Objektreferenzen), Rollenregeln, Rollenelternobjekte (Pfad, ^ markiert einen rückwärts navigierten Schritt) und Zugriffselternobjekt („Container (Standard)“, „Container“ für den konfigurierten Container oder die navigierte Referenz); die Spalte Befunde ist über die Spaltenauswahl einblendbar; sortier- und filterbar. Rechts die Detailansicht „Befunde“: für einen delegierenden Typ ein Absatz, wohin er delegiert, sonst die Befunde als Liste von Problemen mit ihren Lösungen; darunter „Geltende Regeln“: die Rollenregeln und Rollenelternregeln, die für den Typ gelten, mit Art, Id, Beschreibung und der Angabe, ob die Anwendungskonfiguration sie definiert.

Bearbeiten der Definition. Die Kommandos der Detailansicht schreiben in die Konfigurationsdateien der Anwendung (WEB-INF/autoconf/com.top_logic.tool.boundsec.manager.AccessManager.config.xml und …SecurityConfigurationService.config.xml, geschichtet über die Basiskonfiguration, nie überschreibend): „Rollenelternobjekt…“ und „Rollenregel…“ (Dialog mit Konfigurationsformular über eine NavigationRuleConfig bzw. RoleRuleConfig, Typ vorbelegt), „Zugriffsrechte…“ (Konfigurationsformular über den <class>-Eintrag der Anwendungsdatei: Freigaben/Entzüge, die Kennzeichen, die Art des Zugriffselternobjekts und die Zugriffsreferenz mit Auswahlliste der zur Art passenden Referenzen) und „Zugriffsrechte des Moduls…“ (<module>-Eintrag), „Als intern kennzeichnen“ und „Ohne Zugriffskontrolle“ (bestätigte Umschalter; Setzen eines Kennzeichens verwirft das andere und ein delegierendes Zugriffselternobjekt), „Regel bearbeiten…“ und „Regel löschen“ in der Regelliste (eine Regel der Basiskonfiguration kann bearbeitet, d.h. per Id überlagert, aber nicht gelöscht werden). Gespeicherte Änderungen wirken nicht sofort; ein Hinweis zeigt sie an, bis „Konfiguration anwenden“ die Konfiguration neu liest und SecurityConfigurationService und AccessManager (samt abhängiger Dienste) neu startet, wonach die Analyse den neuen Stand zeigt.

Konfigurationseditor. Der Konfigurationseditor des React-Sichtsystems (<config-form>, tl-layout-configedit) bietet jetzt auch für Eigenschaften mit einer @Options-Annotation mit nicht-identischer Abbildung (Typnamen, Rollennamen, TLModelPartRef, CommandGroupReference mit @Options an der Wertklasse) eine Auswahlliste an: das Auswahlmodell übersetzt zwischen gespeichertem Wert und Option in beide Richtungen; mehrwertige und abgebildete Auswahlen nutzen das Dropdown-Steuerelement mit Filter. Außerdem:

  • Der Editor folgt dem dynamischen Modus einer Eigenschaft (@DynamicMode), wie es das klassische Formular tut: eine unsichtbare Eigenschaft wird ausgeblendet (das Feld samt Beschriftung bzw. die Gruppe einer Liste oder eines Unterelements), eine deaktivierte oder unveränderliche nimmt keine Eingaben an. So erscheint die Zugriffsreferenz nur für container und target, und die Freigaben verschwinden bei without-security.
  • Optionen, die aus anderen Eigenschaften berechnet werden, lädt das Dropdown neu, sobald sich diese ändern – auch wenn die Liste zuvor schon geöffnet war.
  • Ein Formular ohne eigenen Bearbeitungsmodus (withEditMode="false", so die Dialoge der Abdeckung) prüft seine Felder bei jeder Änderung und zeigt Befunde am Feld, statt erst beim Speichern abzulehnen. Ein unberührtes Formular zeigt keine Befunde.

Test für Anwendungen. Der wiederverwendbare Test test.com.top_logic.element.boundsec.manager.coverage.TestSecurityCoverage schlägt fehl, sobald ein Typ einen Befund hat, und listet alle Befunde. Eine Anwendung schaltet ihn in ihrer *.test.config.xml ein: {{{#!xml <config config:interface="test.com.top_logic.element.util.ElementTestCollector$GlobalConfig" test-security-coverage="true"/> }}}

Lösung

  • tl-core: TLClassAccessRights#getAccessParent() (access-parent, Enum AccessParentKind: auto, container, target, self; Constraint AccessParentStandsAlone) und TLClassAccessRights#getAccessReference() (access-reference, TLModelPartRef, Auswahl je nach Art über AccessReferenceOptions, Beschriftung TLPartInOwnerResourceProvider, nur für container/target sichtbar über AccessParentKind.ReferenceMode, Constraint AccessReferenceRequired); Wert AccessParent (Container – als Standard container() oder konfiguriert anyContainer() –, Komposition rückwärts, Referenz vorwärts; resolve(TLObject)); ModelAccessRights#getAccessParent(TLClass); SecurityConfigurationService löst die Einstellungen beim Start auf und prüft die Referenz gegen die Art (inkl. Vererbung an Spezialisierungen, die self beendet, Index der Kompositionsziele), entscheidet in isAllowed/isAllowedCreate/getAccessibleTypes per Delegation und merkt sich Entscheidungen im AccessDecisionCache (je Interaktion, revisionsgebunden, Zykluserkennung); AccessManager#hasRoleSource(TLClass) als Hook für den Standard (Basisimplementierung true, d.h. kein impliziter Standard ohne Regelwerk). TypeBasedAccessRights#isInternal() (internal) neben without-security, beide mit Settern; ModelAccessRights#isInternal(TLClass). com.top_logic.util.autoconf.InAppServiceConfigStore – Lesen/Schreiben einer Dienstkonfiguration im Autoconf-Ordner (Datei je Dienst, Override-Markierung optional), ausgelagert aus TLSaveServiceConfigHandler, der es nun verwendet; OverrideConfigurationWriter liegt im selben Paket.
  • tl-element: ElementAccessManager#hasRoleSource (Rollenregel oder Rollenelternregel gilt); Paket com.top_logic.element.boundsec.manager.coverage: SecurityCoverageAnalysis (Berechnung über Modell, aufgelöste Rollenregeln ElementAccessManager#getRules(TLClass), Rollenelternregeln über ElementAccessManager#getRoleParentRules(TLClass), Freigaben ModelAccessRights#getAllowedRoles, Zugriffselternobjekt ModelAccessRights#getAccessParent und die direkten Rollenzuweisungen der Datenbank je Typ), Ergebnis TypeCoverage mit CoverageStatus (COVERED, DELEGATED, EXEMPT, INCOMPLETE) und CoverageFindings (FindingKind: NO_ROLE_SOURCE, NO_READ_GRANT, DEAD_GRANT, SHADOWED_RULES); SecurityCoverageCheck (Startdienst, @ServiceExtensionPoint(AccessManager.Module)); CoverageStatusResourceProvider (Icons); SecurityDefinitionEditor (Bearbeitung der Autoconf-Einträge: Regeln per Id, Freigabeeinträge per Name, Kennzeichen, setAccessParent(TLClass, AccessParentKind, TLModelPartRef); apply() = Konfiguration neu laden und Dienste neu starten). NavigationRule kennt seine Id, RoleProvider seine Konfigurations-Id und seinen Pfad; PathNavigation legt Referenz und Richtung offen; NavigationRuleConfig/PathElementConfig erhalten Setter.
  • tl-layout-configedit: ConfigSelectFieldModel mit OptionMapping; ConfigControlService#isSelect akzeptiert abgebildete Optionen und @Options an der Wertklasse (ConfigPropertyOptions#optionsAnnotation); abgebildete und mehrwertige Auswahlen über ReactDropdownSelectControl. ConfigEditorControl folgt @DynamicMode über ConfigPropertyOptions#modeProvider (Feld über ReactFormFieldChromeControl#setVisible, Gruppe über ReactControl#setHidden, Editierbarkeit des Feldmodells); ConfigFormControl prüft auch mit Commands.NONE bei jeder Feldänderung.
  • tl-layout-react: ReactDropdownSelectControl verwirft die geladene Optionsliste, wenn das Modell neue Optionen meldet (solange es angezeigt wird); TLFormGroup wertet hidden aus; ReactFormFieldChromeControl#isVisible().
  • tl-layout-view: admin/access-control/coverage.view.xml mit SecurityCoverageTable (typbasierte Objektspalten über den ColumnProviderService, Gruppierung nach Modul, Spalte Zugriffselternobjekt, Kanäle für Auswahl, Typ, Befunde und geltende Regeln, die nach einem Neuaufbau der Zeilen erneut geschrieben werden), SecurityCoverageAction (Analyse) und SecurityDefinitionAction (Bearbeiten: Regeln anlegen/bearbeiten/speichern/löschen, Zugriffsrechte, Kennzeichen, Anwenden); Dialoge coverage-role-parent-rule, coverage-role-rule, coverage-access-rights; Reiter in admin.view.xml. FieldControlService#createDisplayControl(ColumnType) zeigt Werte eines Objekttyps ohne deklarierendes Attribut wie Referenzattribute; AttributeOptions#isStructuralSelect(TLType).
  • Tests: TestAccessParentCheck (Delegation an Container, Kette, konfigurierte Elternobjekte rückwärts/vorwärts, Anlegen/Löschen als Schreiben, Attributprüfung, Zyklus, zugreifbare Typen), TestSecurityCoverageAnalysis (u.a. konfigurierter Container, eindeutige Richtung bei einer rekursiven Komposition, self gegen den Standard und gegen ein geerbtes Zugriffselternobjekt), TestSecurityCoverageCheck, TestSecurityCoverageDirectRoleAssignment, TestSecurityDefinitionEditor (tl-element, gegen das Testmodell TestSecurityCoverage); TestConfigControlService, TestConfigSelectFieldModel, TestConfigEditorControl (dynamischer Modus), TestConfigFormControl (Prüfung ohne Bearbeitungsmodus) (tl-layout-configedit); TestSelectValueObservation (nachgeladene Optionen, tl-layout-react).
  • tl-demo-react: Rolle demo.react.ProjectReader (Gruppe users) auf ProjectScope und demo.tickets:Ticket, Read/Write-Freigaben für die Module tl.demo.projectManagement und demo.tickets; Milestone, Ticket, Note, Comment und Attachment delegieren als Kompositionsteile ohne eigene Konfiguration an ihren Container.
  • FAQ docs/faq/access-configuration.md: Zugriffselternobjekt (Syntax mit access-parent und access-reference), Standard für Kompositionsteile, Cache, Rollenelternobjekt.

Hinweis: Jede Anwendung protokolliert nach dem Update beim Start je Typ mit unvollständiger Berechtigungsdefinition eine INFO-Zeile. Typen ohne Berechtigungsbedarf werden mit internal="true" gekennzeichnet, ganze Module alternativ über excluded-modules des SecurityCoverageCheck ausgenommen. Verhaltensänderung: Objekte eines Kompositionsteil-Typs ohne Rollenquelle waren bisher für jeden normalen Benutzer unzugreifbar; sie folgen jetzt der Zugriffsentscheidung ihres Containers. Ein Typ, der das nicht soll, erhält access-parent="self" (mit eigenen Freigaben), eine Rollenregel, eine Rollenelternregel oder das Kennzeichen internal.

  • Get Started
  • Github
  • Discord
  • Das Unternehmen hinter TopLogic
  • Softwareentwicklung heute
  • Kontakt

© Copyright – Business Operation Systems GmbH

  • top-logic.com
  • Nutzungsbedingungen
  • Impressum
  • Rechtlicher Hinweis
  • Datenschutz
  • DE
  • Login