Repository navigation
feat(security): szyfrowanie sekretów integracji w bazie - #923
Merged
Merged
Conversation
️✅ There are no secrets present in this pull request anymore.If these secrets were true positive and are still valid, we highly recommend you to revoke them. 🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request. |
mpasternak
force-pushed
the
sec/szyfrowanie-sekretow
branch
from
October 24, 2026 17:23
62afd2d to
8d977cf
Compare
Pola Uczelnia.pbn_app_token, Uczelnia.orcid_client_secret, Uczelnia.clarivate_password i BppUser.pbn_token przechodzą na EncryptedTextField (migracja 0496 szyfruje istniejące wartości, gdy klucz jest dostępny; cofnięcie odszyfrowuje). - klucz: nowa zmienna DJANGO_BPP_FIELD_ENCRYPTION_KEY (MultiFernet, kilka kluczy po przecinku); DSPACE_CREDENTIALS_KEY nadal obsługiwany - bez klucza zapis jawny z ostrzeżeniem, odczyt rozpoznaje wartości jawne; nieodszyfrowalny szyfrogram czytany jako pusty, ale ponowny zapis rekordu go zachowuje - serializacja (historia zmian django-reversion, dumpdata) zapisuje szyfrogram; deserializacja go odszyfrowuje - manage.py zaszyfruj_sekrety (idempotentne, --rotuj, --dry-run) - system checki bpp.W101-W104 (brak/zły klucz, nieodszyfrowalne i jawne wartości w bazie; te ostatnie tylko z --database) - dokumentacja administratora i testy Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ
mpasternak
force-pushed
the
sec/szyfrowanie-sekretow
branch
from
October 24, 2026 18:30
8d977cf to
756ea14
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Co zmieniono
Uczelnia.pbn_app_token,Uczelnia.orcid_client_secret,Uczelnia.clarivate_passwordiBppUser.pbn_tokenprzechodzą naEncryptedTextField(dotąd używany przezdspace_api_password).max_lengthzostaje (walidacja formularzy); kolumny stają siętext.src/bpp/fields.py: klucz z nowej zmiennejDJANGO_BPP_FIELD_ENCRYPTION_KEY(MultiFernet; kilka kluczy po przecinku — pierwszy szyfruje, reszta tylko odczyt),DSPACE_CREDENTIALS_KEYnadal obsługiwany jako klucz zgodności.gAAAAA) — instalacje bez klucza działają jak dotąd (wcześniej zapis pola rzucałImproperlyConfigured).ImproperlyConfiguredprzy zapisie (bez cichego przejścia na zapis jawny).""(exclude(pbn_token="")) działa jak dotąd — pusty napis nie jest szyfrowany.value_to_string: historia zmian django-reversion w adminie Uczelni,dumpdata) zapisuje szyfrogram zamiast wartości jawnej;to_pythonodszyfrowuje go przy deserializacji, więc przywrócenie wersji odtwarza poprawną wartość. Wersje historii zapisane przed tą zmianą nie są przepisywane.0496_uczelnia_bppuser_szyfrowanie_sekretow: AlterField + RunPython szyfrujący istniejące jawne wartości (surowy SQL, nie przez ORM), gdy klucz jest dostępny; bez klucza pomija z komunikatem. Cofnięcie odszyfrowuje.manage.py zaszyfruj_sekrety(idempotentne,--rotujprzepisuje szyfrogramy na główny klucz,--dry-run).src/bpp/checks.py, same Warningi — nie blokują startu/migrate/buildu):bpp.W101brak klucza,bpp.W102zły format klucza,bpp.W103w bazie są szyfrogramy nieodszyfrowalne aktualnym kluczem,bpp.W104klucz jest, ale zostały wartości jawne. W103/W104 tylko z listą baz (migrate,check --database default), błąd bazy → pominięcie.docs/administrator/zaawansowane.md(nowa sekcja: generowanie klucza, rotacja, utrata klucza),docs/administrator/integracja-dspace.md.Uwagi
migrate(lubzaszyfruj_sekrety) szyfruje istniejące wartości.Testy
src/bpp/tests/test_szyfrowanie_sekretow.py(pole, MultiFernet/stary klucz, brak klucza, zły klucz, zachowanie nieodszyfrowalnej wartości przy zapisie, surowa zawartość kolumn,exclude(pbn_token=""),QuerySet.update, klient PBN dostaje odszyfrowane tokeny, migracja w obie strony, komenda z--rotuj/--dry-run, system checki, serializacja i przywracanie wersji z django-reversion bez wartości jawnej).test_encrypted_field— 28 passed; testy modułów dotkniętych zmianą (dspace_api, admin integracji Uczelni, DjangoQL sekrety, pbn_api, orcid_integration, pbn_downloader_app, bpp_setup_wizard, clarivate, pbn_wysylka_oswiadczen, importer PBN, oidc) — 995 passed.makemigrations --check— bez zmian;ruff,pre-commit— OK.🤖 Generated with Claude Code
https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ