Protected Content
This module provides client-side encryption using OpenPGP.js, protecting user data from administrators and external systems by encrypting content directly in the user's browser. It can be used to encrypt and decrypt files and text either in a standalone mode or integrated within fieldable forms.
A sovereignty tool for site operators and their users against external power structures.
I'm really impressed now how the download-decrypt-render works - this is really very user-friendly! And users don't realize what happens behind the scenes because it goes so smoothly. That's always the best sign when something looks so simple...
INTRODUCTION
This NIS2 Recital (98) compliant module integrates OpenPGPjs for executing client-side encryption, ensuring that even Drupal administrators, sysadmins or ISPs cannot access user data. It supports two modes of usage: stand-alone mode
and field mode. In stand-alone mode, the module provides forms for encryption, decryption and re-encryption (decryption immediately followed by encryption, for updating sets of recipients and/or compliance with key rotation) of arbitrary files or texts. In field mode, the module provides a field type for encryption and decryption of arbitrary files or texts from within any fieldable form, a field formatter and inline decryption mode that allows seamless asymmetric decryption and rendering on-the-fly.
REQUIREMENTS
INSTALLATION
Install as usual. OpenPGPjs is shipped within the module.
ROADMAP
Multiple signatures per content with recursive encryption.
Recursive encryption of files by folder selection.
LEARN MORE ABOUT PROTECTED CONTENT
Protected Content, Secure open source day - Haarlem (2019)
Protected Content: end-to-end PGP encryption for Drupal, Drupal Camp - Kyiv (2019)
Protected Content by Asymmetrical Client Side Encryption, Drupal Dev Days - Ghent (2022)
A pretty good content protection (Workshop), Drupal Con - Prague (2022)
Securing Drupal Content with Client-Side Encryption: A Zero Trust Approach (Workshop), Drupal Con - Vienna (2025)
The Privacy, The Secrecy and The Contradiction of NIS2, OpenSSL Conference - Prague (2025)
SIMILAR PROJECT
WARNINGS
- Protected Content defines a zero knowledge proof protocol, based on the brain of its users. Unless local cache is set, the passphrases defining private keys are not stored in any medium but the brain of their authors. I.e, a lost passphrase that allows for the decryption of a content no one else is a recipient of equals to a content lost for an impractical amount of time. Use it wisely.
- Proc uses the cache API of modern browsers for avoiding having to download twice the same cipher text. Therefore, if you are not accessing it in localhost, you might have to have https enabled on your server, otherwise the cache API will probably be disabled. If as
<user>you come to have ssh access to your remote server and you access the project athttp://<ip>:<port>, a convenient workaround is to bind ports with ssh. Example:ssh -L <port>:<ip>:<port> <user>@<ip>. While this ssh session is opened, you will be able to access the project athttp://localhost:<port>and as such cache API will be enabled.
Depends on
Dependencies of the latest stable release
- file Drupal core
- options Drupal core
- user Drupal core
- views Drupal core
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.
Activity
Release Timeline
Releases
| Version | Type | Core | Notes | Release date | |
|---|---|---|---|---|---|
| 10.1.125 | Stable | 9–11 | Fixed proc_update_10005 for cipher texts without an owner | Aug 27, 2026 | |
| 10.1.124 | Stable | 9–11 | Added JS api for text decryption | Aug 24, 2026 | |
| 10.1.123 | Stable | 9–11 | Added service worker for semi-autonomous background re-encryption | Jul 29, 2026 | |
| 10.1.122 | Stable | 9–11 | Fixed race condition between proc_janitor and the queue worker | Jun 22, 2026 | |
| 10.1.121 | Stable | 9–11 | Added exception to proc update 10002. | Jun 18, 2026 | |
| 10.1.120 | Stable | 9–11 | Incremented version number of internal js libraries | Jun 16, 2026 | |
| 10.1.119 | Stable | 9–11 | Added original file name for download link when mime type is not recognized | Jun 15, 2026 | |
| 10.1.118 | Stable | 9–11 | Added clean up of update jobs on post delete | Jun 11, 2026 | |
| 10.1.117 | Stable | 9–11 | Added configuration for allowing local cache of password during decryption on stand-alone mode | Jun 5, 2026 | |
| 10.1.116 | Stable | 9–11 | Removed redundant decryption success message | Jun 4, 2026 | |
| 10.1.115 | Stable | 9–11 | Fixed validation bug on the manual removal of invalid update jobs. | Jun 3, 2026 | |
| 10.1.114 | Stable | 9–11 | Moved atomic js modules into js/modules/atomics folder | May 23, 2026 | |
| 10.1.113 | Stable | 9–11 | Added configuration for allowing inline decryption in stand-alone mode | May 22, 2026 | |
| 10.1.112 | Stable | 9–11 | Fixed bug on inline decryption of PDFs by adding explicit definition of mime types | May 21, 2026 | |
| 10.1.111 | Stable | 9–11 | Fixed invalidation of expired password local caches on inline decryption | May 8, 2026 | |
| 10.1.110 | Stable | 9–11 | Added on-the-fly decryption in edit mode | May 5, 2026 | |
| 10.1.109 | Stable | 9–11 | Added endpoint for the retrieval of my update jobs count | Apr 18, 2026 | |
| 10.1.108 | Stable | 9–11 | Added proc_janitor submodule | Apr 14, 2026 | |
| 10.1.107 | Stable | 9–11 | Added proc_reporting submodule | Mar 20, 2026 | |
| 10.1.106 | Stable | 9–11 | Added opacity to the re-encryption link when clicked | Mar 16, 2026 | |
| 10.1.105 | Stable | 9–11 | Fixed progress bar bug during batch re-encryption | Mar 12, 2026 | |
| 10.1.104 | Stable | 9–11 | Fixed bug on firing too early page reload after re-encryption batch | Mar 10, 2026 | |
| 10.1.103 | Stable | 9–11 | Fixed bug on invalid indexes of update jobs | Mar 5, 2026 | |
| 10.1.102 | Stable | 9–11 | Fixed bug on closing the Request re-encryption confirmation dialog | Mar 3, 2026 | |
| 10.1.101 | Stable | 9–11 | Added configuration for changing the class or decrypt/re-encrypt link in standalone mode | Mar 2, 2026 | |
| 10.1.100 | Stable | 9–11 | Fixed bug on batch re-encryption | Feb 26, 2026 | |
| 10.1.99 | Stable | 9–11 | Removed dependency of history module | Feb 25, 2026 | |
| 10.1.98 | Stable | 9–11 | Added batch update (re-encryption) | Feb 25, 2026 | |
| 10.1.97 | Stable | 9–11 | Fixed severe bug on the selection of recipients for re-encryption. | Jan 30, 2026 | |
| 10.1.96 | Stable | 9–11 | Added Update Jobs field and its validations to `proc/<proc ID>/edit` for keyrings. | Jan 13, 2026 | |
| 10.1.95 | Stable | 9–11 | Fixed bug on parameter type hint | Jan 8, 2026 | |
| 10.1.94 | Stable | 9–11 | Fixed important bug on re-encryption. | Dec 5, 2025 | |
| 10.1.93 | Stable | 9–11 | Fixed race condition bug that affected setting of update jobs. | Dec 4, 2025 | |
| 10.1.92 | Stable | 9–11 | Fixed bug on clearing entity cache after editing update jobs. | Nov 13, 2025 | |
| 10.1.91 | Stable | 9–11 | Fixed bug on re-encryption of several procs at once | Nov 13, 2025 | |
| 10.1.90 | Stable | 9–11 | Added the Proc Metadata Transitioner submodule | Nov 4, 2025 | |
| 10.1.89 | Stable | 9–11 | Added versioning to js libraries for cache invalidation. | May 4, 2025 | |
| 10.1.88 | Stable | 9–11 | Bug fix. Added missing check for default value of proc. | Apr 30, 2025 | |
| 10.1.87 | Stable | 9–11 | Allowed only input or select elements to be used as source of dynamic fetcher filters | Apr 29, 2025 | |
| 10.1.86 | Stable | 9–11 | Removed enforced input element on fetcher filter | Apr 29, 2025 | |
| 10.1.85 | Stable | 9–11 | Rolled back to static entity query for backwards compatibility at ProcRecipientTrait::userHasKeyring(). | Apr 25, 2025 | |
| 10.1.84 | Stable | 9–11 | Fixed bug on getting metadata of old content | Apr 25, 2025 | |
| 10.1.83 | Stable | 9–11 | Added 'My Re-encryption' form. | Apr 23, 2025 | |
| 10.1.82 | Stable | 9–11 | Added unit tests, added smaller js modules. | Feb 18, 2025 |