Repository navigation
RFC: Privacy Data Types - #11818
RFC: Privacy Data Types#11818chfsx wants to merge 7 commits into
Conversation
|
Jour Fixe, 27 JUL 2026: Fabian gave an overview on the pull request and the concept behind the privacy data types. He highly appreciates to get feedback from authorities and the TB about this proposal to implement a general infrastructure for a ‚privacy by design‘ approach in ILIAS. |
|
VOTING In other words, whether you generally
That gives us an idea of how we should proceed from here. |
|
Hi @chfsx, thanks for your contribution. First: I am not a GDPR expert, I am just a developer with an opinion :-). So for this review I'll leave any GDPR angle aside for now (or at least I try to). I'm not in a position to judge that properly. Accordingly, I won't give a 👍 or 👎 on the voting criteria yet either. This comment is only about the technical proposal. Once people with data-protection expertise have given feedback here and decisions have been made (also by the Technical Board and the Jour Fixe), I'll follow up with more feedback from the domain perspective.
Best regards, |
|
I like to point to the remark of @selyesa in the feature wiki about the position of the privacy experts group. The Technical Board supports the further use of specific data types over primitive data types in general. The premise, if such leads to an expectation that authorities will be required to review pull requests at no cost, communicated by a society organ, is part of an ongoing discussion and cannot be answered here. |
…umentation from their use
…th a technical requirement
39fabc6 to
bd1f72e
Compare
|
@mjansenDatabay the audit trail is removed entirely. Cost: wrapping and resolving is below half a microsecond per row (100 000 rows); the MyStaff list only resolves the address when an address column is shown. The description above is updated to the current state: the privacy documentation is now generated from the use of the types in the code, see the Maps example there. |
What this does
Personal data is wrapped in privacy data types (
ILIAS\Data\Privacy). A wrapped value knows where it came from and hands out the raw value only throughresolve(), stating a technical requirement: store it, present it, export it, hand it to another component, process it.Each technical requirement carries the phrases a reader of the privacy documentation needs, and they are required:
scripts/Privacy/generate-privacy-docs.phpcollects these calls statically (PHPStan) and renders aPRIVACY_DATA.mdper component with the sections of How to write a PRIVACY.md: one sentence per distinct set of phrases, e.g. "If the person has published it in their profile, the postal address is presented on the public profile of the person to persons who can see the public profile, to show the profile the person has published." Nothing is written by hand; when the code changes, the documentation changes with it. The file is generated alongside the handwrittenPRIVACY.md, grows with every type, and is meant to replace it once it covers everything; until the authority of a component switches, the handwritten file stays authoritative.Data that belongs together is grouped: a compound type holds several fields (
PostalAddress), a bundle holds several types (the profile of a user). A component defines its own personal data in a source catalogue next to its code and, where only it has such data, in its own types.Documentation: components/ILIAS/Data/src/Privacy/README.md.
Try it:
php scripts/Privacy/generate-privacy-docs.php --run-phpstan --check.Example
What it is not
resolve()returns the value and nothing else happens at runtime. Wrapping and resolving is a few object constructions; measured below half a microsecond per row (100 000 rows).Commits
scripts/: generator and PHPStan rules2.–7. One commit per component: User, AuthShibboleth, Certificate, LegalDocuments, MyStaff, Maps, each reviewable by its authority.
Changes for users
public_zipcode), like the public profile does. Before, it checkedpublic_zip, which only the XML user import and export use.Changes for developers
ILIAS\User\Profile\Data::__construct(): the four address strings are replaced by?PostalAddress $postal_address. Calls with positional arguments after the address break (the core has none; plugins should use named arguments). The old getters and withers stay@deprecated.Street,City,ZipCode,Country,Location, inUserCountry,UserCountryDefinitionandilDefaultPlaceholderValues; existing callers are unchanged.ilMStListUser: address getters/setters removed (internal, no callers).Known limits
ilObjUser::getStreet()) are not listed while the accessors exist.resolve()is not visible to the analysis.getSource()) has no consumer yet; it documents the origin in the code. If there is no agreed use, it can be removed.privacy.neon) are opt-in.Feature wiki and vote