├── .python-version ├── teamvault ├── apps │ ├── __init__.py │ ├── secrets │ │ ├── api │ │ │ ├── __init__.py │ │ │ └── urls.py │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── models │ │ │ │ ├── __init__.py │ │ │ │ ├── test_model_consistency.py │ │ │ │ ├── test_constraints.py │ │ │ │ ├── test_secret_revisions.py │ │ │ │ └── test_file_payload_migration.py │ │ │ ├── views │ │ │ │ ├── __init__.py │ │ │ │ └── test_encryption_view_constraints.py │ │ │ └── utils.py │ │ ├── management │ │ │ ├── __init__.py │ │ │ └── commands │ │ │ │ ├── __init__.py │ │ │ │ └── update_search_index.py │ │ ├── migrations │ │ │ ├── __init__.py │ │ │ ├── 0004_unaccent_extension.py │ │ │ ├── 0006_auto_20150124_1103.py │ │ │ ├── 0011_remove_secret_search_index.py │ │ │ ├── 0030_sharedsecretdata_granted_on.py │ │ │ ├── 0033_secretrevision_encrypted_otp_key.py │ │ │ ├── 0002_secret_filename.py │ │ │ ├── 0021_auto_20180220_1428.py │ │ │ ├── 0005_secret_search_index.py │ │ │ ├── 0015_secretrevision_plaintext_data_sha256.py │ │ │ ├── 0022_secret_last_changed.py │ │ │ ├── 0018_auto_20180220_1244.py │ │ │ ├── 0007_auto_20150205_1918.py │ │ │ ├── 0012_secret_search_index.py │ │ │ ├── 0019_secret_notify_on_access_request.py │ │ │ ├── 0034_remove_secretrevision_encrypted_otp_key_and_more.py │ │ │ ├── 0035_remove_secretrevision_encrypted_otp_key_data_and_more.py │ │ │ ├── 0028_sharedsecretdata_grant_description_and_more.py │ │ │ ├── 0024_auto_20210824_1203.py │ │ │ ├── 0003_auto_20150113_1915.py │ │ │ ├── 0027_sharedsecretdata_only_one_set.py │ │ │ ├── 0023_auto_20190822_1234.py │ │ │ ├── 0032_alter_sharedsecretdata_granted_by.py │ │ │ ├── 0029_sharedsecretdata_granted_by.py │ │ │ ├── 0025_alter_secret_description_alter_secret_name.py │ │ │ ├── 0020_auto_20180220_1356.py │ │ │ ├── 0008_auto_20150322_0944.py │ │ │ ├── 0040_secretchange_scrubbed_fields.py │ │ │ ├── 0013_auto_20161021_1411.py │ │ │ ├── 0016_auto_20180220_1053.py │ │ │ ├── 0036_alter_secret_shared_groups_alter_secret_shared_users.py │ │ │ ├── 0037_change_secretrevision_plaintextdata_key_of_password_type.py │ │ │ ├── 0017_auto_20180220_1115.py │ │ │ ├── 0009_auto_20150322_0949.py │ │ │ ├── 0014_auto_20170313_1544.py │ │ │ ├── 0031_rename_share_data_fields.py │ │ │ ├── 0039_migrate_old_file_saves_into_new_format.py │ │ │ └── 0026_allowed_groups_users_intermediate.py │ │ ├── templatetags │ │ │ ├── __init__.py │ │ │ └── smart_pagination.py │ │ ├── exceptions.py │ │ ├── __init__.py │ │ ├── context_processors.py │ │ ├── templates │ │ │ ├── opensearch.xml │ │ │ └── secrets │ │ │ │ ├── search │ │ │ │ └── _search_item.html │ │ │ │ ├── detail_content │ │ │ │ ├── file.html │ │ │ │ ├── _su_confirm_modal.html │ │ │ │ └── meta.html │ │ │ │ ├── secret_delete.html │ │ │ │ ├── secret_restore.html │ │ │ │ ├── secret_row.html │ │ │ │ ├── dashboard.html │ │ │ │ ├── secret_list.html │ │ │ │ └── addedit_content │ │ │ │ ├── file.html │ │ │ │ └── cc.html │ │ ├── validators.py │ │ ├── enums.py │ │ ├── urls.py │ │ ├── filters.py │ │ └── tasks.py │ ├── audit │ │ ├── migrations │ │ │ ├── __init__.py │ │ │ ├── 0009_alter_logentry_category.py │ │ │ ├── 0008_logentry_logentry_category_idx_and_more.py │ │ │ ├── 0006_logentry_reason.py │ │ │ ├── 0004_alter_logentry_category.py │ │ │ ├── 0001_initial.py │ │ │ ├── 0007_alter_logentry_category.py │ │ │ ├── 0002_auto_20170313_1544.py │ │ │ ├── 0005_alter_logentry_category.py │ │ │ └── 0003_logentry_categories.py │ │ ├── __init__.py │ │ ├── urls.py │ │ ├── auditlog.py │ │ ├── filters.py │ │ ├── views.py │ │ ├── models.py │ │ └── templates │ │ │ └── audit │ │ │ └── log.html │ ├── accounts │ │ ├── migrations │ │ │ ├── __init__.py │ │ │ ├── 0003_usersettings_avatar.py │ │ │ ├── 0001_initial.py │ │ │ ├── 0005_rename_usersettings_userprofile.py │ │ │ ├── 0004_alter_usersettings_hide_deleted_secrets.py │ │ │ └── 0002_add_user_settings.py │ │ ├── __init__.py │ │ ├── context_processors.py │ │ ├── forms.py │ │ ├── templates │ │ │ └── accounts │ │ │ │ ├── logout.html │ │ │ │ ├── _avatar.html │ │ │ │ ├── user_settings.html │ │ │ │ └── login.html │ │ ├── models.py │ │ ├── auth.py │ │ ├── urls.py │ │ └── utils.py │ └── settings │ │ ├── migrations │ │ ├── __init__.py │ │ └── 0001_initial.py │ │ ├── webpack.py │ │ ├── __init__.py │ │ └── models.py ├── __init__.py ├── __version__.py ├── static │ ├── scss │ │ ├── card.scss │ │ ├── fontawesome.scss │ │ ├── scrollbar.scss │ │ ├── circularProgressbar.scss │ │ ├── tom-select.scss │ │ ├── select2.scss │ │ ├── theme.scss │ │ ├── avatars.scss │ │ ├── base.scss │ │ ├── search.scss │ │ └── secrets.scss │ └── js │ │ ├── utils.js │ │ ├── zxcvbn.ts │ │ ├── otp.js │ │ └── index.js ├── templates │ ├── helpers │ │ ├── filter_item.html │ │ ├── filter_row.html │ │ └── filter.html │ ├── rest_framework │ │ └── api.html │ ├── 404_anon.html │ ├── 404_loggedin.html │ ├── pagination.html │ └── base.html ├── wsgi.py ├── manage.py ├── urls.py ├── middleware.py ├── views.py └── cli.py ├── .coveragerc ├── .gitattributes ├── .editorconfig ├── .gitignore ├── tsconfig.json ├── .babelrc ├── webpack.prod.js ├── MANIFEST.in ├── webpack.dev.js ├── webpack.common.js ├── justfile ├── README.md ├── .github └── workflows │ ├── run-tests-on-pr.yml │ └── create-build-on-release.yml ├── pyproject.toml └── CHANGELOG.md /.python-version: -------------------------------------------------------------------------------- 1 | 3.12 2 | -------------------------------------------------------------------------------- /teamvault/apps/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/api/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/audit/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/accounts/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/tests/models/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/tests/views/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/settings/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /teamvault/__init__.py: -------------------------------------------------------------------------------- 1 | from teamvault.__version__ import __version__ 2 | -------------------------------------------------------------------------------- /teamvault/__version__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.11.6" # Also change in pyproject.toml 2 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/exceptions.py: -------------------------------------------------------------------------------- 1 | class PermissionError(Exception): 2 | pass 3 | -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | branch = True 3 | source = teamvault 4 | 5 | [report] 6 | omit = */migrations/* 7 | 8 | -------------------------------------------------------------------------------- /teamvault/apps/audit/__init__.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AuditConfig(AppConfig): 5 | name = 'teamvault.apps.audit' 6 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/__init__.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SecretsConfig(AppConfig): 5 | name = 'teamvault.apps.secrets' 6 | -------------------------------------------------------------------------------- /teamvault/apps/accounts/__init__.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class AccountsConfig(AppConfig): 5 | name = 'teamvault.apps.accounts' 6 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | /.yarn/** linguist-vendored 2 | /.yarn/releases/* binary 3 | /.yarn/plugins/**/* binary 4 | /.pnp.* binary linguist-generated 5 | -------------------------------------------------------------------------------- /teamvault/apps/secrets/context_processors.py: -------------------------------------------------------------------------------- 1 | from teamvault.__version__ import __version__ 2 | 3 | 4 | def version(request): 5 | return {'version': __version__} 6 | -------------------------------------------------------------------------------- /teamvault/static/scss/card.scss: -------------------------------------------------------------------------------- 1 | // custom dark credit card background 2 | [data-bs-theme="dark"] .jp-card-front { 3 | background-color: $secondary !important; 4 | } 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | 7 | [*.{js,json,yml}] 8 | charset = utf-8 9 | indent_style = space 10 | indent_size = 2 11 | -------------------------------------------------------------------------------- /teamvault/apps/accounts/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | def google_auth_enabled(request): 5 | return {'google_auth_enabled': settings.GOOGLE_AUTH_ENABLED} 6 | -------------------------------------------------------------------------------- /teamvault/apps/audit/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | urlpatterns = ( 6 | path( 7 | 'log/', 8 | views.auditlog, 9 | name='audit.log', 10 | ), 11 | ) 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.egg-info/ 3 | build/ 4 | dist/ 5 | huey.db 6 | node_modules/ 7 | teamvault.cfg 8 | teamvault/static/bundled/ 9 | teamvault/static_collected/ 10 | teamvault/webpack-stats.json 11 | package-lock.json 12 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "noImplicitAny": true, 5 | "module": "es6", 6 | "target": "es5", 7 | "jsx": "react", 8 | "allowJs": true, 9 | "moduleResolution": "node" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@babel/syntax-dynamic-import"], 3 | "presets": [ 4 | [ 5 | "@babel/preset-env", 6 | { 7 | "modules": false 8 | } 9 | ], 10 | [ 11 | "@babel/preset-typescript" 12 | ] 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /teamvault/templates/helpers/filter_item.html: -------------------------------------------------------------------------------- 1 |
{% trans "Sorry, the page you requested couldn't be found." %}
13 |{% trans "If you expected a secret here, you may need to ask someone to grant you access." %}
14 || {% trans "Description" %} | 22 |{{ secret.description|linebreaksbr|urlize }} | 23 |
| {% translate "Time" %} | 26 |{% translate "Actor" %} | 27 |{% translate "User" %} | 28 |{% translate "Secret" %} | 29 |{% translate "Message" %} | 30 |{% translate "Category" %} | 31 |
| {{ entry.time|date:"Y-m-d H:i:s e" }} | 37 |{% if entry.actor %}{{ entry.actor.username }}{% endif %} | 38 |{{ entry.user|default_if_none:'' }} | 39 |{% if entry.secret %} 40 | {{ entry.secret.name }}{% endif %} 41 | | 42 |
43 | {{ entry.message }}
44 | {% if entry.reason %}
45 | {% translate "Reason" %}: {{ entry.reason }} 46 | {% endif %} 47 | |
48 | {{ entry.category }} | 49 |