From 5a485387d8af247ec6479e4115088cbbb8394d77 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 6 Oct 2022 09:18:42 -0700 Subject: [PATCH] Merge unified fides into main (#1245) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bump pydash from 5.0.2 to 5.1.0 (#920) Bumps [pydash](https://github.com/dgilland/pydash) from 5.0.2 to 5.1.0. - [Release notes](https://github.com/dgilland/pydash/releases) - [Changelog](https://github.com/dgilland/pydash/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/dgilland/pydash/compare/v5.0.2...v5.1.0) --- updated-dependencies: - dependency-name: pydash dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update boto3 requirement from ~=1.18.14 to ~=1.24.34 (#917) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.18.14...1.24.34) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.6.1 to 2022.7.0 (#915) Bumps [dask](https://github.com/dask/dask) from 2022.6.1 to 2022.7.0. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.6.1...2022.7.0) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix integration set up scripts for postgres and mariadb - casing has changed for config variables. (#921) * zendesk and salesforce connection docs (#908) * Adobe Campaign access and erasure (#905) * Updated tutorial to match latest fidesdemo (#772) * Correct build arg variable name (#925) * Correct build arg variable name * Update CHANGELOG Co-authored-by: Paul Sanders * Default `FIDESOPS__ADMIN_UI__ENABLED` to `True` (#936) * serve AdminUI by default * updates changelog * Update python docker base image from slim-buster to slim-bullseye (#928) * Update python docker base image from slim-buster to slim-bullseye * Update CHANGELOG * Remove ipython from dev-requirements.txt Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * Update boto3 requirement from ~=1.24.34 to ~=1.24.36 (#939) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.34...1.24.36) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump faker from 13.15.0 to 13.15.1 (#941) Bumps [faker](https://github.com/joke2k/faker) from 13.15.0 to 13.15.1. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.15.0...v13.15.1) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-ujson from 5.2.0 to 5.4.0 (#947) Bumps [types-ujson](https://github.com/python/typeshed) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-ujson dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add db vs saas to connection type api (#937) * add db vs saas to connection type api * adds changelog line * mypy * fix test * format * more tests * formatting * adds system type query param * format * adjust test saas search * correct query param * Use Nox as the build tool instead of Make (#919) * Create noxfile.py * update the dockerfile with more stages * add GitPython as a dev requirement (used by nox builds) * add the noxfiles, all docker builds work * fix the "make compose-build" command * remove the worker docker stage due to it being redundant with prod * create a unified compose file for integrations * update the password prompt to be accurate * copy/pasta run_infrastructure into the noxfiles dir so it can be called directly via python * add create_user and seed_test_data to the nox utils * docs commands work * get the generic dev command working * add db commands to utils * clean up mypy configuration in pyproject.toml and remove config from setup.cfg * simplify some of the CI targets and start updating the pytest targets * cleanup run_infrastructure * update ci_suite and other CI nox targets * add nox as a dev-requirement * get dev commands working, sans quickstart * tweak to the compose_down constant * get the new pylint target passing * remove analytics_id * updated the changelog * Apply suggestions from code review Co-authored-by: Paul Sanders * fix the xenon command * add a few tweaks to the worker dev command * fix an import issue * update dockerignore * move mssql to the bottom of the datastore list Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders * 863 - Retry a DSR (FE) (#938) * Update docs docker base image from slim-buster to slim-bullseye (#949) * Changed Debian base image * Update the python version to be the same as used in the fidesops app image Co-authored-by: Paul Sanders * Updated changelog Co-authored-by: Dave Quinlan Co-authored-by: Paul Sanders * Experimenting with fixes for the failing MSSQL CI tests (#918) * Change docker password environment variable to MSSQL_SA_PASSWORD * Revert password environment variable name * Set MSSQL user to root in docker-compose * Revert setting root user in docker-compose * Change environment variable name from REQUIRE_MSSQL to SKIP_MSSQL_INSTALLATION * Add healthcheck to mssql compose file * Modify healthcheck command * Revert healthcheck * Try for more loging information * Another try for logging * Another try for logging * Try running only mssql tests to avoid timeout * Revert mssql only flag * Extend time out to try to get logs * Revert extra logging and extended timeout * Set network mode to host * Make mssql run on its own * Remove network from docker-compose and only run mssql in integration * Increase integration test logging * Revert mssql only * Use cache for docker * Fix workflow error * Fix workflow error * Fix target * Fix make traget * Fix make traget * Revert cache * Verify that mssql is running from pytest fixture * Add restart to mssql * Revert rester in docker-compose * Revert wait for mssql in pytest fixture * Wait for mssql to be ready before adding test data * Add count of retries * Update CHANGELOG Co-authored-by: Paul Sanders * Delete custom GitHub issue templates (#955) We've defined generic issue templates for all Ethyca repos here: https://github.com/ethyca/.github/tree/main/.github/ISSUE_TEMPLATE Removing the templates from this repo allows it to automatically pull in the organization templates for consistency. * Bump sqlalchemy-redshift from 0.8.8 to 0.8.10 (#940) Bumps [sqlalchemy-redshift](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) from 0.8.8 to 0.8.10. - [Release notes](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/releases) - [Changelog](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/compare/0.8.8...0.8.10) --- updated-dependencies: - dependency-name: sqlalchemy-redshift dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Move tests into an "ops" subdir (#935) * Create __init__.py * move all of the test files down one dir into `ops` * update test paths * update paths where needed * update the changelog * Dispatch a repository event on new published releases (#945) * Add release dispatch event action * Update `CHANGELOG.md` * Reduce # of clients connected to the application db [#810] (#944) * Reduce number of open connections: - Limit task concurrency to two per worker. - Create one Engine per celery process which opens up a connection pool. Create one Session per celery process and use that session across privacy requests. - Close the session after the privacy request has finished executing. This just resets the session and returns connections back to the pool. It can be reused. - Remove unnecessary places where session is closed manually because the session is being used as a context manager and is already closed through that. - Pass the same Session that the privacy request is using through to TaskResources to be re-used to create ExecutionLogs instead of opening up a new Session. - Don't close the session when passing it into the Execution Log, wait until the entire privacy request is complete/exited. * Define "self" for run_privacy_task - it's the task itself. For mypy's benefits, define that the session is a context manager. * Make a session non-optional for graph_task.run_access_request, graph_task.run_erasure, and for instantiating taskResources * Use missing db fixture. * Add missing db resource. * Update test to reflect new behavior that disabling a datasource while a request is in progress can cause related collections to be skipped once the current session is expired and the connection config has the most recent state. Because the same Session that is being used to run the PrivacyRequest is now being used for ExecutionLogs, the process of saving an ExecutionLog runs a session.commit() which expires the Session and causes the ConnectionConfig to have the most recent state the next time it is accessed. * Update CHANGELOG. * enable worker by default in our dockerfile (#958) * add extra steps to make clean (#767) * Push `dev` image on pushes to `main` (#956) * Update publish_to_dockerhub.yml * add a dev step and use nox * update the changelog * Move Client Code into an `ops` subdir (#964) * Move Client Code into an `ops` subdir * move all of the files * update the dockerfile * update package.json * update codepaths for workflow tests * Update the changelog and docs references * Update .github/dependabot.yaml * Bump gitpython from 3.1 to 3.1.27 (#971) Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1 to 3.1.27. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.0...3.1.27) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix the `nox -s dev` command not spinning up the webserver (#959) * Update dev_nox.py * spin up the app before running a container shell * [#927, #929, #930] sendgrid, adobe, outreach connector docs (#951) * Bump sqlalchemy-utils from 0.37.8 to 0.38.3 (#968) Bumps [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) from 0.37.8 to 0.38.3. - [Release notes](https://github.com/kvesteri/sqlalchemy-utils/releases) - [Changelog](https://github.com/kvesteri/sqlalchemy-utils/blob/master/CHANGES.rst) - [Commits](https://github.com/kvesteri/sqlalchemy-utils/compare/0.37.8...0.38.3) --- updated-dependencies: - dependency-name: sqlalchemy-utils dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pyodbc from 4.0.32 to 4.0.34 (#980) Bumps [pyodbc](https://github.com/mkleehammer/pyodbc) from 4.0.32 to 4.0.34. - [Release notes](https://github.com/mkleehammer/pyodbc/releases) - [Commits](https://github.com/mkleehammer/pyodbc/compare/4.0.32...4.0.34) --- updated-dependencies: - dependency-name: pyodbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.7.0 to 2022.7.1 (#967) Bumps [dask](https://github.com/dask/dask) from 2022.7.0 to 2022.7.1. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.7.0...2022.7.1) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump alembic from 1.8.0 to 1.8.1 (#989) Bumps [alembic](https://github.com/sqlalchemy/alembic) from 1.8.0 to 1.8.1. - [Release notes](https://github.com/sqlalchemy/alembic/releases) - [Changelog](https://github.com/sqlalchemy/alembic/blob/main/CHANGES) - [Commits](https://github.com/sqlalchemy/alembic/commits) --- updated-dependencies: - dependency-name: alembic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix erroneous values in the Outreach config (#988) * Add documentation for new nox commands (#981) * Add documentation for new nox commands * changelog * missed make to nox edits * review edits * update `nox -s dev` to not open a shell, add it as a posarg option * Apply suggestions from code review * remove the analytics id * update typo * remove extra numbering Co-authored-by: Thomas * Bump types-toml from 0.10.7 to 0.10.8 (#998) Bumps [types-toml](https://github.com/python/typeshed) from 0.10.7 to 0.10.8. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-toml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fideslog from 1.2.1 to 1.2.2 (#996) Bumps [fideslog](https://github.com/ethyca/fideslog) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/ethyca/fideslog/releases) - [Commits](https://github.com/ethyca/fideslog/compare/v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: fideslog dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Added Choose your connection feature (#987) * Added Choose your connection feature 760-Add a Connection - Select a connector to configure (front end) 866-Add a Connection - Front End layout structure * Updated CHANGELOG.md file * Fix lint issues * Fix build issue * Hide overflow Co-authored-by: Andrew Jackson * saas request overrides (#986) * initial cut of saas request overrides. include mailchimp as an example and test case. minor refactor of some of the saas request execution to enable smoother override * fix rebase issue by moving saas override tests into ops subdir * import path updates to resolve conflicts caused by rebase * add session parameter into graph task calls to fix saas override integration tests caused by rebase * update changelog * tweaks to saas connector overrides and associated tests * expose override factory register as module variable for clenaer decorator calls Co-authored-by: Adam Sachs * Update OAuth strategy to be able to perform local testing (#962) * Update boto3 requirement from ~=1.24.36 to ~=1.24.42 (#1001) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.36...1.24.42) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fastapi[all] from 0.78.0 to 0.79.0 (#1002) Bumps [fastapi[all]](https://github.com/tiangolo/fastapi) from 0.78.0 to 0.79.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.78.0...0.79.0) --- updated-dependencies: - dependency-name: fastapi[all] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * update config reference to use lowercase values (#952) * [#909] update config reference to use lowercase values * changelog * missed uppercase variables * update usages of False to false in connector docs * Added Auth0 Connector (#991) * add pagination back to connection types endpoints (#1019) * add pagination back to connection types endpoints * check for pagination in system_type search Co-authored-by: Paul Sanders * Subject Request Events and Logs Section (#1018) * Fix small issue with eslint config * Get initial drawer working * Add jest config to eslintignore * Fix small css issue * Refactor components and get initial functionality * Fix small logic error * Fix couple of bugs and format code * Conditinally display error tag * Fix issues with merge * Format and lint * Sort imports * Update to new solution * Format code * Update changelog Co-authored-by: Sean Preston * First draft of OAuth documentation (#963) * Send Errored Requests / Reprocessed Requests Info to FidesLog [#754] (#993) * Add a method to format a representation of the graph for caching in Redis and a separate method to build a summary of the differences in the graph when a privacy request is rerun to fideslog. - Adds FieldAddress.from_string method. * Add methods to cache a representation of the access graph when it is built and a separate method to retrieve it from the cache. - Also add a method to build a "rerun_access_graph" AnalyticsEvent for fideslog where applicable. * When running the access portion of the privacy request, log stats about a rerun and then cache the current access graph. - Give a different prefix when we're caching the access graph to not get mixed up with access request results. * Show skipped new edges that are directly upstream of completed nodes instead. These edges are intentionally dropped from the new graph on rerun, so want to surface this count. * Log if a privacy request fails during the "erasure" step of privacy request execution. Even though the access step is not rerun here, compare the previously cached access graph with the access graph that would have been run to determine what data has changed. * Add missing session variables. * Send an event to Fideslog when privacy request execution fails. * Add missed session - bad merge. * Update changelog. * Update docstrings. * Remove copy/paste comment. * Respond to CR comments. * Currently AnalyticsEvent.local_host cannot be None. * Update the compose file and workflows to expect an already-built image (#966) * Update the compose file and workflows to be in line with fidesctl * update the compose file to look for a specific image * rename files and update the safe PR checks * add check_migrations to the ci checks and nox * fix the failing PR checks * fix CI failures * update the unsafe checks workflow * update run_infrastructure to use the compose service name * remove the makefile and the old run_infra script * bump pylint version, pin isort, fix issues * update pytest setup path * update the changelog * make OPS_TEST_DIR a constant * fix nox missing vars * specify that the nox imports are relative imports * remove relative import paths * run isort Co-authored-by: Sean Preston * Create `AuditLog` on privacy request approval (#1038) * Create approval audit logs * Add tests * disable a pylint lint * Update changelog * Update privacy_request fixture * Updating Salesforce to use OAuth2 authentication code flow (#1039) * Removing saas_config.toml (#1043) * Bump types-pyyaml from 6.0.9 to 6.0.11 (#1047) Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.9 to 6.0.11. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-pyyaml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump docker/build-push-action from 2 to 3 (#1044) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 3. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.7.1 to 2022.8.0 (#1046) Bumps [dask](https://github.com/dask/dask) from 2022.7.1 to 2022.8.0. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.7.1...2022.8.0) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update boto3 requirement from ~=1.24.42 to ~=1.24.46 (#1045) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.42...1.24.46) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Refactor static checks to run outside of Docker (#1053) * Refactor static checks to run outside of Docker * run static checks outside of docker, reusing cached virtual envs * update the changelog * Create CHANGELOG.md * Update CHANGELOG.md * update the static checks in the workflows * remove the static check dependency on "build" * Create finished audit log for privacy requests (#1040) * Add finished AuditLog * Bump fideslib * Update test * Fix format lints * Lowercase encoding * Update changelog * Fix issue with migration downgrade * Sort lists in test data tests * format file * Update quickstart to use docker-compose and docker network for all commands (#1056) * Bump snowflake-sqlalchemy from 1.3.2 to 1.3.4 (#1051) Bumps [snowflake-sqlalchemy](https://github.com/snowflakedb/snowflake-sqlalchemy) from 1.3.2 to 1.3.4. - [Release notes](https://github.com/snowflakedb/snowflake-sqlalchemy/releases) - [Commits](https://github.com/snowflakedb/snowflake-sqlalchemy/commits) --- updated-dependencies: - dependency-name: snowflake-sqlalchemy dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * updates changelog (#1063) * Reorganize application code (#1058) * Reorganize application code * first round of moving everything and updating the import paths * checkpoint, more path updates * more path updates * fix imports * fix isort * fix mypy, isort and setup.py issues * fix unsafe checks build step running on any label * update the changelog * delete temp files * Update docs/fidesops/docs/development/contributing_details.md Co-authored-by: Paul Sanders * update more file references Co-authored-by: Paul Sanders * Patch versioneer to allow editable installs (#1070) * Patch versioneer to allow editable installs * Update CHANGELOG Co-authored-by: Paul Sanders * Preserving headers in SaaSRequestParams during pagination (#1069) * Add setuptools to dev-requirements to fix versioneer error (#1072) * Add setuptools to dev-requirements to fix versioneer error and revert patch * Update CHANGELOG Co-authored-by: Paul Sanders * Bump fideslang to 1.1.0 (#890) * Bump fideslang to 1.1.0 * find/replace user.provided.identifiable -> user * remove derived mentions * don't remove volumes on teardown * update address fields * replace user.derived and user.provided -> user * fix two more tests * fix pylint errors * fix integration tests * fix failing mongo tasks * update the changelog * fix the failing mongo task test * another mongo task fix * more mongo task fixes * Revert test back to two addresses being masked. * Update mongo array access test to reflect that underlying dataset has changed, and policy has changed, so more fields are returned. * add the noxfiles * update the dockerfile and get the nox docker commands working * Revert "update the dockerfile and get the nox docker commands working" This reverts commit 4b98c62163d419996977b7bb2dd17d181aac2f07. * remove noxfiles * updates from comments * Update test * Add migration * Update categories in test config files * Fix data categories * Fix more data categories * Change user.provided.nonidentifiable to user * Update migraiton with review suggestions * Run black * Add more logging to migration * Increment counter * fix migration conflict Co-authored-by: Dawn Pattison Co-authored-by: Paul Sanders * 797 datadog (#1060) * 515 SaaS connector Logi ID (#1074) * Combine Execution and Audit Logs in Request Status Endpoint [#1024] (#1068) * Update the request status endpoint, so when the verbose query param is used and execution logs are embedded, also return audit logs. Execution Logs are created at the collection level while audit logs are for the overall privacy request level, so most fields returned for audit logs are None. Logs are also grouped at the dataset level here, so give the audit logs a fake dataset name for display purposes, for example, "Request approved". * Update CHANGELOG and update docs to reflect that audit logs are included in a verbose request status response. * Notify fidesdemo on new releases (#1075) * Notify fidesdemo on new releases * Update `CHANGELOG.md` Co-authored-by: Paul Sanders * Bump pytest from 6.2.2 to 7.1.2 (#1081) Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.2 to 7.1.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.2...7.1.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump faker from 13.15.1 to 14.0.0 (#1080) Bumps [faker](https://github.com/joke2k/faker) from 13.15.1 to 14.0.0. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.15.1...v14.0.0) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/setup-python from 3 to 4 (#1078) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 3 to 4. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fideslog from 1.2.2 to 1.2.3 (#1079) Bumps [fideslog](https://github.com/ethyca/fideslog) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/ethyca/fideslog/releases) - [Commits](https://github.com/ethyca/fideslog/compare/v1.2.2...v1.2.3) --- updated-dependencies: - dependency-name: fideslog dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-urllib3 from 1.26.15 to 1.26.22 (#1084) Bumps [types-urllib3](https://github.com/python/typeshed) from 1.26.15 to 1.26.22. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-urllib3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fideslang from 1.1.0 to 1.2.0 (#1085) Bumps [fideslang](https://github.com/ethyca/fideslang) from 1.1.0 to 1.2.0. - [Release notes](https://github.com/ethyca/fideslang/releases) - [Changelog](https://github.com/ethyca/fideslang/blob/main/CHANGELOG.md) - [Commits](https://github.com/ethyca/fideslang/compare/1.1.0...1.2.0) --- updated-dependencies: - dependency-name: fideslang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next-auth from 4.9.0 to 4.10.3 in /clients/ops/privacy-center (#1014) Bumps [next-auth](https://github.com/nextauthjs/next-auth) from 4.9.0 to 4.10.3. - [Release notes](https://github.com/nextauthjs/next-auth/releases) - [Changelog](https://github.com/nextauthjs/next-auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/nextauthjs/next-auth/compare/next-auth@v4.9.0...next-auth@v4.10.3) --- updated-dependencies: - dependency-name: next-auth dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sean Preston * Bump fideslib (#1092) * Bump fideslib to fix docs auth issue * Update CHANGELOG Co-authored-by: Paul Sanders * 983 Adds infra for email config and dispatch (#1059) * Email config mvp crud / db layer * adds name to email config model * remove unintended changes * gets POC working * removes org name config var, updates crud endpoints to better handle supporting only 1 config, formatting * updates postman collection, adds to changelog, bumps downrev on migration * sort * formatting * use correct response model * Delete base.py * update migration annotation * Create a Saas Connector from a Template [#814] (#1076) * Starting point for SaaS connector templates * Fix imports from restructuring. * Get happy path working for instantiate connector from template endpoint. * Remove updating connector instances for now - out of scope. * Test nonexistent templates, secrets validation, instance key / fides key already exists. * Create DatasetConfigs and ConnectionConfigs instead of create_or_update in the template endpoint. Don't save ConnectionConfig until secrets are validated. * Add the other saas connectors to the registry and update their configs and datasets with instance_fides_key. - Fix datadog yaml so it can be included in the saas connector registry. There was an error in how the saas config was formatted. * Update the fides_keys in the existing saas configs and dataset yamls to have brackets around the "instance_fides_key" to indicate these will be replaced. Update the fides_key definition to allow "" with brackets specifically to pass validation. * Fix a side effect on a separate endpoint that returns the types of secrets that should be supplied for a given connector. Use the saas config type instead of the fides key for the model title. Add test verifying that fides key /instance key validation works as expected. * - Update CHANGELOG - Add new endpoint to postman collection - Add drafts doc. - Update old response body in docs for connection types. * Replace the with a properly formatted fides_key in the saas fixtures. * If DatasetConfig creation fails, delete the recently created ConnectionConfig. * Address some of the saas integration tests where I've changed the fides_key. * Fix typos. * Fix typo. * Fix unrelated bug where hubspot dataset has new datacategories with user-* data categories after the fideslang update, so they would show up if the user picked a "user" data category. * Respond to CR. Co-authored-by: Dawn Pattison * Update the "instantiate_connection_from_template" to return a portion of both the connection config and the dataset. (#1105) * Adds `AuditLog` and `ExecutionLog`s to `seed_test_data` command (#1097) * Reduce Idle Connections from Health Checks [#1102] (#1107) * Don't create a new engine as part of running the health checks and share a single engine across the application, including for the health checks. Currently we're using the default pool_size and max_overflow. * Update changelog. * Fix that health checks are still supposed to run, even if the database is disabled. * Need to yield instead - 'generator' object has no attribute 'query' * Escape redis user and password (#1104) * Escape redis user and password * Update CHANGELOG Co-authored-by: Paul Sanders * pass in analytics id env to worker (#1113) * pass in analytics id env to worker * changelog * Adds tests for email endpoints and dispatch service (#1112) * Endpoint to Verify User Identity [#1062] (#1111) * Add an endpoint to verify a user's identity before queuing the privacy request provided it doesn't need separate manual approval by a system admin. - Add a new PrivacyRequest.identity_verified_at timestamp - Add a new PrivacyRequestStatus - "identity_unverified". - Add methods to cache the verification code in Redis for comparison with a default ttl of 10 minutes * - Fix linting/copy-paste errors. - Update changelog. - Add endpoint to postman * Add new keys to response bodies. * Instead of using a new VerificationCode schema, use the SubjectIdentityVerificationBodyParams that already exists. * Revert "Instead of using a new VerificationCode schema, use the SubjectIdentityVerificationBodyParams that already exists." This reverts commit 40fcf6d119135d08a6d3ecfc40c5d73846bf2205. * Bump hashicorp/vault-action from 2.4.1 to 2.4.2 (#1119) Bumps [hashicorp/vault-action](https://github.com/hashicorp/vault-action) from 2.4.1 to 2.4.2. - [Release notes](https://github.com/hashicorp/vault-action/releases) - [Changelog](https://github.com/hashicorp/vault-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/vault-action/compare/v2.4.1...v2.4.2) --- updated-dependencies: - dependency-name: hashicorp/vault-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fastapi[all] from 0.79.0 to 0.79.1 (#1120) Bumps [fastapi[all]](https://github.com/tiangolo/fastapi) from 0.79.0 to 0.79.1. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.79.0...0.79.1) --- updated-dependencies: - dependency-name: fastapi[all] dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-urllib3 from 1.26.22 to 1.26.23 (#1117) Bumps [types-urllib3](https://github.com/python/typeshed) from 1.26.22 to 1.26.23. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-urllib3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump nox from 2022.1.7 to 2022.8.7 (#1118) Bumps [nox](https://github.com/wntrblm/nox) from 2022.1.7 to 2022.8.7. - [Release notes](https://github.com/wntrblm/nox/releases) - [Changelog](https://github.com/wntrblm/nox/blob/main/CHANGELOG.md) - [Commits](https://github.com/wntrblm/nox/compare/2022.1.7...2022.8.7) --- updated-dependencies: - dependency-name: nox dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump faker from 14.0.0 to 14.1.0 (#1122) Bumps [faker](https://github.com/joke2k/faker) from 14.0.0 to 14.1.0. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v14.0.0...v14.1.0) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump sqlalchemy-redshift from 0.8.10 to 0.8.11 (#1121) Bumps [sqlalchemy-redshift](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) from 0.8.10 to 0.8.11. - [Release notes](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/releases) - [Changelog](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/compare/0.8.10...0.8.11) --- updated-dependencies: - dependency-name: sqlalchemy-redshift dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * POC for dynamic routing (#1033) * Add initial POC for dynamic routing * fix a couple lints * Fix mypy lint * making pylint happy * Remove log * Fix another pylint issue * Add docstring * Update index if check * Handle nested nextjs routes * Update changelog * Add Sass connector configuration (#1099) * Sass Connecter feature development 761 - Add a Connection - SaaS connector's configuration parameters 984 - Saas Connector configuration - left navigation to toggle between connection params and dataset config 985 - SaaS Connector Configuration - Testing a Connection * Skipping unit test temporarily * Update flags.json file By default, turning off the createNewConnection flag which is still under development. * Updated CHANGELOG.md file * Resolved ESLint issues * Resolved npm build issue * Resolved npm build issue * Updated Saas connector configuration * Updated Saas connector configuration * Removed unnecessary import statement * add new privilege for creating SaaS connectors to user management interface * add connections read as a privilege * Applied code review feedback * Updated the CSS visibility of the CircleHelpIcon component * Added toast success when a user creates a Saas config * Resolved ESLint issue Co-authored-by: Sean Preston * 1128-Add Retry button back into the subject request detail view (#1131) * 1128-Add Retry button back into the subject request detail view * Updated CHANGELOG.md file * provide a way to give invited users the resume permission Co-authored-by: Sean Preston * Fix localhost setting for non-endpoint analytics calls [#1029] (#1130) * Set local_host to None for non-endpoint analytics calls. These are logging various tasks coming out of celery. * Update Changelog. * Add email_templates module (#1123) * Add email_templates module * run isort * Add unit tests * Update ttl calculation * Add ttl minutes test * fix lint issues * fix pylint issue * fix pylint issue * fix isort * Update template constant * Update changelog * fix lints * Add jinja to requirements.txt * update templates directory * update unit test * Update imports * fix issue template path * Add templates to manifest Co-authored-by: Paul Sanders * Formatting Issues in Webhooks Documentation (#1114) * Fix typo in `derived_identity` * Update CHANGELOG.md * Missed PR Link * replaced `<>` with `{}` In the live version of the docs, the `<>`s were being stripped from our code example titles. I've replaced them with `{}` to align with some of the other pages I've seen. * Send Identity Verification Email [#1010] (#1115) * If identity verification required, send email to the user with the verification code. * Adjust the identity_verification_required autouse fixture, and add an autouse override for just the tests where we want to turn on identity verification. * Add starting docs and updating the changelog. Start with identity_verification_required set to False for now until all the related pieces are in. * Update some of the docstrings. * Add unverified status color in the FE. * Add new privacy request status to types and constants. * Restore trailing comma. * Update identity_verification_required to subject_identity_verification_required for clarity. * Adjust email_body_params to accommodate new template. Co-authored-by: Sean Preston * Support case-insensitive connection type search [Unticketed] (#1133) * Make connection type search case-insensitive. * Update changelog. * Add option to login as root user from config (#1116) Co-authored-by: Paul Sanders * Move logging to %-style formatting [#837] (#1132) * Add a new Pii class and use it to wrap arguments not already wrapped with NonPii in those logs that are currently using %-style formatting. * Switch logging formatting to %-style instead of f-string. * Continue to address lingering f string instances, and wrap some arguments in Pii, such as raw exceptions. * Remove NotPii class and update tests. * Adjust errors made in %-style conversion. * Remove accidental Pii on print statements, update some PII wrappings. * Adjust string formatting of newly added log. * Update Changelog. * Fix missed closing curly brackets. * Remove missed curly brackets. * Add future annotations for backwards compatibility (#1136) * Add future annotations for backwards compatibility * Update CHANGELOG Co-authored-by: Paul Sanders * Release 1.7.1 (#1141) * update changelog * update ERD * make Hubspot test more robust * Fix docs build in CI (#1138) * Fix docs build in CI * Update CHANGELOG Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * fix command syntax (#1143) * hook up API request to logout action [Unticketed] (#1139) * hook up API request to logout action * run format * update import orer * add lint:fix * Update hubspot users and owners configurations (#1091) * Update CHANGELOG.md * SaaS Connector Template Creation Fix: Integer fides_key (#1166) * Use quotes when replacing <"instance_fides_key"> in the saas config and dataset config files to force a string. * Update CHANGELOG. * Start a new "email" ConnectionConfig type [#1134] (#1142) * Start a new "email" ConnectionConfig type. * Hide "email" type from the get_connection_types endpoint for now, as the email connector isn't fleshed out yet. * Update CHANGELOG. * Simplify by sending one email to start? * Update request body in postman collection. * Fix CHANGELOG formatting. * Revert "SaaS Connector Template Creation Fix: Integer fides_key (#1166)" (#1171) This reverts commit 28b6317fc7bf86019eb6559824226dc261511a95. * Fix analytics opt out environment variable name (#1170) * 1004 OAuth2 client credentials flow (#1159) * update Subject Request detail page (#1164) * [#495] clarify additions to subject request event log * [#863] note retry capabilities in subject requests * changelog * fidesops.toml * changelog Co-authored-by: Cole Garbo * Bump fastapi[all] from 0.79.1 to 0.81.0 (#1178) Bumps [fastapi[all]](https://github.com/tiangolo/fastapi) from 0.79.1 to 0.81.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.79.1...0.81.0) --- updated-dependencies: - dependency-name: fastapi[all] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Build docker image for privacy center (#1165) * Build docker image for privacy center * Update docs and add docker publish to workflow * Update CHANGELOG * Move privacy center docker publish to its own workflow Co-authored-by: Paul Sanders * Update `StorageConfig` to handle multiple auth methods (#1140) * Initial automatic impl * Lints * disable pylint error * Fix unit tests * fix imports * Update fixture * Fix config tests * Covert type to enum * Add new unit tests * Update changelong * Update docs * Update phone number * patch task scheduler * remove pylint ignore and add exception * Update docs * 1009 id verification required endpoint (#1221) * Adds identity verification config endpoint * adds test, reuse existing config var, adds postman collection * update changelog * add type ignore * move ignore line * Update src/fidesops/ops/graph/config.py Co-authored-by: Paul Sanders * remove duplicate lines in method * another dupe line * remove scope, update order of classmethod decorator * remove dependencies on endpoint * unused imports Co-authored-by: Paul Sanders * fix reference in data categories upgrade migration (#1223) * Publish on every release (#1226) Co-authored-by: Paul Sanders * Make log send async (#1174) * Make log send async * Update CHANGELOG * Add async to additional fideslog calls * WIP * Fix issue with async function is celery * Make __send work with name mangling * Remove extra await * Await coroutines in tests * Remove analytics id Co-authored-by: Paul Sanders * 1106 saas config shopify access endpoints (#1220) * Adds email communications guide to docs, exposes other hidden guides in nav bar (#1233) * adds email communications guide to docs, exposes other hidden guides in nav bar * update changelog * email docs copyedits * remove dupe items from nav Co-authored-by: Cole * Fix version number (#1232) Co-authored-by: Paul Sanders * Bump pylint from 2.14.5 to 2.15.0 (#1182) * Bump pylint from 2.14.5 to 2.15.0 Bumps [pylint](https://github.com/PyCQA/pylint) from 2.14.5 to 2.15.0. - [Release notes](https://github.com/PyCQA/pylint/releases) - [Commits](https://github.com/PyCQA/pylint/compare/v2.14.5...v2.15.0) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Ignore missing-timeout warning Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Paul Sanders * Bump fideslib (#1236) * Bump fideslib * Update CHANGELOG Co-authored-by: Paul Sanders * Email Connector: Build Masking Instructions (#1168) * Pass in input_data to erasure requests, and not just access requests, so it can be used for the email connector, which won't have any rows returned from an access request. - Add an EmailConnector.build_masking_instructions method with a draft of data needed to instruct the user how to query/mask/what fields to mask on their end. * Have the EmailConnector.mask_data cache the raw details of what needs to be masked in Redis. We'll use this to send one email at the end for each "email"-based dataset at end, instead of sending one email for each collection. Reuse some of the caching code created for manual connectors / failed privacy requests where similar to the EmailConnectors, we have some separate action that is required on a given collection. Rename to make more generic. * Remove restriction that a ManualAction needs a get or update value. The manual action could just be locating data for another collection downstream. Cache email template details, even if there are no actions needed on that specific collection, * Update the expected number of collections in the email dataset. * build_masking_instructions is not required to return a ManualAction. * Reconcile this test with the work to make log send asynchronous. Co-authored-by: Sean Preston * Adds email scopes to postman collection (#1241) * Adds email scopes to postman collection * update changelog * Bump black from 22.6.0 to 22.8.0 (#1238) Bumps [black](https://github.com/psf/black) from 22.6.0 to 22.8.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.6.0...22.8.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Rename fidesops-privacy-center image to fides-privacy-center (#1237) Co-authored-by: Paul Sanders * Bump eslint from 8.9.0 to 8.23.0 in /clients/ops/privacy-center (#1180) Bumps [eslint](https://github.com/eslint/eslint) from 8.9.0 to 8.23.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.9.0...v8.23.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * #1008 User identity verification flow (#1231) * Update lint commands and eslint ignore * Run lints and refactor privacy cards * Refactor modal * Finish verification flow * get config from server * Update changelong * Fix test failures * Format file * Mock out route * Format file * Add code resending * Update test to use hostUrl * Add headers util function and PrivacyRequestStatus status enum * Bump @chakra-ui/utils from 1.10.4 to 2.0.9 in /clients/ops/admin-ui (#1145) Bumps [@chakra-ui/utils](https://github.com/chakra-ui/chakra-ui/tree/HEAD/packages/utils) from 1.10.4 to 2.0.9. - [Release notes](https://github.com/chakra-ui/chakra-ui/releases) - [Changelog](https://github.com/chakra-ui/chakra-ui/blob/main/packages/utils/CHANGELOG.md) - [Commits](https://github.com/chakra-ui/chakra-ui/commits/@chakra-ui/utils@2.0.9/packages/utils) --- updated-dependencies: - dependency-name: "@chakra-ui/utils" dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Allows worker to start successfully in both dev and dev_with_worker (#1250) * Allows worker to start successfully in both dev and dev_with_worker * update changelog * formatting * Add `execution_timeframe` to `Policy` model and schema (#1244) * Add execution_timeframe column to model and schema * Fix test failures * Fix Policy patch route * Update Policy patch test * Run black and isort lints * Update changelog * fix typo Co-authored-by: Sean Preston * Fix for pytest-asyncio bug (#1260) Co-authored-by: Paul Sanders * Clean up docker build (#1252) * Add files to .dockerignore * Add config path to docker-compose * Mount volume for build check * Fix pylint error * Update CHANGELOG * Fix failing external test * Remove worker env var from docker-compose Co-authored-by: Paul Sanders * Email Connector: Send Email with Erasure Instructions [#1158] (#1246) * Send an email for each email-based dataset at the end of privacy request execution. - Add a migration to create a new audit log type. Create an audit log for the email send. - Throw an exception for email-based connectors and catch to override the default execution log. - Add a draft of an email template - Connect sending a "test email" with dummy data. A fidesops admin could configure to check their email config was working. * Add more "checkpoints" to privacy request execution - these are locations from which we can resume privacy request execution without having to run from the beginning. - Add more options to CurrentStep Enum - Cache the checkpoint if an email send fails, so we can retry from the same step. * Don't send an email if the connection config is read only or there are no updates to be applied to any of the collections on the dataset. * Don't assume there's a collection when building "resume" details. A failed privacy request can be resumed outside of the traversal. * Add a first draft of docs for setting up an email connector. * Moves the email connector send method to the email connector file. * Update mock location. * Bump downrev. * update email connector guides * correct link, broken sentence * Create a new EmailRequestFulfillmentBodyParams type to be used once the cached email details are extracted by dataset. * Fix missed test. Co-authored-by: Cole * Fix download link (#1264) * Fix download link * Update changelog * Add `due_date` to `PrivacyRequest` model (#1259) * Add `due_date` to `PrivacyRequest` model * Add `due_date` test and run lints * Update CHANGELOG.md * Fix test failures * Fix type error * Fix mypy issue * Switch to `strptime` * Fix migration down revision * Move date format string into constant * Refactor strategy instantiation for more extensitiliby (#1254) * Instantiate strategies via abstract Strategy base class A generalized Strategy abstract base class provides generalized getter methods that instantiate strategy subclasses (implementations). These methods rely on the builtin __subclasses__() method to identify Strategy subclasses, which allows for more dynamic and extensible strategy implementation, removing the need for a hardcoded enumeration of supported Strategy implementations. Abstract strategy types inherit from this new abstract base class, and strategy subclasses (implementations) must provide `name` and `configuration_model` attributes that are leveraged by new instantiation mechanism in the abstract base class. * Update get_description() to be a class rather than static method This allows the method to leverage the new `name` class variable rather than relying on a static constant variable. * Remove strategy factories and update references Strategy factories are no longer needed with refactored Strategy getters. Update the uses (references) of strategy factories throughout the codebase to now rely on the new Strategy getters. Strategy subclasses (implementations) now need to be imported explicitly in __init__.py's because they used to be imported in factory modules. Also remove the old MaskingStrategy registration/factory mechanisms. * Remove strategy name constants Now that the abstract Strategy base class enforces implementation subclasses to have a `name` class attribute, this attribute should be relied upon rather than the arbitrary name constants declared previously. The get_strategy_name() abstract method is also superfluous, as the `name` class attribute can be used as a standardized way to retrieve the strategy name. * Remove get_configuration_model() abstract method The generalized strategy getter now relies upon the `configuration_model` class variable that's on each Strategy. Therefore we no longer need the get_configuration_model() getter on each Strategy subclass. * Update MaskingStrategy docs with new Strategy functionality * Update changelog * Improve recursion in _find_all_strategy_subclasses * Fix recursion bug when finding all strategies Update associated tests to make sure the recursion is properly tested * Tweak conditional for falsy check * Make get_strategies endpoint test more robust * Fix typo in documentation Co-authored-by: Adam Sachs * Make admin ui work when volumes are mounted (#1266) * Make admin ui work when volumes are mounted * Update changelog * Fix path issue with hard refresh * Update from code review Co-authored-by: Paul Sanders * Update the Erasure Request Email Fulfillment template [#1265] (#1270) * Update email template for email request fulfilment. * Formatting changes. * Bump types-redis from 4.3.4 to 4.3.20 (#1255) Bumps [types-redis](https://github.com/python/typeshed) from 4.3.4 to 4.3.20. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-redis dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update boto3 requirement from ~=1.24.46 to ~=1.24.68 (#1272) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.46...1.24.68) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump requests-mock from 1.9.3 to 1.10.0 (#1276) Bumps [requests-mock](https://github.com/jamielennox/requests-mock) from 1.9.3 to 1.10.0. - [Release notes](https://github.com/jamielennox/requests-mock/releases) - [Commits](https://github.com/jamielennox/requests-mock/compare/1.9.3...1.10.0) --- updated-dependencies: - dependency-name: requests-mock dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fastapi[all] from 0.81.0 to 0.82.0 (#1277) Bumps [fastapi[all]](https://github.com/tiangolo/fastapi) from 0.81.0 to 0.82.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.81.0...0.82.0) --- updated-dependencies: - dependency-name: fastapi[all] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix typo (#1280) Co-authored-by: Paul Sanders * Pass in Vault environment variables if they are present locally (#1275) * Pass in Vault environment variables if they are present locally * Changelog and minor cleanup * Add Foundation for "Manual Webhooks" [#1224] (#1267) * Add a new AccessManualWebhook model, a new "manual_webhook" ConnectionType, and a new "requires_input" PrivacyRequestStatus. - Add endpoints to get/create/update/delete the single AccessManualWebhook associated with a ConnectionConfig of type "manual_webhook". The new AccessManualWebhook primarily stores the fields that we are going to need to upload. The values uploaded will be passed directly to the user. * Add requires_input privacy request status to the frontend, and exposes a "manual_webhook" as a manual connector type. * Add the endpoints to create the manual connection config and its corresponding webhook to the postman collection. Clean up some copy/paste issues with the email connector. * Run black. * Add an empty ManualWebhookSchema to prevent a KeyError if you attempt to fetch secret types for this schema - we are not currently collecting secrets for this connector at this time but will in the futuer. * Apply suggestions from code review Co-authored-by: Paul Sanders * Catch possible integrity error. Co-authored-by: Paul Sanders * Added fixture to create a new data everytime test runs. (#1269) * Improved param_value aggregation to support one-to-many relationships (#1253) * Improved param_value aggregation to support one-to-many relationships * pylint and mypy fixes * Fixing mypy and unit tests * Adding async await to Shopify test * Fixing tests * Adding tests for generate_product_list * Updating changelog * Fixing tests * Simplifying flatten logic Co-authored-by: Adam Sachs * Adding comment to clarify test * Renaming flatten to unpack * Move method example to docstring Co-authored-by: Adam Sachs Co-authored-by: Adam Sachs * Bump python from 3.9.13 to 3.9.14 (#1287) * Bump python from 3.9.13 to 3.9.14 * Update changelog Co-authored-by: Paul Sanders * Add `days_left` field (#1281) * Add `days_left` field * Fix lints and update tests * Move property to model * Run black * Update CHANGELOG.md * Add new test and fix issue * Fix pylint issue * Fix brittle tests issue * Address PR feedback * Remove Masking of Redis Connection Error [#1271] (#1288) * Remove masking of redis connection error. * Update Changelog. * 1183 saas connectors shopify erasure (#1289) * Initial commit for erasure endpoints * Updated endpoints and erasure data approach * Formatting before making changes * Fixing duplicate customer_addresses * Added assertions for update verification * Fixed isort issue Co-authored-by: Hamza W Co-authored-by: Adrian Galvan * 1156 email upon privacy request completion (#1282) * `days_left` field in admin UI (#1283) * Add `days_left` field * Fix lints and update tests * Move property to model * Run black * Update CHANGELOG.md * Add new test and fix issue * Fix pylint issue * Fix brittle tests issue * Add days left tag to table and details page * Update CHANGELOG.md * Remove old code left from auto-merge * Address PR feedback * Sort privacy requests by `due_date` (#1284) * Add initial sorting code * Add test stub * Finish sorting unit test * Update CHANGELOG.md * Fix mypy and pylint issues * Fix another mypy issue * Move nulls_last import * Potentially fix nulls_last mypy issue * Implement PR feedback * Address mypy and pylint issues * Update unit test to test `due_date` sort better * Human Readable Names for Connection Types [#1096] (#1297) * Expose a human readable name in the connection type endpoints. Add a human_readable_name to the saas connector registry and a separate human readable mapping for ConnectionTypes. * Update changelog and connection type endpoint docs. * mypy * Update ConnectorTemplate test. * Mypy * Update tests/ops/models/test_connectionconfig.py Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders * Change references to FIDESOPS__CONFIG_PATH to FIDES__CONFIG_PATH (#1302) * Change references to FIDESOPS__CONFIG_PATH to FIDES__CONFIG_PATH * Update changelog Co-authored-by: Paul Sanders * Enable Manual Webhooks in Request Execution [#1228] (#1285) * Add a method to cache data supplied for a manual webhook on a particular privacy request. * Add an endpoint to retrieve all enabled access manual webhooks. * Add an endpoint for uploading manual data corresponding to fields in a manual webhook for a given privacy request with "requires_input" status. * Add an endpoint to view data manually uploaded for an access manual webhook. - Add new scopes for the endpoints to upload/view manual data for webhooks. - Enforce that at least one field is added when defining a manual webhook, and add a fallback if no fields were defined. * Add an endpoint to resume a privacy request from "requires_input" status once all input has been added. None of the fields are required, but the a key for each manual webhook still needs to exist in the cache to proceed. As part of request execution check if data has been uploaded (data can be empty) for all manual webhooks. If True, we can proceed with request execution, otherwise, we put the PrivacyRequest in "requires_input" status and exits. Also adds the manual data uploaded directly to the packet we upload to the user at the very end. * Update postman collection. * Fix request_id query param in existing postman request. * Include additional details about how to resume a "requires_input" privacy request when getting its status. * Add docs and update changelog. * Upload new ERD diagram. * Don't put a privacy request in requires_input state if this policy only has erasure rules. * Respond to CR! * Update manual_webhooks.md * [#1153] Adds warning to subject request denial UI (#1298) * add warning to subject request denial UI * run prettier * [#1088] Adds new Celery queue for async email dispatch (#1173) Co-authored-by: Dawn Pattison * Add consent table (#1301) Co-authored-by: Paul Sanders * Bump pylint from 2.15.0 to 2.15.2 (#1278) Bumps [pylint](https://github.com/PyCQA/pylint) from 2.15.0 to 2.15.2. - [Release notes](https://github.com/PyCQA/pylint/releases) - [Commits](https://github.com/PyCQA/pylint/compare/v2.15.0...v2.15.2) --- updated-dependencies: - dependency-name: pylint dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Allow the user to logout with a malformed or expired token [#1257] (#1305) * Allow the user to logout with a malformed or expired token. * Fix formatting. * Fix test comment. * Update changelog. * Bump fideslib version to raise a 403 if the supplied token is malformed instead of a 500. * Allow the root user to logout. * Bump faker from 14.1.0 to 14.2.0 (#1315) Bumps [faker](https://github.com/joke2k/faker) from 14.1.0 to 14.2.0. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v14.1.0...v14.2.0) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update fastapi-pagination[sqlalchemy] requirement (#1316) Updates the requirements on [fastapi-pagination[sqlalchemy]](https://github.com/uriyyo/fastapi-pagination) to permit the latest version. - [Release notes](https://github.com/uriyyo/fastapi-pagination/releases) - [Commits](https://github.com/uriyyo/fastapi-pagination/compare/0.9.3...0.10.0) --- updated-dependencies: - dependency-name: fastapi-pagination[sqlalchemy] dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-urllib3 from 1.26.23 to 1.26.24 (#1317) Bumps [types-urllib3](https://github.com/python/typeshed) from 1.26.23 to 1.26.24. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-urllib3 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pandas from 1.4.3 to 1.4.4 (#1318) Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.4.3 to 1.4.4. - [Release notes](https://github.com/pandas-dev/pandas/releases) - [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md) - [Commits](https://github.com/pandas-dev/pandas/compare/v1.4.3...v1.4.4) --- updated-dependencies: - dependency-name: pandas dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Manual Webhook Followup: UI scopes / Delete [#1228] (#1308) * Add new scopes related to uploading privacy request data or viewing privacy request data to the UI. * Set up manual webhooks to cascade delete if their connection config is deleted. * Mypy issues. * Utility to update saas configs and datasets on system startup (#1307) * Add utility to update SaaS connector instances based on template updates Utility is invoked on server bootstrap. Updates made to the connector template registry over time are meant to be automatically applied to existing SaaS connector instance configurations that are already present in the DB. * Refactor SaaS config instantation to use shared helpers * Update changelog * Improve SaaS config update logic to safely update configs Instead of deleting existing configs, update in place. Simplify logic to not validate secrets unnecessarily. Revert intsantation endpoint to existing implementation as it no longer shares functionality with update logic. * Improve db session management to use and close shared session * Update fixture to not rely on API endpoints Revert instantantiation endpoint test back to its original functionality * Remove new get_config classmethod as it is no longer needed * Adjust dataset creation function name for clarity * Fix up outdated mock function reference * Add test coverage for removal or addition of a connector param Include some variable renaming to try to clarify test cases Co-authored-by: Adam Sachs * 1154 send email upon privacy request receipt (#1303) * Add generic request sorting button (#1320) * Add generic request sort button * Update changelog * Implement PR feedback * Rename PrivacyRequestIdentity schema to Identity (#1324) * Rename PrivacyRequestIdentity schema to Identity * Update changelog Co-authored-by: Paul Sanders * 1155 email upon privacy request review (#1306) * Manual Webhook Followup: UI Sync [#1326] (#1323) * Make a manual webhook "testable" - which just asserts that a valid manual webhook configuration exists. * Allow dsr_package_label to be an empty string but then convert to match pii field in that case. * Changelog * Respond to CR * Fix mypy error. * Explicitly install the `toml` package (#1338) * Explicitly install `toml` as a requirement Previously this package was included as an indirect dependency only, but imported in source code as if it were a direct dependency. This led to installation issues for consumers of the `fidesops` `pip` package. * Reduce `toml` import volume * Update `CHANGELOG.md` * Add consent request table (#1340) * Add consent crequest table * Update changelog * Fix isort and black Co-authored-by: Paul Sanders * Updated Configuration settings: Connector parameters and Dataset configuration (#1247) * Added Saas dataset configuration * Edits to Saas dataset configuration * Edits to Saas dataset configuration * Edits to Saas dataset configuration * Refactor Connector Parameters * Refactor Connector Parameters * Refactor Connector Parameters * Refactor Connector Parameters * Reset Connection state when AddConnection component is unmounted * Added Connection Identifier validation * Updated ConnectionIdentifier validation to be removed from the JSX markup inline * Added the verify=false to the query string for the API route to update the connection config secrets. This is to not connect directly to a given DB connector. * Refactored Connector Parameters * Reset Connection object state when the ConfigureConnector component is mounted * Updated Connector Parameters * Updated the toast notification placement to be positioned via top * Updated CHANGELOG.md file 922 - Add a Connector - DB connector configs 923 - Add a Connector - upload a DB Dataset YAML 1090 - Add a Connector - SaaS Dataset Management (YAML method) * Updated CHANGELOG.md file * Resolved Prettier format issue * Resolved npm run build issues * add permissions to list * Refactored Dataset Configuration * Refactored Dataset Configuration * Refactored Dataset Configuration * Refactored Dataset Configuration * 1015 - Frontend - Configure a Manual entry connector * 1015 - Frontend - Configure a Manual entry connector * 1015 - Frontend - Configure a Manual entry connector * 1015 - Frontend - Configure a Manual entry connector * Updated the UI to display the human readable value for the selected Connector * Code review feedback changes * Remove commented out code which is unnecessary * Redirect the user back to the Datastore Connections landing page * Updated DSR Customization user instruction verbiage * Removed hard coded string literals in ConfigureConnector component * If a connection has been initially created, then auto redirect the user accordingly * Resolved issue with ConnectionsEmptyState component not be displayed when there are no connections * Reverted fidesops.toml file * add scopes to allowed list of permissions Co-authored-by: Sean Preston * pin version of pyjwt (#1343) * Upgrades `pyjwt` to `2.5.0` (#1344) * pin version of pyjwt * assert against encoded identity not hardcoded * Fixing Stripe Tests (#1352) * Updating assertions and using a unique erasure identity email per test run * Fixing sort order * Fix Corner Case: Retrieving Access Results from Cache on Retry [#1348] (#1349) * Fix bug where erasure count confirmations may be returned instead of selected access request results when attempting to get access requests from the cache. Because erasure requests are run after access requests, there normally isn't erasure results in the cache when we attempt to get access results. However, if we were retrying a privacy request from a checkpoint that had already erased data, we could possibly return erasure results instead of access results, depending on if the access or erasure key was accessed last. * Update CHANGELOG. * Bump pytest from 7.1.2 to 7.1.3 (#1342) Bumps [pytest](https://github.com/pytest-dev/pytest) from 7.1.2 to 7.1.3. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/7.1.2...7.1.3) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-ujson from 5.4.0 to 5.5.0 (#1355) Bumps [types-ujson](https://github.com/python/typeshed) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-ujson dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * v1.8.0 Release Checklist (#1345) * updates changelog * updates ERD * add an execution_timeframe to quickstart policies * turn feature flag on * format flags * Manual Webhooks: Surface if Data Received even if Empty [#1350] (#1339) * For UI purposes, when retrieving any manually input data, distinguish whether the user has confirmed they looked for data, in that they've manually uploaded something, even if everything was empty. In this case: checked=True. * Prevent entering a pii or dsr_label as " ". * Fix unit test. * Update Changelog. Co-authored-by: Sean Preston * 1310- use existing celery queue for all email dispatch (#1341) * 1310- use existing celery task for all email dispatch * changelog * force sync for some use cases, update tests accordingly * format * fix integration tests * Fix Redis Cache Expiring Prematurely in Tests (#1358) * Reset the cache expiration in testing so it doesn't potentially affect other long-running tests that depend on the cache. * Update Changelog. * 334 api key authentication strategy (#1331) * Add api_key authentication strategy * Update SaaS configs to use new api_key auth strategy * Update changelog * Simplify api_key auth config by requiring lists for fields Update field names to be plural to reflect that they are multi-value lists/arrays. * Remove query_param auth strategy The query_param auth strategy can now easily be implemented as an `api_key` auth strategy, which provides the same functionality and more. * Update api_key auth model to reference Header model class * Update changelog to include query_param auth strategy removal note Co-authored-by: Adam Sachs * Initial Refactor for Consent Intake UI (#1363) * Refactor Card markup out and create ConsentCard * Refactor Modals and create Consent page items * Make `VerificationForm` generic * Remove consent code * Remove consent.svg * Remove consent config options * Update CHANGELOG.md * Switch policy_key back to download * Updating offset pagination strategy to parse numeric strings as integers (#1364) * Rollbar (Access) (#1361) * Updating changelog (#1366) * Removed connector from repository (#1372) * Removed connector from repository * Remove unused test fixture * Delete unused integration test * Update pytest markers * Remove connector dataset file * Update CHANGELOG.md * Fix number of connectors in SaaS tests Co-authored-by: Neville Samuell Co-authored-by: Paul Sanders * Add a Timescale Connector [#1311] (#1327) * Add a Timescale POC using the existing postgres connector. * Add some basic tests for timescale including verifying we have connected and populated the database, and a simple access and erasure request. * Use the setup script to populate. * Update host. * Update the port for timescale testing. Should be 5432 because we are inside the network, not outside. * Update changelog. * Remove breakpoint. * Create a timescale hypertable and demonstrate running an access query. * Demonstrate masking of records in the timescale onsite_personnel hypertable. * Update data/dataset/timebase_example_test_dataset.yml Co-authored-by: Paul Sanders * Close a timescale session and add supporting code comments for why we're subclassing the postgresql connector. * Use uuid's for privacy request id's in the test_sql_task file Co-authored-by: Paul Sanders * Set Schema for Postgres Connector [#1362] (#1375) * Allow a schema to be specified for Postgres beyond the default schema. - Add db_schema as an optional postgres secret. - Add an empty set_schema method on the Base SQL Connector that can optionally be added on a subclass to set a schema for an entire session. - Define PostgreSQLConnector.set_schema to set the search path - Add a required secrets_schema property to be defined on every SQLConnector - Move "create_client" to the base SQLConnector and remove most locations where it was overridden because the primary element that was changing was the secrets schema. - Remove Redshift overrides for retrieve_data and mask_data since their only purposes are to set the schema, which the base sql connector can now do. * Update CHANGELOG. * Update the secrets format in testing now that db_schema can be optionally set. * Update separate missed test concerning new db_schema secrets attribute * Update CHANGELOG.md * Random import removed from this file. * move everything into src/fides/ * update code paths for ops * update fidesctl imports * run isort * Unified fides (#1121) * Delete Datastore [Frontend] (#683) * Link Delete Connection menu item with confirmation modal, patterned off of user delete modal. * Update changelog. * Vertically center modals. * Add a spinner while collection is being deleted. Only close modal after successful deletion. * Prevent closing modal while we're still making the delete request. * 546 - [Admin UI] Change "Policy Name" to "Request Type" on SR list page (#696) * 546 - [Admin UI] Change "Policy Name" to "Request Type" on SR list page * Rollback file change * Updated CHANGELOG.md file Co-authored-by: Christopher Calhoun * Enable/Disable Datastores [Frontend] (#693) * Add the ability to enable/disable a connectionconfig. * Fix other location to prevent from closing modal while in progress. * Update changelog. * 659 Add Postgres and Redis to health endpoint (#690) * adds db and redis to health endpoint, untested * updates typing, suppresses sqlalchemy and alembic logs for healthchecks * adds to makefile, updates docs and tests * format * adds check for cache enabled, update tests * format * standardize health endpoint structure * Execute Privacy Requests with Celery (#621) Updates the way privacy requests are dispatched into processing from a background process into a Celery task * 512 db redis health (#686) * catches exceptions from db/redis and provides better errors on startup * move health endpoint changes to separate branch * update changelog * catch appropriate redis err, stop app upon db and cache connection failure * adds check for cache enabled * Datastore Connection Filtering (#691) * Refactor routes into enums and create connections page * Test switching back to double quotes * Convert back to double quotes * Add placeholder connection filters * Set up api scaffolding * Get basic grid going * Initial grid card styling * Fix simple eslint issues * Add development config back in * Finish draft of card * Add working test button and landing page * Add pagination and small fixes * Fix testing issues * Add auth tests for datastore connection page * run formatter * Update changelog * update the create_test_data command to add connectionconfigs * Disable create buttons & fix text overflow * Update filter dropdown values * Fix test timestamp bug * Remove development variable * Add working filter dropdowns * Add outside click hook & polish things * Fix imports * Update changelog * Update button hover color * remove commented out code * fix typo * Remove Saas Option * Fix welcome screen bug * Remove edit button * Fix lint and formatting issues * removes commented-out code Co-authored-by: Sean Preston Co-authored-by: eastandwestwind * update domain -> host config references in stripe and sentry test infrastructure (#698) Co-authored-by: Adam Sachs Co-authored-by: Adrian Galvan * Clean up postman collection (#704) * Revoke a Pending Privacy Request [#525] (#592) * Add the ability to cancel a pending task. The celery task is not actually cancelled yet. - Track cancel reason, datetime cancelled, and add a new cancelled status. * Add drp revoke request to postman collection. * Add drp revoke docs. * Update down_rev after rebase. * Fix incorrect check. * Restore new canceled state. * Check that the privacy request is not canceled right before starting execution. This is really our last chance to check before we start executing the graph in dask. The use case here might be it was canceled shortly after it was approved. * Attempt to revoke a queued celery task if we cancel it before it starts executing. * Prettier. * Changelog updated. * Add a few unit tests around how triggering the run_privacy_request_task with a cancelled task id doesn't do anything and how you can't approve a canceled privacy request. * Fix SQLAlchemy logging to console - logging in migration propagates to the rest of the application. * Refresh session instead of creating a new one. * Add 200 character limit. * Add some assertions that db.refresh is doing what we think it's doing. * Update CHANGELOG.md, bump to `fideslib==2.1.0` (#705) * bump version of fideslib * updates changelog pre-release * Update datastore connection filters to support clearing (#701) * Update connection filters to clear * Use new common header function for analytics * Update prepareHeaders function to make type checker happy * Update changelog * Management UI updates (#702) * reorder ui docs * admi ui * subject request detail finalization, datastore stub * config edit * comment out docs not implemented * remove tracking * changelog * remove stray comment, add Canceled status * Remove stray hyphen (#709) * Reduce docker image size (#707) * Reduce docker image size * Update CHANGELOG Co-authored-by: Paul Sanders * Bump next-auth from 4.3.2 to 4.5.0 in /clients/privacy-center (#694) Bumps [next-auth](https://github.com/nextauthjs/next-auth) from 4.3.2 to 4.5.0. - [Release notes](https://github.com/nextauthjs/next-auth/releases) - [Changelog](https://github.com/nextauthjs/next-auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/nextauthjs/next-auth/compare/next-auth@v4.3.2...next-auth@v4.5.0) --- updated-dependencies: - dependency-name: next-auth dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * update tutorial directions to install fidesdemo from the root directory (#715) * update tutorial directions to install fidesdemo from the root directory * changelog * [SaaS Connector] Salesforce (access) (#676) Co-authored-by: Adam Sachs Co-authored-by: Hamza W * Parallelize CI safe checks (#717) * Parallelize CI safe checks * Update CHANGELOG Co-authored-by: Paul Sanders * Make reading of environment variables case insensitive (#712) * Make reading of environment variables case insensitive * Update CHANGELOG Co-authored-by: Paul Sanders * Add dependabot (#718) * Add dependabot * Update CHANGELOG * Update CHANGELOG Co-authored-by: Paul Sanders * Bump requests-mock from 1.8.0 to 1.9.3 (#732) Bumps [requests-mock](https://github.com/jamielennox/requests-mock) from 1.8.0 to 1.9.3. - [Release notes](https://github.com/jamielennox/requests-mock/releases) - [Commits](https://github.com/jamielennox/requests-mock/compare/1.8.0...1.9.3) --- updated-dependencies: - dependency-name: requests-mock dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump packaging from 20.9 to 21.3 (#733) Bumps [packaging](https://github.com/pypa/packaging) from 20.9 to 21.3. - [Release notes](https://github.com/pypa/packaging/releases) - [Changelog](https://github.com/pypa/packaging/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pypa/packaging/compare/20.9...21.3) --- updated-dependencies: - dependency-name: packaging dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-redis from 4.2.6 to 4.3.2 (#729) Bumps [types-redis](https://github.com/python/typeshed) from 4.2.6 to 4.3.2. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-redis dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump faker from 8.12.1 to 13.14.0 (#730) Bumps [faker](https://github.com/joke2k/faker) from 8.12.1 to 13.14.0. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v8.12.1...v13.14.0) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/setup-python from 2 to 4 (#724) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 2 to 4. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v2...v4) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/checkout from 2 to 3 (#723) Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump github/codeql-action from 1 to 2 (#725) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 1 to 2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/v1...v2) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump docker/login-action from 1 to 2 (#722) Bumps [docker/login-action](https://github.com/docker/login-action) from 1 to 2. - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/v1...v2) --- updated-dependencies: - dependency-name: docker/login-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/setup-node from 2 to 3 (#726) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2 to 3. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [#716] update datastore documentation (#742) * Adds `fidesops worker` command to start the Celery worker [#663] (#673) * add fidesops worker cmd * rename Dockerfiles, adds worker specific dockerfile with no frontend * formatting * update container names, add separate dockerfile for worker * pass worker args through to worker_main * rename containers fidesops -> webserver, celery -> worker * fix imports * add return type * update dockerfile * describe changelog * specify same argv for all celery instantiation * add logging to cli * add back .egg * specify dockerfile to build from * 708 - fix console warning in disable connections (#750) * removes unneeded code in disable connection * Bump fideslib from version 2.1.0 to 2.1.1 (#721) * Bump fideslib from version 2.1.0 to 2.1.1 * Update CHANGELOG Co-authored-by: Paul Sanders * Password Hashing update (#749) * Fix no such container error with docker-compose (#758) Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * 1.6.1 release (#763) * Update CHANGELOG for release * Update CHANGELOG Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * Bump psycopg2-binary from 2.9.1 to 2.9.3 (#783) Bumps [psycopg2-binary](https://github.com/psycopg/psycopg2) from 2.9.1 to 2.9.3. - [Release notes](https://github.com/psycopg/psycopg2/releases) - [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS) - [Commits](https://github.com/psycopg/psycopg2/commits) --- updated-dependencies: - dependency-name: psycopg2-binary dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2021.10.0 to 2022.6.1 (#781) Bumps [dask](https://github.com/dask/dask) from 2021.10.0 to 2022.6.1. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2021.10.0...2022.6.1) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump alembic from 1.6.5 to 1.8.0 (#780) Bumps [alembic](https://github.com/sqlalchemy/alembic) from 1.6.5 to 1.8.0. - [Release notes](https://github.com/sqlalchemy/alembic/releases) - [Changelog](https://github.com/sqlalchemy/alembic/blob/main/CHANGES) - [Commits](https://github.com/sqlalchemy/alembic/commits) --- updated-dependencies: - dependency-name: alembic dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump sqlalchemy-bigquery from 1.3.0 to 1.4.4 (#779) Bumps [sqlalchemy-bigquery](https://github.com/googleapis/python-bigquery-sqlalchemy) from 1.3.0 to 1.4.4. - [Release notes](https://github.com/googleapis/python-bigquery-sqlalchemy/releases) - [Changelog](https://github.com/googleapis/python-bigquery-sqlalchemy/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/python-bigquery-sqlalchemy/compare/v1.3.0...v1.4.4) --- updated-dependencies: - dependency-name: sqlalchemy-bigquery dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pytest-cov from 2.11.1 to 3.0.0 (#787) Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 2.11.1 to 3.0.0. - [Release notes](https://github.com/pytest-dev/pytest-cov/releases) - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v2.11.1...v3.0.0) --- updated-dependencies: - dependency-name: pytest-cov dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump apscheduler from 3.8.0 to 3.9.1 (#789) Bumps [apscheduler](https://github.com/agronholm/apscheduler) from 3.8.0 to 3.9.1. - [Release notes](https://github.com/agronholm/apscheduler/releases) - [Changelog](https://github.com/agronholm/apscheduler/blob/3.9.1/docs/versionhistory.rst) - [Commits](https://github.com/agronholm/apscheduler/compare/3.8.0...3.9.1) --- updated-dependencies: - dependency-name: apscheduler dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-pyyaml from 6.0.8 to 6.0.9 (#791) Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.8 to 6.0.9. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-pyyaml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * [#681] add documentation on fideslog use (#751) * [#681] add documentation on fideslog use * changelog * update fidesops use wording * Fideslib models (#700) * WIP * WIP * WIP * WIP * Use available exceptions from fideslib * Fix failing tests * Fix policy tests * Remove debugging code * Fix failing tests * Fix failing tests * Fix failiing tests * Run black and isort * Make pylint in docker happy * Clean up migrations * Move downgrade point of table renames * Remove Dockerfile temp workaround and fix pylint errors * Fix failing tests * Remove jwt.py Co-authored-by: Paul Sanders * 660 Add support for multiple statuses to be selected for filtering subject requests (#802) Co-authored-by: Dawn Pattison * Resolve issue with MyPy seeing files in fidesops as missing imports (#719) Co-authored-by: Paul Sanders * 249 saas connector zendesk ticket erasure (#775) Co-authored-by: Hamza W Co-authored-by: Adrian Galvan * Fixing `check-migration` command (#806) * Fix issue requiring separate install of snowflake-connector-python (#807) * Fix issue requiring separate install of snowflake-connector-python * Update CHANGELOG Co-authored-by: Paul Sanders * 513 - [Admin UI] Update Subject Request status filter to be a multise… (#764) Co-authored-by: Christopher Calhoun * 706 Adds SaaS connection type to SaaS yaml config (#748) * Adds Saas type to saas yaml config * To allow data migration that queries on a connectiontype enum to work, update previous schema migrations that used "alter type" to update connection type to rename the enum type, create a new enum with the new types, and then delete the old enum type. Co-authored-by: Dawn Pattison * Make `worker` node optional (#770) * default fidesops to running the worker and webserver on same container * default to using a worker, add docker config for worker * update changelog * USE_DEDICATED_WORKER -> WORKER_ENABLED * add basic descriptions for celery vars to docs * remove unused import * add Make command for a server + worker * GET Available Connectors [#706] (#768) * Adds Saas type to saas yaml config * alter postman collection * updates changelog * lint fixes * Add endpoint to surface all available connectors including database options and saas options. * Exclude custom and manual types from list of available connectors. - Add docs and postman collection. * Update changelog. * Remove committed ANALYTICS_ID. * Import ClientDetail from fideslib instead of fidesops. * Fix import order. Co-authored-by: eastandwestwind * Endpoint: Return Secrets for a Connector Type [#753] (#795) * Adds Saas type to saas yaml config * alter postman collection * updates changelog * lint fixes * Add endpoint to surface all available connectors including database options and saas options. * Exclude custom and manual types from list of available connectors. - Add docs and postman collection. * Update changelog. * Add an endpoint to fetch the types of secrets that should be supplied for a given connection type. - Relocate "load_config" which we use to load saas config yamls, now that we have another use case beyond unit tests. * Dynamically override the SaaSSchema docstring for a given saas connector type, so the description isn't abstract. - Update changelog - Add docs - Add endpoint to postman collection * Add missing import. * Add a request method to docs. * Update docstring. * Remove committed ANALYTICS_ID. * Import ClientDetail from fideslib instead of fidesops. * Fix import order. * Restore removed items in changelog. Co-authored-by: eastandwestwind * Add fixture to clear tables between test (#680) * Add fixture to clear tables between test runs * Update CHANGELOG * Add missing ordering to customer_details logs query in test. * update import path Co-authored-by: Paul Sanders Co-authored-by: Dawn Pattison Co-authored-by: Sean Preston * Replace user authentication routes with fideslib routes (#811) Co-authored-by: Paul Sanders * test fixing publish_docs ci action (#818) * test fixing publish_docs ci action * update branch target to * try another commit to see if publish_docs is triggered * revert change to branch target * allow publish docs on test branch (#819) * allow publish docs on test branch * remove main * trying new empty commit * reverting to main * Temporarly disable paths * Revert temporary test * Add makefile * pull latest Co-authored-by: Paul Sanders * Update Celery config defaults (#808) * update celery config defaults, set to redis settings if none provided * rename REDIS_CONNECTION_URL to CONNECTION_URL * add var to config reference * make DB index optional, use f'string * adds support for redis USER * add default for db_index in format string * set correct default for USER * Bump next-auth from 4.5.0 to 4.9.0 in /clients/privacy-center (#823) Bumps [next-auth](https://github.com/nextauthjs/next-auth) from 4.5.0 to 4.9.0. - [Release notes](https://github.com/nextauthjs/next-auth/releases) - [Changelog](https://github.com/nextauthjs/next-auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/nextauthjs/next-auth/compare/next-auth@v4.5.0...next-auth@v4.9.0) --- updated-dependencies: - dependency-name: next-auth dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fideslib to handle base64 encoded password (#820) * Handle hashed password * Update CHANGELOG * Fix failing test and use UserPasswordReset schema from fideslib * Restore fidesops.toml Co-authored-by: Paul Sanders * update local deployment for serving the ui [#644] (#827) * update local deployment for serving the ui * changelog * Skip Masking of Uvicorn Logs [#766] (#831) * Update get_fides_log_record_factory to skip masking of all uvicorn logs. * Update changelog. * 832 - Create new user gives HTTP 422 Unprocessable Entity exception (#833) * 832 - [User Management] Create new user gives HTTP 422 Unprocessable Entity exception * Updated CHANGELOG.md file * [Admin UI] Change Login Page Wording (#774) * sign in to instead of sign into Changing the wording of the admin ui page to improve grammatical accuracy. * fides admin-ui wording changelog * added link to pr * fix typo on subject identities * updated changelog * typo * Fix bug in client with no scopes (#830) Co-authored-by: Paul Sanders Co-authored-by: eastandwestwind * 599 clipboard icon (#838) * replace clipboard icon * temp fix for auth * revert last change * changelog * adds concurrency to unsafe check jobs (#835) * Reduce docker image size (#846) * Reduce docker image size * Update CHANGELOG Co-authored-by: Paul Sanders * [#743] Store provided identity data in application database (#834) * adds identity fields to PrivacyRequest model * store identity data inside database * update changelog * add identities in test data command * store identities provided via the DRP creation endpoint * black + isort * store provided identity data in request creation from onetrust * remove deprecated migration * adds new provided identity table * use new provided identity table * add docstring, remove comment * update DRP privacy request creation to use ProvidedIdentity model * update identity creation in test data command * use persisted identity in OneTrust * update test to use persisted identity * isort update * use enums * optionally receive a salt in hash_value cmd * use a constant salt for provided identity hashing * remove import * use typehints * update typedef * use enum in dict * Bump faker from 13.14.0 to 13.15.0 (#848) Bumps [faker](https://github.com/joke2k/faker) from 13.14.0 to 13.15.0. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.14.0...v13.15.0) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump unidecode from 1.2.0 to 1.3.4 (#849) Bumps [unidecode](https://github.com/kmike/text-unidecode) from 1.2.0 to 1.3.4. - [Release notes](https://github.com/kmike/text-unidecode/releases) - [Commits](https://github.com/kmike/text-unidecode/commits) --- updated-dependencies: - dependency-name: unidecode dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update fastapi-pagination[sqlalchemy] requirement (#852) Updates the requirements on [fastapi-pagination[sqlalchemy]](https://github.com/uriyyo/fastapi-pagination) to permit the latest version. - [Release notes](https://github.com/uriyyo/fastapi-pagination/releases) - [Commits](https://github.com/uriyyo/fastapi-pagination/compare/0.8.3...0.9.3) --- updated-dependencies: - dependency-name: fastapi-pagination[sqlalchemy] dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump black from 22.3.0 to 22.6.0 (#855) Bumps [black](https://github.com/psf/black) from 22.3.0 to 22.6.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.3.0...22.6.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Updating SaaSType enum (#857) * Serve UI from root (#720) * Refactor user management UI code (#839) * Refactor pages to use the same Layout * Add UserForm.tsx * Add Yup validation schema * Integrate refactored form to New route * Styling * WIP refactor EditUserForm * Fix EditUserForm typescript errors * Refactor handleSubmit * Small fixes to EditUserForm * Make call to get scopes earlier so form will be populated on first render * Update changelog * Search for `PrivacyRequest` based on hashed identity [#765] (#847) * adds identity fields to PrivacyRequest model * store identity data inside database * update changelog * add identities in test data command * store identities provided via the DRP creation endpoint * black + isort * store provided identity data in request creation from onetrust * remove deprecated migration * adds new provided identity table * use new provided identity table * add docstring, remove comment * update DRP privacy request creation to use ProvidedIdentity model * update identity creation in test data command * use persisted identity in OneTrust * update test to use persisted identity * isort update * use enums * optionally receive a salt in hash_value cmd * use a constant salt for provided identity hashing * remove import * use typehints * update typedef * use enum in dict * test for exact match search * added exact match search to request status api * import order * update CHANGELOG * documentation reorganization and page standardization (#858) * copy changes to fix docs outlining [#427] and standardize formatting [DOX-216] * Fix `create_test_data` (#862) * Fix create_test_data * Update CHANGELOG Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * Bump pre-commit from 2.9.3 to 2.20.0 (#853) Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 2.9.3 to 2.20.0. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v2.9.3...v2.20.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Return persisted identities in `get_request_status` view (#860) * 671 - [Datastore Management] Include Icon with datastore connection (FE) (#845) * 671 - [Datastore Management] Include Icon with datastore connection (FE) * 671 - [Datastore Management] Include Icon with datastore connection (FE) * Updated CHANGELOG.md file * 671 - [Datastore Management] Include Icon with datastore connection (FE) Resolved import statement issues * 671 - [Datastore Management] Include Icon with datastore connection (FE) Resolved import statement issues * 671 - [Datastore Management] Include Icon with datastore connection (FE) Resolved import statement issues * 671 - [Datastore Management] Include Icon with datastore connection (FE) Resolved import statement issues * 671 - [Datastore Management] Include Icon with datastore connection (FE) 1. Updated connector svg images 2. Added default style to Spinner component * 671 - [Datastore Management] Include Icon with datastore connection (FE) Deleted unnecessary file * 671 - [Datastore Management] Include Icon with datastore connection (FE) Updated MySQL and Outreach .svg files * Renamed connectors folder to connector-logos * Resolved misspelling error in import statement * Code review feedback * Code review feedback * Populate dataset (#844) * Correct test name for mypy in safe_pr_checks.yml (#875) Co-authored-by: Paul Sanders * Adds `celery.toml` for loading custom Celery config [#821] (#865) * adds option to configure EVENT_QUEUE_PREFIX for celery * provide the option to specify a default queue name too * update celery config to load in from its own config toml file * updates changelog * update value for event_queue_prefix * test celery config overrides * include config_path arg * add type def * add config path to execution settings * correct values * add celery configuration to docs (#872) * update config reference * additional documentation on celery configs [#755] * add celery.toml reference * define optional celery config and overrides * reword config links * link to lowercase settings * v1.6.2 Release Checklist (#881) * updates changelog * update ERD * use star * splits IMAGE_NAME into COMPOSE_SERVICE_NAME for docker compose services as naming has diverged (#884) * belated changelog push (#885) * Move root-level docker files into docker/ subdir (#877) * Move root-level docker files into docker/ subdir * move all of the compose files * remove root aux compose files, refactor away the no-db and worker compose files * unify the app and worker dockerfiles into a single file that leverages build stages * move python scripts into a subdir, fix paths in compose integration files * fix the script tests * use python sleep instead of system sleep, fix script paths * remove the analytics_id that accicentally got committed * updated changelog * move the sample sql data to a subdir of docker/ so it can be mounted * update the teardown command and fix the integration files * fix more path typos * more desperate tweaks * fix mysql/mariadb/mongo tests * added an additional build step if mssql not there, all tests passing * fix an accidental lowercasing * Apply suggestions from code review Co-authored-by: Paul Sanders * Update CHANGELOG.md Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders * 745 - [Datastore Management] Keep datastore cards in 1/3 screen pattern (#873) * 745 - [Datastore Management] Keep datastore cards in 1/3 screen pattern * 745 - [Datastore Management] Keep datastore cards in 1/3 screen pattern Refactored the Datastore Management column border layout design to match Figma. * Updated CHANGELOG.md file * 45 - [Datastore Management] Keep datastore cards in 1/3 screen pattern * 745 - [Datastore Management] Keep datastore cards in 1/3 screen pattern * Fixed import statement * 793 upgrade password hash (#876) * Update config.py * Update crypto imports to fideslib and remove legacy file and tests * Update Identity salt * checkpoint, lowercasing all of the things * update more config values to lowercase * fix linting errors, fix config validators * update the configs to use lowercase keys * lowercase the allowed keys * Update create_test_data.py * bump fideslib version * Lowercase config variables * Fix linting issues * Fix some test failures * Fix application fixtures * Remove old celery config options * Sort script imports * Update changelog Co-authored-by: Thomas * Feat: Vault for secrets (#869) * Replace config/gh secrets with secrets from vault * sorting and update changelog * fix path for importing test helpers * more sorting * run ci again with empty commit * update unsafe_pr_checks * allow for no vault vars for unit tests, adds back back for saas config toml vars * check for client * sort * init client to None * fix imports * fix pytest markers to better indicate which tests rely on actual secrets * Bump pandas from 1.3.3 to 1.4.3 (#896) Bumps [pandas](https://github.com/pandas-dev/pandas) from 1.3.3 to 1.4.3. - [Release notes](https://github.com/pandas-dev/pandas/releases) - [Changelog](https://github.com/pandas-dev/pandas/blob/main/RELEASE.md) - [Commits](https://github.com/pandas-dev/pandas/compare/v1.3.3...v1.4.3) --- updated-dependencies: - dependency-name: pandas dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add dependabot label to dependabot PRs (#898) Co-authored-by: Paul Sanders * [SaaS Connector] Salesforce (erasure) (#888) * 252 saas connector sendgrid (#883) * initial sendgrid saas connector integration. access only, contacts only * erasure (update) support for sendgrid * remove unused imports * update sendgrid test fixture to expect 404 response status code because of ignore_errors enhancement * Fixing import order and cleaning up the retry logic for consistency * add sendgrid env var support to makefile and unsafe_pr_checks config. remove DELETE endpoint per PR comments * Added delete endpoint for contacts * Fixing data_path for contacts endpoint * Reverting search query to improve performance and avoid server timeouts * Updated delete endpoint request, used request instead of SaaSRequest in tests * updated imports after check suggestion * Updated code after review * Removed unused variables, imports * Restoring Makefile * Fixed import cryptographic_util error * Misc fixes * Updated Changelog file * Updated Changelog for unreleased section and pulled main * Updated Changelog and added Sendgrid in unreleased section * Updated Changelog and added Sendgrid in unreleased section with link * Updated Changelog and added Sendgrid in added section after Adam's suggestion Co-authored-by: Adam Sachs Co-authored-by: Adam Sachs Co-authored-by: Adrian Galvan Co-authored-by: Hamza W Co-authored-by: Adrian Galvan * 747 - Users should be able to click on the full field of a dropdown-type filter to open up the dropdown (#903) * 747 - Users should be able to click on the full field of a dropdown-type filter to open up the dropdown * Disabled eslint import/extensions rule for certain files with an alias path in the import statement * Updated CHANGELOG.md file * Resolved jest unit tests from failing * Removed eslint-disable import/extensions declarations * Bump types-redis from 4.3.2 to 4.3.4 (#895) Bumps [types-redis](https://github.com/python/typeshed) from 4.3.2 to 4.3.4. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-redis dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Adds saas config base info to connection config responses (#904) * adds saas config base info to connection config responses * update changelog * add properties to base class * use diff naming to avoid recursion * update saas_config prop for unit tests * another occurance of saas config in unit test * use pydantic alias for type field * sort * revert change to saas type naming * unused import * init parent class so that props are avail on self * revert to using props * Adding privacy_request_id placeholder (#911) * Bump mypy from 0.961 to 0.971 (#914) Bumps [mypy](https://github.com/python/mypy) from 0.961 to 0.971. - [Release notes](https://github.com/python/mypy/releases) - [Commits](https://github.com/python/mypy/compare/v0.961...v0.971) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pydash from 5.0.2 to 5.1.0 (#920) Bumps [pydash](https://github.com/dgilland/pydash) from 5.0.2 to 5.1.0. - [Release notes](https://github.com/dgilland/pydash/releases) - [Changelog](https://github.com/dgilland/pydash/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/dgilland/pydash/compare/v5.0.2...v5.1.0) --- updated-dependencies: - dependency-name: pydash dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update boto3 requirement from ~=1.18.14 to ~=1.24.34 (#917) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.18.14...1.24.34) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.6.1 to 2022.7.0 (#915) Bumps [dask](https://github.com/dask/dask) from 2022.6.1 to 2022.7.0. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.6.1...2022.7.0) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix integration set up scripts for postgres and mariadb - casing has changed for config variables. (#921) * zendesk and salesforce connection docs (#908) * Adobe Campaign access and erasure (#905) * Updated tutorial to match latest fidesdemo (#772) * Correct build arg variable name (#925) * Correct build arg variable name * Update CHANGELOG Co-authored-by: Paul Sanders * Default `FIDESOPS__ADMIN_UI__ENABLED` to `True` (#936) * serve AdminUI by default * updates changelog * Update python docker base image from slim-buster to slim-bullseye (#928) * Update python docker base image from slim-buster to slim-bullseye * Update CHANGELOG * Remove ipython from dev-requirements.txt Co-authored-by: Paul Sanders Co-authored-by: Sean Preston * Update boto3 requirement from ~=1.24.34 to ~=1.24.36 (#939) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.34...1.24.36) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump faker from 13.15.0 to 13.15.1 (#941) Bumps [faker](https://github.com/joke2k/faker) from 13.15.0 to 13.15.1. - [Release notes](https://github.com/joke2k/faker/releases) - [Changelog](https://github.com/joke2k/faker/blob/master/CHANGELOG.md) - [Commits](https://github.com/joke2k/faker/compare/v13.15.0...v13.15.1) --- updated-dependencies: - dependency-name: faker dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump types-ujson from 5.2.0 to 5.4.0 (#947) Bumps [types-ujson](https://github.com/python/typeshed) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-ujson dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add db vs saas to connection type api (#937) * add db vs saas to connection type api * adds changelog line * mypy * fix test * format * more tests * formatting * adds system type query param * format * adjust test saas search * correct query param * Use Nox as the build tool instead of Make (#919) * Create noxfile.py * update the dockerfile with more stages * add GitPython as a dev requirement (used by nox builds) * add the noxfiles, all docker builds work * fix the "make compose-build" command * remove the worker docker stage due to it being redundant with prod * create a unified compose file for integrations * update the password prompt to be accurate * copy/pasta run_infrastructure into the noxfiles dir so it can be called directly via python * add create_user and seed_test_data to the nox utils * docs commands work * get the generic dev command working * add db commands to utils * clean up mypy configuration in pyproject.toml and remove config from setup.cfg * simplify some of the CI targets and start updating the pytest targets * cleanup run_infrastructure * update ci_suite and other CI nox targets * add nox as a dev-requirement * get dev commands working, sans quickstart * tweak to the compose_down constant * get the new pylint target passing * remove analytics_id * updated the changelog * Apply suggestions from code review Co-authored-by: Paul Sanders * fix the xenon command * add a few tweaks to the worker dev command * fix an import issue * update dockerignore * move mssql to the bottom of the datastore list Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders * 863 - Retry a DSR (FE) (#938) * Update docs docker base image from slim-buster to slim-bullseye (#949) * Changed Debian base image * Update the python version to be the same as used in the fidesops app image Co-authored-by: Paul Sanders * Updated changelog Co-authored-by: Dave Quinlan Co-authored-by: Paul Sanders * Experimenting with fixes for the failing MSSQL CI tests (#918) * Change docker password environment variable to MSSQL_SA_PASSWORD * Revert password environment variable name * Set MSSQL user to root in docker-compose * Revert setting root user in docker-compose * Change environment variable name from REQUIRE_MSSQL to SKIP_MSSQL_INSTALLATION * Add healthcheck to mssql compose file * Modify healthcheck command * Revert healthcheck * Try for more loging information * Another try for logging * Another try for logging * Try running only mssql tests to avoid timeout * Revert mssql only flag * Extend time out to try to get logs * Revert extra logging and extended timeout * Set network mode to host * Make mssql run on its own * Remove network from docker-compose and only run mssql in integration * Increase integration test logging * Revert mssql only * Use cache for docker * Fix workflow error * Fix workflow error * Fix target * Fix make traget * Fix make traget * Revert cache * Verify that mssql is running from pytest fixture * Add restart to mssql * Revert rester in docker-compose * Revert wait for mssql in pytest fixture * Wait for mssql to be ready before adding test data * Add count of retries * Update CHANGELOG Co-authored-by: Paul Sanders * Delete custom GitHub issue templates (#955) We've defined generic issue templates for all Ethyca repos here: https://github.com/ethyca/.github/tree/main/.github/ISSUE_TEMPLATE Removing the templates from this repo allows it to automatically pull in the organization templates for consistency. * Bump sqlalchemy-redshift from 0.8.8 to 0.8.10 (#940) Bumps [sqlalchemy-redshift](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift) from 0.8.8 to 0.8.10. - [Release notes](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/releases) - [Changelog](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy-redshift/sqlalchemy-redshift/compare/0.8.8...0.8.10) --- updated-dependencies: - dependency-name: sqlalchemy-redshift dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Move tests into an "ops" subdir (#935) * Create __init__.py * move all of the test files down one dir into `ops` * update test paths * update paths where needed * update the changelog * Dispatch a repository event on new published releases (#945) * Add release dispatch event action * Update `CHANGELOG.md` * Reduce # of clients connected to the application db [#810] (#944) * Reduce number of open connections: - Limit task concurrency to two per worker. - Create one Engine per celery process which opens up a connection pool. Create one Session per celery process and use that session across privacy requests. - Close the session after the privacy request has finished executing. This just resets the session and returns connections back to the pool. It can be reused. - Remove unnecessary places where session is closed manually because the session is being used as a context manager and is already closed through that. - Pass the same Session that the privacy request is using through to TaskResources to be re-used to create ExecutionLogs instead of opening up a new Session. - Don't close the session when passing it into the Execution Log, wait until the entire privacy request is complete/exited. * Define "self" for run_privacy_task - it's the task itself. For mypy's benefits, define that the session is a context manager. * Make a session non-optional for graph_task.run_access_request, graph_task.run_erasure, and for instantiating taskResources * Use missing db fixture. * Add missing db resource. * Update test to reflect new behavior that disabling a datasource while a request is in progress can cause related collections to be skipped once the current session is expired and the connection config has the most recent state. Because the same Session that is being used to run the PrivacyRequest is now being used for ExecutionLogs, the process of saving an ExecutionLog runs a session.commit() which expires the Session and causes the ConnectionConfig to have the most recent state the next time it is accessed. * Update CHANGELOG. * enable worker by default in our dockerfile (#958) * add extra steps to make clean (#767) * Push `dev` image on pushes to `main` (#956) * Update publish_to_dockerhub.yml * add a dev step and use nox * update the changelog * Move Client Code into an `ops` subdir (#964) * Move Client Code into an `ops` subdir * move all of the files * update the dockerfile * update package.json * update codepaths for workflow tests * Update the changelog and docs references * Update .github/dependabot.yaml * Bump gitpython from 3.1 to 3.1.27 (#971) Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1 to 3.1.27. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.0...3.1.27) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix the `nox -s dev` command not spinning up the webserver (#959) * Update dev_nox.py * spin up the app before running a container shell * [#927, #929, #930] sendgrid, adobe, outreach connector docs (#951) * Bump sqlalchemy-utils from 0.37.8 to 0.38.3 (#968) Bumps [sqlalchemy-utils](https://github.com/kvesteri/sqlalchemy-utils) from 0.37.8 to 0.38.3. - [Release notes](https://github.com/kvesteri/sqlalchemy-utils/releases) - [Changelog](https://github.com/kvesteri/sqlalchemy-utils/blob/master/CHANGES.rst) - [Commits](https://github.com/kvesteri/sqlalchemy-utils/compare/0.37.8...0.38.3) --- updated-dependencies: - dependency-name: sqlalchemy-utils dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump pyodbc from 4.0.32 to 4.0.34 (#980) Bumps [pyodbc](https://github.com/mkleehammer/pyodbc) from 4.0.32 to 4.0.34. - [Release notes](https://github.com/mkleehammer/pyodbc/releases) - [Commits](https://github.com/mkleehammer/pyodbc/compare/4.0.32...4.0.34) --- updated-dependencies: - dependency-name: pyodbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.7.0 to 2022.7.1 (#967) Bumps [dask](https://github.com/dask/dask) from 2022.7.0 to 2022.7.1. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.7.0...2022.7.1) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump alembic from 1.8.0 to 1.8.1 (#989) Bumps [alembic](https://github.com/sqlalchemy/alembic) from 1.8.0 to 1.8.1. - [Release notes](https://github.com/sqlalchemy/alembic/releases) - [Changelog](https://github.com/sqlalchemy/alembic/blob/main/CHANGES) - [Commits](https://github.com/sqlalchemy/alembic/commits) --- updated-dependencies: - dependency-name: alembic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix erroneous values in the Outreach config (#988) * Add documentation for new nox commands (#981) * Add documentation for new nox commands * changelog * missed make to nox edits * review edits * update `nox -s dev` to not open a shell, add it as a posarg option * Apply suggestions from code review * remove the analytics id * update typo * remove extra numbering Co-authored-by: Thomas * Bump types-toml from 0.10.7 to 0.10.8 (#998) Bumps [types-toml](https://github.com/python/typeshed) from 0.10.7 to 0.10.8. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-toml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fideslog from 1.2.1 to 1.2.2 (#996) Bumps [fideslog](https://github.com/ethyca/fideslog) from 1.2.1 to 1.2.2. - [Release notes](https://github.com/ethyca/fideslog/releases) - [Commits](https://github.com/ethyca/fideslog/compare/v1.2.1...v1.2.2) --- updated-dependencies: - dependency-name: fideslog dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Added Choose your connection feature (#987) * Added Choose your connection feature 760-Add a Connection - Select a connector to configure (front end) 866-Add a Connection - Front End layout structure * Updated CHANGELOG.md file * Fix lint issues * Fix build issue * Hide overflow Co-authored-by: Andrew Jackson * saas request overrides (#986) * initial cut of saas request overrides. include mailchimp as an example and test case. minor refactor of some of the saas request execution to enable smoother override * fix rebase issue by moving saas override tests into ops subdir * import path updates to resolve conflicts caused by rebase * add session parameter into graph task calls to fix saas override integration tests caused by rebase * update changelog * tweaks to saas connector overrides and associated tests * expose override factory register as module variable for clenaer decorator calls Co-authored-by: Adam Sachs * Update OAuth strategy to be able to perform local testing (#962) * Update boto3 requirement from ~=1.24.36 to ~=1.24.42 (#1001) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [Changelog](https://github.com/boto/boto3/blob/develop/CHANGELOG.rst) - [Commits](https://github.com/boto/boto3/compare/1.24.36...1.24.42) --- updated-dependencies: - dependency-name: boto3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump fastapi[all] from 0.78.0 to 0.79.0 (#1002) Bumps [fastapi[all]](https://github.com/tiangolo/fastapi) from 0.78.0 to 0.79.0. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.78.0...0.79.0) --- updated-dependencies: - dependency-name: fastapi[all] dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * update config reference to use lowercase values (#952) * [#909] update config reference to use lowercase values * changelog * missed uppercase variables * update usages of False to false in connector docs * Added Auth0 Connector (#991) * add pagination back to connection types endpoints (#1019) * add pagination back to connection types endpoints * check for pagination in system_type search Co-authored-by: Paul Sanders * Subject Request Events and Logs Section (#1018) * Fix small issue with eslint config * Get initial drawer working * Add jest config to eslintignore * Fix small css issue * Refactor components and get initial functionality * Fix small logic error * Fix couple of bugs and format code * Conditinally display error tag * Fix issues with merge * Format and lint * Sort imports * Update to new solution * Format code * Update changelog Co-authored-by: Sean Preston * First draft of OAuth documentation (#963) * Send Errored Requests / Reprocessed Requests Info to FidesLog [#754] (#993) * Add a method to format a representation of the graph for caching in Redis and a separate method to build a summary of the differences in the graph when a privacy request is rerun to fideslog. - Adds FieldAddress.from_string method. * Add methods to cache a representation of the access graph when it is built and a separate method to retrieve it from the cache. - Also add a method to build a "rerun_access_graph" AnalyticsEvent for fideslog where applicable. * When running the access portion of the privacy request, log stats about a rerun and then cache the current access graph. - Give a different prefix when we're caching the access graph to not get mixed up with access request results. * Show skipped new edges that are directly upstream of completed nodes instead. These edges are intentionally dropped from the new graph on rerun, so want to surface this count. * Log if a privacy request fails during the "erasure" step of privacy request execution. Even though the access step is not rerun here, compare the previously cached access graph with the access graph that would have been run to determine what data has changed. * Add missing session variables. * Send an event to Fideslog when privacy request execution fails. * Add missed session - bad merge. * Update changelog. * Update docstrings. * Remove copy/paste comment. * Respond to CR comments. * Currently AnalyticsEvent.local_host cannot be None. * Update the compose file and workflows to expect an already-built image (#966) * Update the compose file and workflows to be in line with fidesctl * update the compose file to look for a specific image * rename files and update the safe PR checks * add check_migrations to the ci checks and nox * fix the failing PR checks * fix CI failures * update the unsafe checks workflow * update run_infrastructure to use the compose service name * remove the makefile and the old run_infra script * bump pylint version, pin isort, fix issues * update pytest setup path * update the changelog * make OPS_TEST_DIR a constant * fix nox missing vars * specify that the nox imports are relative imports * remove relative import paths * run isort Co-authored-by: Sean Preston * Create `AuditLog` on privacy request approval (#1038) * Create approval audit logs * Add tests * disable a pylint lint * Update changelog * Update privacy_request fixture * Updating Salesforce to use OAuth2 authentication code flow (#1039) * Removing saas_config.toml (#1043) * Bump types-pyyaml from 6.0.9 to 6.0.11 (#1047) Bumps [types-pyyaml](https://github.com/python/typeshed) from 6.0.9 to 6.0.11. - [Release notes](https://github.com/python/typeshed/releases) - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-pyyaml dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump docker/build-push-action from 2 to 3 (#1044) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 3. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v2...v3) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump dask from 2022.7.1 to 2022.8.0 (#1046) Bumps [dask](https://github.com/dask/dask) from 2022.7.1 to 2022.8.0. - [Release notes](https://github.com/dask/dask/releases) - [Changelog](https://github.com/dask/dask/blob/main/docs/release-procedure.md) - [Commits](https://github.com/dask/dask/compare/2022.7.1...2022.8.0) --- updated-dependencies: - dependency-name: dask dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update boto3 requirement from ~=1.24.42 to ~=1.24.46 (#1045) Updates the requirements on [boto3](https://github.com/boto/boto3) to permit the latest version. - [Release notes](https://github.com/boto/boto3/releases) - [C… * Get _all_ automated checks passing (#1122) * Update README.md * rename references to ops config * more updates, FE is broken * more code fixes, still some missing configs to fix * fix isort and pylint * get the webserver spinning up again (sans UI) * remove legacy pr workflows * fix the UI build * clean up pr workflows * fix isort * fix ctl tests * remove erroneous test file * fix some ops test issues * fix more ops test issues * add new ops migrations * fix some merge conflicts * Fix merge conflict in tsconfig * Fix merge conflicts in datasets-classify.cy.ts * Configure Cypress to be able to log in * Standardizie on one NavBar * Standardize on using the Layout component * Remove unneeded files * Update cypress tests * Log in before cypress tests * Run prettier * Use Layout for individual subject requests * more test fixes * clean up more merge conflicts * add notification settings * update the view config CLI command to accept subsections * fix the celery tests * reactivate the registry load for saas connectors * reactivate the webserver scheduler * remove devcontainer setup Co-authored-by: Allison King * update quickstart URLs * fix the quickstart * fix some static checks * Fix postgres example data * update the postgres example sql * start the UI up in the background * fix docs merge conflicts * remove the analytics_id * Make nox test name sessions more logical (#1135) * Make nox test name sessions more logical * consolidate the nox test sessions * Fix privacy center conflicts (#1133) * Resolve conflicts and upgrade next * Resolve merge conflicts * Fix missing required prop * Update postman collection /policy --> /dsr/policy * Make local docker UI better (#1140) * Instead of rebuilding node_modules, just make docker-compose not overwrite them during volume mounting * Increase count for starting up fides, likely needed for M1 macs * Disable various email sends by default in unit testing with autouse fixtures. (#1153) * add vault environment variables to docker-compose container (#1151) Co-authored-by: Adam Sachs * FIdesConfig instead of the EmailConfigRequest resource is being passed into create_or_update_email_config. (#1146) * 1149 - Update all fidesops/fidesctl logos to use the default Fides logo (#1158) * 1149 - Update all fidesops/fidesctl logos to use the default Fides logo Updated logo.svg file to the new Fides logo * Updated CHANGELOG.md file * ui/package: restore copy-export command (#1166) * Make `optional-requirements.txt` a source of version truth (#1171) * Correctly `isort` `versioneer` in files * Make `optional-requirements.txt` a source of truth * Update `CHANGELOG.md` * Include `optional_requirements.txt` in the package * Specify an encoding when opening requirements files Quiets the pylint warning * Remove superfluous variables * Match dependency names more strictly, add docstring * [Unified Fides] Address Remaining Failing Fidesops-Related Test Failures (#1178) * Delete fidesctl user routes in favor of fidesops user routes. They are practically copies of each other except fidesops user logout route has improved logic such as allowing the user to logout with a malformed or expired token. The fidesctl route was taking priority. * Use new CONFIG variable in test_saas_queryconfig * Adjust fidesops health endpoint test. We're using the fidesctl health endpoint now and they surface a version number while fidesops did not. * Add missing CONFIG variable in existing execution tests. Fix incorrect timescale test name. * Add missing timescale secrets to integration_test_config.toml. * Only show parameters inside queries if "dev mode" is True, not if "test mode" is True. (#1162) * 1177 - ESLint: Parsing error: Cannot read file tsconfig.json file (#1181) * 1177 - ESLint: Parsing error: Cannot read file tsconfig.json file - Resolved parsing error: Cannot read file '/users/ccalhoun/documents/github/fides/tsconfig.json'.eslint - Updated NPM caniuse-lite version dependency - Sorted package.json file * Updated CHANGELOG.md file * 1191 duplicate key in fides admin UI package.json file (#1192) * 1191-Duplicate key in fides admin ui package.json file * Updated CHANGELOG.md file * [Unified Fides] Reduce Idle Health Check Connections (#1182) * Stop creating new engines as part of the process of running health checks which cause us to have too many idle connections opened against the application database. Use the same engine that is being shared across the "ops" API endpoints. - Remove unused get_db_for_health_check * Remove the ctl get_db used in the endpoints in favor of the ops get_db. * Mock get_db_health needs two parameters. * Re-add SaaS template update script to startup hook (#1213) * Re-add SaaS template update script to startup hook Also update dependency getter that returns the shared db session directly to be importable from outside classes. * Use a context manager for db session Co-authored-by: Adam Sachs * Square access and erasure (#1193) * Fidesops merge to unified fides 2 (#1214) * Bump pre-commit from 2.9.3 to 2.20.0 (#853) (#1373) Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 2.9.3 to 2.20.0. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v2.9.3...v2.20.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * 1016 frontend ability for users to manually enter pii to an in progress subject request (#1377) * On successful connector creation the empty yaml text input displays a validation error * Updated caniuse-lite NPM dependency * Added min/max character limitation validation for Manual Webhook DSR Customization * Prevented Chakra Divider component opacity from being overridden at runtime. User could not see visible horizontal line on UI before. * Updated the Manual Processing detail form to not be submitted until the form is dirty. * Removed form dirty check on ManualProcessingDetail component * Update URL when user is navigating to DSR Customization screen when creating a Manual Webhook * Enable retries on saas connectors for failures at the http request level (#1376) * Add decorator to send method that retries throttles * Fix black/mypy * Fix pylint * Add tests for authenticated client * Small fixes and typos * Update CHANGELOG.md * Small changes. Update retry logic to not retry general exceptions Co-authored-by: Eduardo Armendariz * Add Consent Request API (#1387) Co-authored-by: Paul Sanders * Add new template for consent requets emails (#1405) * Add new template for consent requets emails * Remove analytics id * Update subject Co-authored-by: Paul Sanders * Add authenticated route to get consent preferences (#1402) Co-authored-by: Paul Sanders * Backend: Updating or Deleting Access Webhooks [#1388][#1389] (#1394) * If a manual webhook is deleted or disabled, check if there are any remaining active manual webhooks configured. If not, queue any Privacy Requests stuck in "requires_input" for processing. * In the "view_uploaded_manual_webhook_data", load cached webhook data for a privacy request in strict mode. If it fails (no data saved, extra field saved, field missing), return checked=True, so the user knows they need to reupload data for this webhook before it can be submitted. Return the data in non-strict mode, so we just show the overlap between the data saved and the fields defined. * Update changelog. * Move queue_requires_input_requests to the connection_endpoints where this is the only module it's being called - both where you update and delete a connection config. * Clarify docstring. * Braze Connector: Access Endpoints (#1248) * [#1393] Update Fidesops config with sane defaults where necessary (#1395) * add sane defaults * make subsections of config with complete defaults optional * lowercase database.enabled, set defaults for optional configs * update return type * updates changelog * make PORT an env var * cast env var to int * remove unnecessary unpinned dependency * bump fideslib version * bump fideslib to 3.1.4 * add defaults for the non optional config subclasses * set empty dict to default for config subclasses that require some fields * use .get() in assemble URL for correct error message, correct comment * update jwt_key type annotation * Explain Privacy Request Execution [#1397] (#1396) Co-authored-by: Cole * Update docker command on privacy center step 4 (#1410) removing the typo ` . at the end of the command so that the command works. * 1319 consent UI api integration (#1407) * Add consent UI back in * Finish initial integration with consent api * WIP consent page * Get initial consent updating working * Improve button look and feel * Add untracked files * Format VerificationForm.tsx * Remove comments * Rename Privacy modal variables * Rename variable * 1401 admin UI persist redux store to localstorage (#1409) * 1401 - Admin UI: Persist Redux store to localStorage * Resolved React memory leak when user attempts to logout via the Subject Requests landing page * Resolved UI unit test failure * Rollback previous change * Removed blacklist property from Redux store config * Refactored due to recommended code review feedback * update footer links (#1406) * update footer links * changelog * Update CHANGELOG.md Co-authored-by: Paul Sanders Co-authored-by: Sean Preston Co-authored-by: Paul Sanders * firebase auth integration (#1399) * Initial implementation of firebase auth connector Introduces firebase_admin sdk as a fidesops dependency Leverages request overrides to define custom functionality * Update changelog * Minimize unused client config in firebase auth config * Add user.photo_url as a supported Firebase Auth field Improve readability in access implementation * Fix field name to be more consistent with python SDK properties * Add clarifying comment to unused function docstring * Add photo_url field to firebase auth dataset * Properly test provider data in firebase auth integration. Also include test coverage for delete function, even thought it's not being invoked by default saas config. * Only add fields to result if popluated * Fix empty attribute logic within provider data block * Ignore pylint error for too many variables * fix up provider data check Co-authored-by: Adam Sachs * Add Braze connector registry entry (#1418) * Braze SVG added * Fixing change log message Co-authored-by: Adrian Galvan Co-authored-by: Adam Sachs * Removing PII fields from conversations collection (#1386) * Fidesops v1.8.1 Release Checklist (#1420) * updates changelog * add UI testing steps to release checklist * DX Improvements from `v1.8.1` release (#1421) * stop swallowing integrity errors on dataset update * dont attach logging middleware if analytics opt_out is true * handle diff correctly * disable consider-using-f-string as we need this for logging statements to work effectively in fideslog * Updated CHANGELOG.md file from prior merge * get the server up and running * fix test collection * fix isort and black * update dataset annotations * Merge latest fidesops UI into unified ui * Fixing post UI merge issues * Fix formatting and import issues * get all unit tests passing * Fix cypress failure 🤞 * Remove auth.slice.test.ts Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Eduardo Armendariz Co-authored-by: Eduardo Armendariz Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders Co-authored-by: Dawn Pattison Co-authored-by: Noonari Co-authored-by: Sean Preston Co-authored-by: Cole Co-authored-by: shawnplusplus <46225246+shawnplusplus@users.noreply.github.com> Co-authored-by: Andrew Jackson Co-authored-by: Cole Isaac <82131455+conceptualshark@users.noreply.github.com> Co-authored-by: Adam Sachs Co-authored-by: Adam Sachs Co-authored-by: Adrian Galvan Co-authored-by: Thomas * Remove SaaS type enum (#1197) * Remove SaaS type enum and dynamically reference registered types Update tests to dynamically compare results rather than looking for static values. * Remove references to specific custom SaaSType Since we no longer have an enum for SaaSType, we don't need to have a specific 'custom' type - instead, users can simply create their own type dynamically. There is also now no more invalid 'type' value for saas configs, so we remove the test for that functionality. * Remove unused import * update changelog Co-authored-by: Adam Sachs * Create rate limiter that interacts with Redis (#1189) * Rate limiter implementation copied from fidesops repo * Change enum values to not be plural * Add test using rate limiter from multiple threads * Update function names and test parameters * Update error messages to include better details * Update changelog * Add an additional comment to test * fix typo in test name * Fix typo in test comment * Fix one more typo * Run black one more time Co-authored-by: Eduardo Armendariz * update to the type index * format and lint UI * remove duplicates from the types index * fix MenuButton typing issue * fix references to clients/ctl * readd the prod-export command * remove mentions of unified-fides branch in workflows * merge alembic heads * fix typo * fix static checks * fix dataset parsing error * fix fides annotation coverage Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dawn Pattison Co-authored-by: Cole Isaac <82131455+conceptualshark@users.noreply.github.com> Co-authored-by: Adrian Galvan Co-authored-by: Dave Quinlan <83430497+daveqnet@users.noreply.github.com> Co-authored-by: Paul Sanders Co-authored-by: Paul Sanders Co-authored-by: Sean Preston Co-authored-by: Catherine Smith Co-authored-by: chriscalhoun1974 <68459950+chriscalhoun1974@users.noreply.github.com> Co-authored-by: Dave Quinlan Co-authored-by: Neville Samuell Co-authored-by: Phil Salant Co-authored-by: Andrew Jackson Co-authored-by: Adam Sachs Co-authored-by: Adam Sachs Co-authored-by: HamzaWaseemOnBench <104363089+HamzaWaseemOnBench@users.noreply.github.com> Co-authored-by: Adrian Galvan Co-authored-by: Noonari Co-authored-by: Robert Keyser <39230492+RobertKeyser@users.noreply.github.com> Co-authored-by: Eduardo Armendariz Co-authored-by: Kelsey Thomas <101993653+Kelsey-Ethyca@users.noreply.github.com> Co-authored-by: Cole Garbo Co-authored-by: Cole Co-authored-by: Paul Sanders Co-authored-by: Hamza W Co-authored-by: Cillian <1268052+cilliankieran@users.noreply.github.com> Co-authored-by: Christopher Calhoun Co-authored-by: Allison King Co-authored-by: Adam Sachs Co-authored-by: HamzaWaseemOnBench Co-authored-by: Steve Murphy Co-authored-by: Sebastian Sangervasi <2236777+ssangervasi@users.noreply.github.com> Co-authored-by: Zeeshan-Ethyca <109582532+Zeeshan-Ethyca@users.noreply.github.com> Co-authored-by: Eduardo Armendariz Co-authored-by: shawnplusplus <46225246+shawnplusplus@users.noreply.github.com> --- .devcontainer/devcontainer.json | 27 - .dockerignore | 15 +- .fides/celery.toml | 2 + .fides/{dataset.yml => db_dataset.yml} | 1065 +- .fides/fides.toml | 56 + .fides/fidesctl.toml | 17 - .fides/{policy.yml => policies.yml} | 24 +- .fides/redis_dataset.yml | 126 + .fides/system.yml | 29 - .fides/systems.yml | 88 + .gitattributes | 2 +- .github/dependabot.yaml | 34 + .github/pull_request_template.md | 4 +- .github/workflows/backend_checks.yml | 391 + .github/workflows/code_checks.yml | 277 - .github/workflows/codeql-analysis.yml | 70 + ...tend_pr_checks.yml => frontend_checks.yml} | 54 +- .../{docker.yaml => publish_docker.yaml} | 2 +- .github/workflows/publish_docs.yaml | 2 +- .github/workflows/publish_package.yaml | 6 +- .../publish_privacy_center_to_dockerhub.yaml | 36 + .github/workflows/release_event.yml | 5 +- .gitignore | 53 +- .pre-commit-config.yaml | 10 +- .vscode/launch.json | 26 + CHANGELOG.md | 87 +- CODE_OF_CONDUCT.md | 4 +- CONTRIBUTING.md | 4 +- Dockerfile | 113 +- MANIFEST.in | 15 +- README.md | 16 +- clients/{ctl => }/admin-ui/.babelrc | 0 clients/{ctl => }/admin-ui/.env.development | 1 + clients/{ctl => }/admin-ui/.env.production | 0 clients/admin-ui/.eslintignore | 5 + clients/{ctl => }/admin-ui/.eslintrc.json | 17 +- clients/{ctl => }/admin-ui/.gitignore | 3 + clients/admin-ui/.prettierignore | 4 + clients/admin-ui/.prettierrc.json | 4 + clients/{ctl => }/admin-ui/LICENSE | 0 clients/admin-ui/README.md | 54 + .../admin-ui/__tests__/checkbox-tree.test.tsx | 0 .../features/common/zones/config.test.ts | 0 .../features/dataset-helpers.test.tsx | 0 .../features/taxonomy-helpers.test.tsx | 0 .../features/taxonomy-transform.test.tsx | 0 clients/admin-ui/__tests__/index.test.tsx | 34 + .../admin-ui/__tests__/jest.setup.ts | 0 .../pages/datastore-connection/index.test.tsx | 68 + .../admin-ui/__tests__/pages/login.test.tsx | 86 + clients/admin-ui/__tests__/test-utils.tsx | 59 + clients/{ctl => }/admin-ui/cypress.config.ts | 0 .../{ctl => }/admin-ui/cypress/.eslintrc.json | 0 clients/{ctl => }/admin-ui/cypress/.gitignore | 0 .../admin-ui/cypress/e2e/config-wizard.cy.ts | 0 .../cypress/e2e/datasets-classify.cy.ts | 0 .../admin-ui/cypress/e2e/datasets.cy.ts | 4 + .../admin-ui/cypress/e2e/nav-bar.cy.ts | 9 +- .../admin-ui/cypress/e2e/systems.cy.ts | 3 + .../admin-ui/cypress/e2e/taxonomy.cy.ts | 4 + .../fixtures/classification/create.json | 5 + .../cypress/fixtures/classification/list.json | 45 + .../cypress/fixtures/classify/create.json | 0 .../fixtures/classify/dataset-in-review.json | 0 .../fixtures/classify/get-in-review.json | 0 .../cypress/fixtures/classify/list.json | 0 .../cypress/fixtures/classify/update.json | 0 .../cypress/fixtures/data_categories.json | 0 .../cypress/fixtures/data_qualifiers.json | 0 .../cypress/fixtures/data_subjects.json | 0 .../admin-ui/cypress/fixtures/data_uses.json | 0 .../admin-ui/cypress/fixtures/dataset.json | 0 .../admin-ui/cypress/fixtures/datasets.json | 0 .../cypress/fixtures/generate/dataset.json | 0 .../cypress/fixtures/generate/system.json | 0 clients/admin-ui/cypress/fixtures/login.json | 12 + .../cypress/fixtures/organization.json | 0 .../admin-ui/cypress/fixtures/system.json | 0 .../admin-ui/cypress/fixtures/systems.json | 0 .../admin-ui/cypress/support/commands.ts | 19 + .../cypress/support/component-index.html | 0 .../admin-ui/cypress/support/component.ts | 0 .../{ctl => }/admin-ui/cypress/support/e2e.ts | 0 .../admin-ui/cypress/support/stubs.ts | 0 .../{ctl => }/admin-ui/cypress/tsconfig.json | 0 clients/{ctl => }/admin-ui/jest.config.js | 8 + clients/{ctl => }/admin-ui/next-env.d.ts | 0 clients/admin-ui/next.config.js | 42 + clients/{ctl => }/admin-ui/package-lock.json | 2638 +- clients/{ctl => }/admin-ui/package.json | 46 +- clients/{ctl => }/admin-ui/public/favicon.ico | Bin .../public/images/connector-logos/adobe.svg | 5 + .../public/images/connector-logos/ethyca.svg | 4 + .../public/images/connector-logos/hubspot.svg | 4 + .../images/connector-logos/mailchimp.svg | 10 + .../images/connector-logos/manual_webhook.svg | 3 + .../public/images/connector-logos/mariadb.svg | 4 + .../public/images/connector-logos/mongodb.svg | 6 + .../public/images/connector-logos/mysql.svg | 4 + .../images/connector-logos/outreach.svg | 4 + .../images/connector-logos/postgres.svg | 7 + .../images/connector-logos/redshift.svg | 10 + .../images/connector-logos/salesforce.svg | 4 + .../public/images/connector-logos/segment.svg | 9 + .../public/images/connector-logos/sentry.svg | 4 + .../images/connector-logos/snowflake.svg | 10 + .../images/connector-logos/sqlserver.svg | 20 + .../public/images/connector-logos/stripe.svg | 31 + .../public/images/connector-logos/zendesk.svg | 7 + .../{ctl => }/admin-ui/public/logo-icon.svg | 0 clients/admin-ui/public/logo.svg | 16 + clients/admin-ui/src/app/hooks.ts | 7 + clients/admin-ui/src/app/store.ts | 206 + clients/admin-ui/src/constants.ts | 117 + .../admin-ui/src/features/YamlForm.tsx | 0 .../src/features/auth/ProtectedRoute.tsx | 40 + .../auth/__tests__/ProtectedRoute.test.tsx | 110 + .../admin-ui/src/features/auth/auth.slice.ts | 112 + clients/admin-ui/src/features/auth/index.ts | 1 + clients/admin-ui/src/features/auth/types.ts | 16 + .../src/features/common/AccordionTree.tsx | 0 .../src/features/common/BorderGrid.module.css | 15 + .../src/features/common/BorderGrid.tsx | 0 .../src/features/common/CheckboxTree.tsx | 2 +- .../src/features/common/ClipboardButton.tsx | 90 + .../src/features/common/CommonHeaders.ts | 11 + .../src/features/common/ConfirmationModal.tsx | 0 .../admin-ui/src/features/common/DataTabs.tsx | 0 .../src/features/common/DaysLeftTag.tsx | 42 + .../admin-ui/src/features/common/DocsLink.tsx | 0 clients/admin-ui/src/features/common/Head.tsx | 12 + .../admin-ui/src/features/common/Header.tsx | 38 +- .../src/features/common/HorizontalStepper.tsx | 3 +- .../src/features/common/Icon/AWSLogo.tsx | 0 .../admin-ui/src/features/common/Icon/Add.tsx | 32 + .../features/common/Icon/ArrowDownLine.tsx | 11 + .../common/Icon/ArrowDownLineCtl.tsx} | 0 .../src/features/common/Icon/ArrowUpLine.tsx | 0 .../src/features/common/Icon/CircleHelp.tsx | 16 + .../src/features/common/Icon/CloseSolid.tsx | 13 + .../features/common/Icon/CloseSolidCtl.tsx} | 0 .../features/common/Icon/DownloadSolid.tsx | 0 .../src/features/common/Icon/ErrorWarning.tsx | 16 + .../admin-ui/src/features/common/Icon/Eye.tsx | 0 .../src/features/common/Icon/Gear.tsx | 0 .../features/common/Icon/GreenCheckCircle.tsx | 16 + .../features/common/Icon/HorizontalLine.tsx | 0 .../src/features/common/Icon/ManualSetup.tsx | 0 .../src/features/common/Icon/More.tsx | 0 .../src/features/common/Icon/OktaLogo.tsx | 0 .../src/features/common/Icon/Question.tsx | 0 .../src/features/common/Icon/SearchLine.tsx | 0 .../src/features/common/Icon/SortArrow.tsx | 171 + .../features/common/Icon/StepperCircle.tsx | 0 .../common/Icon/StepperCircleCheckmark.tsx | 0 .../features/common/Icon/TrashCanSolid.tsx | 16 + .../src/features/common/Icon/User.tsx | 0 .../src/features/common/Icon/VerticalLine.tsx | 0 .../src/features/common/Icon/index.tsx | 6 + .../admin-ui/src/features/common/Image.tsx | 11 + .../admin-ui/src/features/common/Layout.tsx | 0 .../admin-ui/src/features/common/NavBar.tsx | 87 + clients/admin-ui/src/features/common/PII.tsx | 8 + .../src/features/common/PIIToggle.tsx | 13 + .../src/features/common/PaginationFooter.tsx | 54 + .../src/features/common/QuestionTooltip.tsx | 7 +- .../features/common/RequestStatusBadge.tsx | 66 + .../src/features/common/RequestType.tsx | 36 + .../src/features/common/SearchBar.tsx | 0 .../admin-ui/src/features/common/Stepper.tsx | 5 +- .../src/features/common/constants.tsx | 0 .../admin-ui/src/features/common/countries.ts | 0 .../common/dropdown/MultiSelectDropdown.tsx | 146 + .../dropdown/MultiSelectDropdownList.tsx | 111 + .../common/dropdown/SelectDropdown.tsx | 151 + .../src/features/common/dropdown/types.ts | 14 + .../src/features/common/features.slice.ts | 0 .../src/features/common/form/inputs.tsx | 0 .../admin-ui/src/features/common/helpers.ts | 77 +- .../src/features/common/hooks/index.ts | 3 + .../src/features/common/hooks/useAPIHelper.ts | 27 + .../src/features/common/hooks/useAlert.tsx | 54 + .../features/common/hooks/useOutsideClick.ts | 22 + .../src/features/common/nav/NavBar.tsx | 11 + .../src/features/common/nav/NavButton.tsx | 0 .../src/features/common/nav/NavLink.tsx | 0 .../src/features/common/nav/zone-config.ts | 0 .../src/features/common/plus.slice.ts | 0 .../admin-ui/src/features/common/toast.tsx | 0 .../admin-ui/src/features/common/types.tsx | 0 clients/admin-ui/src/features/common/utils.ts | 19 + .../src/features/common/zones/config.ts | 0 .../src/features/common/zones/index.ts | 0 .../src/features/common/zones/types.ts | 0 .../features/config-wizard/AddSystemForm.tsx | 0 .../config-wizard/AuthenticateAwsForm.tsx | 0 .../config-wizard/AuthenticateScanner.tsx | 0 .../config-wizard/ConfigWizardWalkthrough.tsx | 4 +- .../config-wizard/OrganizationInfoForm.tsx | 0 .../config-wizard/ScanResultsForm.tsx | 0 .../features/config-wizard/ScannerError.tsx | 0 .../features/config-wizard/SuccessPage.tsx} | 0 .../config-wizard/ViewYourDataMapPage.tsx | 0 .../config-wizard/config-wizard.slice.ts | 4 +- .../src/features/config-wizard/constants.tsx | 0 .../features/config-wizard/scanner.slice.ts | 0 .../src/features/config-wizard/setup.tsx | 0 .../connection-type/connection-type.slice.ts | 133 + .../src/features/connection-type/index.ts | 1 + .../src/features/connection-type/types.ts | 46 + .../data-qualifier/data-qualifier.slice.ts | 4 +- .../data-subjects/data-subject.slice.ts | 4 +- .../src/features/data-use/data-use.slice.ts | 4 +- .../dataset/ApproveClassification.tsx | 0 .../ClassifiedDataCategoryDropdown.tsx | 0 .../src/features/dataset/ColumnDropdown.tsx | 0 .../features/dataset/DataCategoryDropdown.tsx | 3 +- .../features/dataset/DataCategoryInput.tsx | 0 .../features/dataset/DatabaseConnectForm.tsx | 0 .../dataset/DatasetCollectionView.tsx | 3 + .../src/features/dataset/DatasetFieldCell.tsx | 0 .../features/dataset/DatasetFieldsTable.tsx | 0 .../src/features/dataset/DatasetHeading.tsx | 0 .../src/features/dataset/DatasetTable.tsx | 0 .../src/features/dataset/DatasetYamlForm.tsx | 0 .../features/dataset/EditCollectionDrawer.tsx | 2 +- .../dataset/EditCollectionOrFieldForm.tsx | 0 .../features/dataset/EditDatasetDrawer.tsx | 0 .../src/features/dataset/EditDatasetForm.tsx | 0 .../src/features/dataset/EditDrawer.tsx | 3 +- .../src/features/dataset/EditFieldDrawer.tsx | 0 .../src/features/dataset/MoreActionsMenu.tsx | 0 .../src/features/dataset/constants.ts | 0 .../src/features/dataset/dataset.slice.ts | 10 +- .../admin-ui/src/features/dataset/helpers.ts | 0 .../admin-ui/src/features/dataset/index.ts | 0 .../admin-ui/src/features/dataset/types.ts | 0 .../ConnectionFilters.tsx | 56 + .../ConnectionGrid.module.css | 15 + .../datastore-connections/ConnectionGrid.tsx | 82 + .../ConnectionGridItem.tsx | 146 + .../datastore-connections/ConnectionMenu.tsx | 43 + .../ConnectionStatusBadge.tsx | 27 + .../ConnectionTypeLogo.tsx | 47 + .../ConnectionsContainer.tsx | 61 + .../ConnectionsEmptyState.tsx | 31 + .../ConnectionsHeader.tsx | 22 + .../ConnectionsLayout.tsx | 17 + .../DeleteConnectionModal.tsx | 107 + .../DisableConnectionModal.tsx | 116 + .../add-connection/AddConnection.tsx | 91 + .../add-connection/AddConnectionButton.tsx | 52 + .../add-connection/Breadcrumb.tsx | 65 + .../add-connection/ChooseConnection.tsx | 111 + .../ConfigurationSettingsNav.tsx | 63 + .../add-connection/ConfigureConnector.tsx | 125 + .../add-connection/ConnectionTypeFilter.tsx | 52 + .../add-connection/ConnectionTypeList.tsx | 49 + .../add-connection/ConnectorParameters.tsx | 111 + .../add-connection/DatasetConfiguration.tsx | 83 + .../add-connection/TestConnection.tsx | 121 + .../add-connection/constants.ts | 79 + .../database/ConnectorParameters.tsx | 130 + .../forms/ConnectorParametersForm.tsx | 338 + .../add-connection/forms/CustomInput.tsx | 111 + .../add-connection/forms/YamlEditorForm.tsx | 208 + .../add-connection/forms/types.ts | 1 + .../add-connection/helpers.ts | 19 + .../add-connection/manual/ButtonGroup.tsx | 35 + .../manual/ConnectorParameters.tsx | 96 + .../manual/ConnectorParametersForm.tsx | 89 + .../manual/DSRCustomization.tsx | 101 + .../manual/DSRCustomizationForm.tsx | 169 + .../add-connection/manual/types.ts | 4 + .../sass/ConnectorParameters.tsx | 149 + .../sass/DatasetConfiguration.tsx | 28 + .../add-connection/types.ts | 26 + .../datastore-connections/constants.ts | 91 + .../datastore-connection.slice.ts | 346 + .../filters/ConnectionTypeFilter.tsx | 61 + .../filters/DisabledStatusFilter.tsx | 53 + .../filters/SystemTypeFilter.tsx | 51 + .../filters/TestingStatusFilter.tsx | 51 + .../features/datastore-connections/index.ts | 1 + .../features/datastore-connections/types.ts | 229 + .../src/features/organization/constants.ts | 0 .../src/features/organization/index.ts | 0 .../organization/organization.slice.ts | 0 .../DenyPrivacyRequestModal.tsx | 91 + .../privacy-requests/RequestFilters.tsx | 206 + .../features/privacy-requests/RequestRow.tsx | 297 + .../privacy-requests/RequestTable.tsx | 112 + .../privacy-requests/SortRequestButton.tsx | 117 + .../features/privacy-requests/constants.ts | 15 + .../src/features/privacy-requests/helpers.ts | 12 + .../src/features/privacy-requests/index.ts | 1 + .../privacy-requests.slice.ts | 313 + .../src/features/privacy-requests/types.ts | 104 + .../subject-request/RequestDetails.tsx | 106 + .../subject-request/SubjectIdentities.tsx | 63 + .../subject-request/SubjectRequest.tsx | 32 + .../events-and-logs/ActivityTimeline.tsx | 72 + .../events-and-logs/EventDetails.tsx | 164 + .../events-and-logs/EventError.tsx | 41 + .../events-and-logs/EventLog.tsx | 112 + .../events-and-logs/EventsAndLogs.tsx | 32 + .../ManualProcessingDetail.tsx | 184 + .../ManualProcessingList.tsx | 270 + .../manual-processing/types.ts | 15 + .../features/system/DescribeSystemStep.tsx | 0 .../system/DescribeSystemsFormExtension.tsx | 0 .../src/features/system/ManualSystemFlow.tsx | 0 .../system/PrivacyDeclarationAccordion.tsx | 0 .../system/PrivacyDeclarationForm.tsx | 0 .../PrivacyDeclarationFormExtension.tsx | 0 .../system/PrivacyDeclarationStep.tsx | 0 .../system/ReviewSystemFormExtension.tsx | 0 .../src/features/system/ReviewSystemStep.tsx | 0 .../src/features/system/SystemCard.tsx | 0 .../features/system/SystemRegisterSuccess.tsx | 113 + .../src/features/system/SystemYamlForm.tsx | 0 .../src/features/system/SystemsManagement.tsx | 0 .../src/features/system/form-layout.tsx | 0 .../admin-ui/src/features/system/form.ts | 0 .../admin-ui/src/features/system/index.ts | 0 .../src/features/system/system.slice.ts | 4 +- .../src/features/taxonomy/ActionButtons.tsx | 0 .../taxonomy/DataCategoryChecklist.tsx | 2 +- .../features/taxonomy/IdentifiabilityTag.tsx | 0 .../features/taxonomy/TaxonomyEntityTag.tsx | 0 .../features/taxonomy/TaxonomyFormBase.tsx | 0 .../features/taxonomy/TaxonomyTabContent.tsx | 0 .../src/features/taxonomy/TaxonomyTabs.tsx | 0 .../admin-ui/src/features/taxonomy/helpers.ts | 0 .../admin-ui/src/features/taxonomy/hooks.tsx | 0 .../admin-ui/src/features/taxonomy/index.ts | 0 .../src/features/taxonomy/taxonomy.slice.ts | 6 +- .../admin-ui/src/features/taxonomy/types.ts | 0 .../user-management/DeleteUserModal.tsx | 117 + .../features/user-management/EditUserForm.tsx | 79 + .../features/user-management/NewUserForm.tsx | 29 + .../user-management/UpdatePasswordModal.tsx | 154 + .../src/features/user-management/UserForm.tsx | 211 + .../user-management/UserManagementLayout.tsx | 46 + .../user-management/UserManagementRow.tsx | 70 + .../user-management/UserManagementTable.tsx | 112 + .../UserManagementTableActions.tsx | 65 + .../user-management/config/config.json | 6 + .../features/user-management/form/inputs.tsx | 77 + .../src/features/user-management/index.ts | 1 + .../src/features/user-management/types.ts | 58 + .../user-management/user-management.slice.ts | 201 + .../admin-ui/src/features/user/index.ts | 0 .../admin-ui/src/features/user/user.slice.ts | 4 +- clients/admin-ui/src/flags.json | 6 + .../{ctl => }/admin-ui/src/mocks/browser.ts | 1 + clients/{ctl => }/admin-ui/src/mocks/data.ts | 0 .../{ctl => }/admin-ui/src/mocks/handlers.ts | 1 + clients/{ctl => }/admin-ui/src/mocks/index.ts | 0 .../{ctl => }/admin-ui/src/mocks/server.ts | 1 + clients/{ctl => }/admin-ui/src/pages/404.tsx | 22 +- clients/admin-ui/src/pages/_app.tsx | 43 + .../src/pages/api/auth/[...nextauth].ts | 72 + .../src/pages/config-wizard/index.tsx | 0 .../admin-ui/src/pages/dataset/[id].tsx | 0 .../admin-ui/src/pages/dataset/index.tsx | 0 .../admin-ui/src/pages/dataset/new/index.tsx | 0 .../src/pages/datastore-connection/index.tsx | 10 + .../src/pages/datastore-connection/new.tsx | 21 + clients/admin-ui/src/pages/index.tsx | 22 + clients/admin-ui/src/pages/login.tsx | 228 + .../src/pages/subject-request/[id].tsx | 80 + .../admin-ui/src/pages/system/index.tsx | 0 .../src/pages/system/new/configure.tsx | 0 .../admin-ui/src/pages/system/new/index.tsx | 0 .../admin-ui/src/pages/taxonomy/index.tsx | 0 .../src/pages/user-management/index.tsx | 22 + .../src/pages/user-management/new.tsx | 11 + .../pages/user-management/profile/[id].tsx | 49 + .../admin-ui/src/theme/components/button.ts | 0 clients/admin-ui/src/theme/index.ts | 34 + .../admin-ui/src/types/api/README.md | 3 +- clients/admin-ui/src/types/api/index.ts | 74 + .../src/types/api/models/AWSConfig.ts | 0 .../src/types/api/models/AccessToken.ts | 0 .../src/types/api/models/BigQueryConfig.ts | 2 +- .../src/types/api/models/Classification.ts | 0 .../api/models/ClassificationResponse.ts | 2 +- .../types/api/models/ClassificationStatus.ts | 12 +- .../types/api/models/ClassifyCollection.ts | 2 +- .../src/types/api/models/ClassifyDataset.ts | 4 +- .../api/models/ClassifyDatasetResponse.ts | 0 .../src/types/api/models/ClassifyField.ts | 2 +- .../models/ClassifyInstanceResponseValues.ts | 6 +- .../api/models/ClassifyRequestPayload.ts | 4 +- .../api/models/ClassifyStatusUpdatePayload.ts | 2 +- .../src/types/api/models/ContactDetails.ts | 0 .../src/types/api/models/DBActions.ts | 6 +- .../src/types/api/models/DataCategory.ts | 0 .../admin-ui/src/types/api/models/DataFlow.ts | 0 .../models/DataProtectionImpactAssessment.ts | 0 .../src/types/api/models/DataQualifier.ts | 0 .../api/models/DataResponsibilityTitle.ts | 8 +- .../src/types/api/models/DataSubject.ts | 2 +- .../src/types/api/models/DataSubjectRights.ts | 4 +- .../types/api/models/DataSubjectRightsEnum.ts | 21 + .../admin-ui/src/types/api/models/DataUse.ts | 4 +- .../src/types/api/models/DatabaseConfig.ts | 0 .../admin-ui/src/types/api/models/Dataset.ts | 6 +- .../src/types/api/models/DatasetCollection.ts | 2 +- .../src/types/api/models/DatasetField.ts | 0 .../src/types/api/models/DatasetMetadata.ts | 0 .../src/types/api/models/DatasetSchema.ts | 0 .../src/types/api/models/Evaluation.ts | 4 +- .../src/types/api/models/FigureTypeEnum.ts | 6 +- .../admin-ui/src/types/api/models/Generate.ts | 19 + .../api/models/GenerateRequestPayload.ts | 2 +- .../src/types/api/models/GenerateResponse.ts | 6 +- .../src/types/api/models/GenerateTypes.ts | 6 +- .../types/api/models/HTTPValidationError.ts | 2 +- .../types/api/models/IncludeExcludeEnum.ts | 10 +- .../src/types/api/models/KeyfileCreds.ts | 0 .../src/types/api/models/LegalBasisEnum.ts | 17 + .../src/types/api/models/MatchesEnum.ts | 10 +- .../src/types/api/models/OktaConfig.ts | 0 .../src/types/api/models/Organization.ts | 4 +- .../types/api/models/OrganizationMetadata.ts | 2 +- .../types/api/models/Page_UserResponse_.ts | 2 +- .../admin-ui/src/types/api/models/Policy.ts | 2 +- .../src/types/api/models/PolicyRule.ts | 2 +- .../types/api/models/PrivacyDeclaration.ts | 0 .../src/types/api/models/PrivacyRule.ts | 2 +- .../admin-ui/src/types/api/models/Registry.ts | 0 .../src/types/api/models/ResourceFilter.ts | 0 .../types/api/models/SpecialCategoriesEnum.ts | 21 + .../src/types/api/models/StatusEnum.ts | 6 +- .../admin-ui/src/types/api/models/System.ts | 12 +- .../src/types/api/models/SystemMetadata.ts | 0 .../src/types/api/models/UserCreate.ts | 0 .../types/api/models/UserCreateResponse.ts | 0 .../src/types/api/models/UserLogin.ts | 0 .../src/types/api/models/UserLoginResponse.ts | 4 +- .../src/types/api/models/UserPasswordReset.ts | 0 .../src/types/api/models/UserResponse.ts | 0 .../src/types/api/models/UserUpdate.ts | 0 .../src/types/api/models/ValidTargets.ts | 10 +- .../src/types/api/models/ValidateRequest.ts | 16 + .../src/types/api/models/ValidateResponse.ts | 2 +- .../src/types/api/models/ValidationError.ts | 2 +- .../src/types/api/models/ValidationStatus.ts | 6 +- .../src/types/api/models/ValidationTarget.ts | 8 +- .../src/types/api/models/Violation.ts | 2 +- .../types/api/models/ViolationAttributes.ts | 0 .../admin-ui/src/types/environment.d.ts | 0 .../admin-ui/src/types/errors/api.ts | 0 .../admin-ui/src/types/errors/index.ts | 0 .../admin-ui/src/types/errors/models.ts | 0 .../admin-ui/src/types/next-auth.d.ts | 3 +- clients/admin-ui/tsconfig.json | 59 + clients/ctl/admin-ui/.eslintignore | 2 - clients/ctl/admin-ui/README.md | 18 - clients/ctl/admin-ui/__tests__/index.test.tsx | 19 - .../ClassifiedDataCategoryInput.cy.tsx | 168 - .../components/DataCategoryInput.cy.tsx | 48 - clients/ctl/admin-ui/next.config.js | 39 - clients/ctl/admin-ui/public/logo.svg | 10 - clients/ctl/admin-ui/src/app/hooks.ts | 6 - clients/ctl/admin-ui/src/app/store.ts | 72 - .../src/features/common/BorderGrid.module.css | 15 - .../admin-ui/src/features/common/Icon/Add.tsx | 32 - .../features/common/Icon/TrashCanSolid.tsx | 7 - clients/ctl/admin-ui/src/pages/_app.tsx | 26 - .../src/pages/api/auth/[...nextauth].ts | 70 - clients/ctl/admin-ui/src/pages/index.tsx | 37 - clients/ctl/admin-ui/src/pages/login.tsx | 216 - clients/ctl/admin-ui/src/test-utils.tsx | 26 - clients/ctl/admin-ui/src/types/api/index.ts | 74 - .../types/api/models/DataSubjectRightsEnum.ts | 21 - .../admin-ui/src/types/api/models/Generate.ts | 19 - .../src/types/api/models/LegalBasisEnum.ts | 17 - .../types/api/models/SpecialCategoriesEnum.ts | 21 - .../src/types/api/models/ValidateRequest.ts | 16 - clients/ops/privacy-center/.babelrc | 3 + clients/ops/privacy-center/.dockerignore | 16 + clients/ops/privacy-center/.eslintignore | 5 + clients/ops/privacy-center/.eslintrc.json | 21 + clients/ops/privacy-center/.gitignore | 105 + clients/ops/privacy-center/.prettierignore | 4 + .../privacy-center}/.prettierrc.json | 0 clients/ops/privacy-center/Dockerfile | 50 + clients/ops/privacy-center/LICENSE | 201 + clients/ops/privacy-center/README.md | 80 + .../__tests__/RequestModal.test.tsx | 214 + .../privacy-center/__tests__/index.test.tsx | 52 + .../privacy-center/__tests__/jest.setup.ts | 2 + .../privacy-center/common/CommonHeaders.ts | 17 + .../ops/privacy-center/common/hooks/index.ts | 2 + .../common/hooks/useLocalStorage.ts | 47 + .../ops/privacy-center/components/Card.tsx | 63 + .../privacy-center/components/ConsentCard.tsx | 17 + .../components/ConsentItemCard.tsx | 104 + .../privacy-center/components/PrivacyCard.tsx | 29 + .../components/modals/PrivacyRequestForm.tsx | 299 + .../components/modals/RequestModal.tsx | 22 + .../components/modals/RequestSubmitted.tsx | 58 + .../components/modals/VerificationForm.tsx | 239 + .../ConsentRequestForm.tsx | 205 + .../ConsentRequestModal.tsx | 109 + .../PrivacyRequestForm.tsx | 299 + .../PrivacyRequestModal.tsx | 122 + .../RequestSubmitted.tsx | 58 + .../privacy-center/components/modals/types.ts | 13 + .../config/__mocks__/config.json | 39 + clients/ops/privacy-center/config/config.css | 1 + clients/ops/privacy-center/config/config.json | 51 + clients/ops/privacy-center/constants/index.ts | 9 + clients/ops/privacy-center/jest.config.js | 40 + clients/ops/privacy-center/next-env.d.ts | 5 + clients/ops/privacy-center/next.config.js | 25 + clients/ops/privacy-center/package-lock.json | 23106 ++++++++++++++++ clients/ops/privacy-center/package.json | 62 + clients/ops/privacy-center/pages/404.tsx | 82 + clients/ops/privacy-center/pages/_app.tsx | 22 + clients/ops/privacy-center/pages/consent.tsx | 234 + clients/ops/privacy-center/pages/index.tsx | 195 + clients/ops/privacy-center/public/consent.svg | 3 + clients/ops/privacy-center/public/delete.svg | 3 + .../ops/privacy-center/public/download.svg | 3 + clients/ops/privacy-center/public/edit.svg | 3 + clients/ops/privacy-center/public/favicon.ico | Bin 0 -> 4286 bytes .../ops/privacy-center/public/green-check.svg | 4 + .../ops/privacy-center/public/logo-icon.svg | 3 + clients/ops/privacy-center/public/logo.svg | 5 + clients/ops/privacy-center/start.sh | 6 + .../src => ops/privacy-center}/theme/index.ts | 12 +- .../privacy-center}/tsconfig.json | 13 +- .../ops/privacy-center/types/AlertState.ts | 4 + .../ops/privacy-center/types/environment.d.ts | 10 + clients/ops/privacy-center/types/index.ts | 25 + data/config/celery.toml | 2 + data/config/fides.toml | 44 + .../dataset/bigquery_example_test_dataset.yml | 225 + data/dataset/email_dataset.yml | 64 + data/dataset/example_test_dataset.invalid | 225 + data/dataset/example_test_datasets.yml | 419 + data/dataset/manual_dataset.yml | 40 + data/dataset/mariadb_example_test_dataset.yml | 210 + data/dataset/mongo_example_test_dataset.yml | 289 + data/dataset/mssql_example_test_dataset.yml | 210 + data/dataset/mysql_example_test_dataset.yml | 210 + .../dataset/postgres_example_test_dataset.yml | 225 + .../dataset/redshift_example_test_dataset.yml | 225 + .../snowflake_example_test_dataset.yml | 229 + .../dataset/timebase_example_test_dataset.yml | 225 + data/saas/config/adobe_campaign_config.yml | 100 + data/saas/config/auth0_config.yml | 62 + data/saas/config/braze_config.yml | 98 + data/saas/config/datadog_config.yml | 53 + data/saas/config/firebase_auth_config.yml | 48 + data/saas/config/hubspot_config.yml | 152 + data/saas/config/mailchimp_config.yml | 94 + data/saas/config/outreach_config.yml | 157 + .../mailchimp_override_config.yml | 81 + data/saas/config/rollbar_config.yml | 91 + data/saas/config/saas_example_config.yml | 234 + data/saas/config/salesforce_config.yml | 239 + data/saas/config/segment_config.yml | 155 + data/saas/config/sendgrid_config.yml | 46 + data/saas/config/sentry_config.yml | 168 + data/saas/config/shopify_config.yml | 202 + data/saas/config/square_config.yml | 100 + data/saas/config/stripe_config.yml | 442 + data/saas/config/zendesk_config.yml | 126 + data/saas/dataset/adobe_campaign_dataset.yml | 376 + data/saas/dataset/auth0_dataset.yml | 174 + data/saas/dataset/braze_dataset.yml | 111 + data/saas/dataset/datadog_dataset.yml | 55 + data/saas/dataset/firebase_auth_dataset.yml | 57 + data/saas/dataset/hubspot_dataset.yml | 172 + data/saas/dataset/mailchimp_dataset.yml | 139 + data/saas/dataset/outreach_dataset.yml | 211 + .../mailchimp_override_dataset.yml | 145 + data/saas/dataset/rollbar_dataset.yml | 175 + data/saas/dataset/saas_example_dataset.yml | 226 + data/saas/dataset/salesforce_dataset.yml | 1057 + data/saas/dataset/segment_dataset.yml | 133 + data/saas/dataset/sendgrid_dataset.yml | 86 + data/saas/dataset/sentry_dataset.yml | 759 + data/saas/dataset/shopify_dataset.yml | 1631 ++ data/saas/dataset/square_dataset.yml | 342 + data/saas/dataset/stripe_dataset.yml | 1443 + data/saas/dataset/zendesk_dataset.yml | 439 + data/saas/icon/adobe.svg | 5 + data/saas/icon/default.svg | 4 + data/saas/icon/hubspot.svg | 4 + data/saas/icon/mailchimp.svg | 10 + data/saas/icon/outreach.svg | 4 + data/saas/icon/salesforce.svg | 4 + data/saas/icon/segment.svg | 9 + data/saas/icon/sentry.svg | 4 + data/saas/icon/stripe.svg | 31 + data/saas/icon/zendesk.svg | 7 + data/saas/saas_connector_registry.toml | 101 + dev-requirements.txt | 23 +- docker-compose.integration-tests.yml | 2 +- docker-compose.yml | 99 +- docker/docker-compose.integration-mariadb.yml | 20 + docker/docker-compose.integration-mongodb.yml | 15 + docker/docker-compose.integration-mssql.yml | 8 + docker/docker-compose.integration-mysql.yml | 20 + .../docker-compose.integration-postgres.yml | 21 + .../docker-compose.integration-timescale.yml | 12 + docker/sample_data/mariadb_example_data.sql | 60 + docker/sample_data/mariadb_example_schema.sql | 102 + docker/sample_data/mongo-init.js | 384 + docker/sample_data/mssql_example.sql | 46 + docker/sample_data/mysql_example.sql | 103 + docker/sample_data/postgres_example.sql | 199 + docker/sample_data/timescale_example.sql | 191 + docs/fides/docs/admin_ui/local_dev.md | 26 - docs/fides/docs/admin_ui/overview.md | 13 - docs/fides/docs/admin_ui/user_management.md | 99 - docs/fides/docs/api/index.md | 9 +- docs/fides/docs/cicd.md | 215 + docs/fides/docs/cicd/examples.md | 207 - docs/fides/docs/cicd/overview.md | 29 - docs/fides/docs/cli.md | 2 +- docs/fides/docs/community/code_of_conduct.md | 2 - docs/fides/docs/community/hints_tips.md | 2 - docs/fides/docs/css/fides.css | 12 + docs/fides/docs/css/logo.css | 6 + docs/fides/docs/csv/data_categories.csv | 158 +- docs/fides/docs/csv/data_qualifiers.csv | 12 +- docs/fides/docs/csv/data_subjects.csv | 34 +- docs/fides/docs/csv/data_uses.csv | 50 +- docs/fides/docs/deployment.md | 184 + docs/fides/docs/development/code_style.md | 21 +- .../docs/development/contributing_details.md | 133 + .../docs/development/database_migration.md | 8 +- docs/fides/docs/development/documentation.md | 12 +- docs/fides/docs/development/fideslog.md | 29 + .../docs/development/jetbrains_debugging.md | 76 + docs/fides/docs/development/overview.md | 33 +- .../postman/Fides.postman_collection.json | 4790 ++++ .../docs/development/postman/using_postman.md | 106 + docs/fides/docs/development/pull_requests.md | 6 +- .../docs/development/release_checklist.md | 14 + docs/fides/docs/development/releases.md | 26 +- docs/fides/docs/development/testing.md | 20 +- .../docs/development/update_erd_diagram.md | 16 + docs/fides/docs/ethyca.md | 10 +- .../getting-started/database_connectors.md | 498 + docs/fides/docs/getting-started/datasets.md | 194 + .../getting-started/execution_policies.md | 128 + .../generate_resources.md | 74 +- .../docs/getting-started/privacy_requests.md | 163 + docs/fides/docs/getting-started/storage.md | 161 + docs/fides/docs/getting_started.md | 89 + docs/fides/docs/glossary.md | 23 + docs/fides/docs/guides/complex_fields.md | 248 + docs/fides/docs/guides/connection_types.md | 182 + .../fides/docs/guides/creating_users.md | 0 .../fides/docs/guides/data_rights_protocol.md | 102 + .../fides/docs/guides/email_communications.md | 59 + ...tending_taxonomy.md => extend_taxonomy.md} | 8 +- docs/fides/docs/guides/fidesops_workflow.md | 130 + ...rating_datamap.md => generate_datamaps.md} | 50 +- docs/fides/docs/guides/manual_webhooks.md | 105 + docs/fides/docs/guides/masking_strategies.md | 242 + docs/fides/docs/guides/oauth.md | 90 + docs/fides/docs/guides/onetrust.md | 43 + docs/fides/docs/guides/policies.md | 108 +- docs/fides/docs/guides/policy_webhooks.md | 194 + docs/fides/docs/guides/query_execution.md | 153 + docs/fides/docs/guides/reporting.md | 330 + docs/fides/docs/img/Deployment_Diagram.png | Bin 0 -> 152296 bytes docs/fides/docs/img/Tree@1x.svg | 32 +- docs/fides/docs/img/admin_ui/add_new_user.png | Bin 0 -> 119294 bytes docs/fides/docs/img/admin_ui/approve_deny.png | Bin 0 -> 79121 bytes docs/fides/docs/img/admin_ui/datastore.png | Bin 0 -> 196364 bytes .../docs/img/admin_ui/datastore_list.png | Bin 0 -> 224709 bytes .../docs/img/admin_ui/datastore_options.png | Bin 0 -> 232748 bytes .../docs/img/admin_ui/delete_datastore.png | Bin 0 -> 261881 bytes docs/fides/docs/img/admin_ui/edit_user.png | Bin 0 -> 105930 bytes docs/fides/docs/img/admin_ui/failed_test.png | Bin 0 -> 134534 bytes .../docs/img/admin_ui/privacy_center.png | Bin 0 -> 683088 bytes .../docs/img/admin_ui/request_denial.png | Bin 0 -> 68811 bytes docs/fides/docs/img/admin_ui/sr_overview.png | Bin 0 -> 76276 bytes .../img/admin_ui/subject_request_details.png | Bin 0 -> 93843 bytes .../docs/img/admin_ui/subject_request_log.png | Bin 0 -> 252623 bytes .../docs/img/admin_ui/user_management.png | Bin 0 -> 162916 bytes docs/fides/docs/img/admin_ui/user_scopes.png | Bin 0 -> 175249 bytes docs/fides/docs/img/app_database.png | Bin 0 -> 480614 bytes docs/fides/docs/img/auth_flow.png | Bin 0 -> 54334 bytes .../docs/img/connect_app_db_to_dbeaver.png | Bin 0 -> 684421 bytes docs/fides/docs/img/fides-ecosystem.png | Bin 0 -> 116560 bytes docs/fides/docs/img/fides-ops-process.png | Bin 0 -> 103043 bytes .../docs/img/fidesops-overview-diagram.png | Bin 0 -> 50799 bytes docs/fides/docs/img/fidesops.png | Bin 0 -> 33010 bytes docs/fides/docs/img/fidesops.svg | 19 + docs/fides/docs/img/ide/SDKs.png | Bin 0 -> 94128 bytes .../docs/img/ide/add_python_interpreter.png | Bin 0 -> 53128 bytes docs/fides/docs/img/ide/debug_config.png | Bin 0 -> 120805 bytes docs/fides/docs/img/ide/debugging.png | Bin 0 -> 301512 bytes docs/fides/docs/img/ide/docker.png | Bin 0 -> 130466 bytes .../docs/img/mongo_and_postgres_complex.png | Bin 0 -> 660576 bytes docs/fides/docs/img/oauth2_workflow.png | Bin 0 -> 152296 bytes docs/fides/docs/img/onetrust_request_flow.png | Bin 0 -> 34361 bytes .../add_root_client_id_and_secret.png | Bin 0 -> 259883 bytes .../img/postman_images/client_form_data.png | Bin 0 -> 105278 bytes .../create_root_client_token.png | Bin 0 -> 265733 bytes .../img/postman_images/fidesops_container.png | Bin 0 -> 157578 bytes .../docs/img/postman_images/final_token.png | Bin 0 -> 289577 bytes .../img/postman_images/finalize_import.png | Bin 0 -> 72315 bytes .../img/postman_images/import_collection.png | Bin 0 -> 55519 bytes .../docs/img/postman_images/local_results.png | Bin 0 -> 107594 bytes .../open_fidesops_variables.png | Bin 0 -> 73295 bytes .../postman_images/root_token_response.png | Bin 0 -> 290516 bytes .../postman_images/save_root_client_token.png | Bin 0 -> 239681 bytes .../succeeded_privacy_request.png | Bin 0 -> 69030 bytes .../docs/img/postman_images/upload_files.png | Bin 0 -> 74999 bytes docs/fides/docs/img/storage_destinations.png | Bin 0 -> 31926 bytes docs/fides/docs/img/traversal_graph.png | Bin 0 -> 150330 bytes docs/fides/docs/img/traversal_tables.png | Bin 0 -> 100565 bytes docs/fides/docs/index.md | 51 +- docs/fides/docs/installation/configuration.md | 286 +- docs/fides/docs/installation/database.md | 5 - docs/fides/docs/installation/docker.md | 39 +- docs/fides/docs/installation/installation.md | 70 - docs/fides/docs/installation/overview.md | 48 + .../prerequisites_dependencies.md | 11 - docs/fides/docs/installation/pypi.md | 102 +- docs/fides/docs/installation/requirements.md | 22 + docs/fides/docs/js/vis.js | 953 - docs/fides/docs/language/overview.md | 32 - docs/fides/docs/language/resources/dataset.md | 226 - .../docs/language/resources/organization.md | 95 - docs/fides/docs/language/resources/policy.md | 120 - .../fides/docs/language/resources/registry.md | 53 - docs/fides/docs/language/resources/system.md | 142 - docs/fides/docs/language/syntax.md | 95 - .../docs/language/taxonomy/data_categories.md | 113 - .../docs/language/taxonomy/data_qualifiers.md | 24 - .../docs/language/taxonomy/data_subjects.md | 77 - .../fides/docs/language/taxonomy/data_uses.md | 142 - docs/fides/docs/language/taxonomy/explorer.md | 40 - docs/fides/docs/language/taxonomy/overview.md | 50 - docs/fides/docs/license.md | 2 - docs/fides/docs/postman/using_postman.md | 106 + docs/fides/docs/quickstart/docker.md | 97 - docs/fides/docs/quickstart/local_full.md | 78 - .../fides/docs/quickstart/local_standalone.md | 73 - docs/fides/docs/quickstart/overview.md | 5 - .../saas_connectors/example_configs/adobe.md | 123 + .../example_configs/hubspot.md | 182 + .../example_configs/mailchimp.md | 111 + .../example_configs/outreach.md | 179 + .../example_configs/salesforce.md | 226 + .../example_configs/segment.md | 180 + .../example_configs/sendgrid.md | 67 + .../saas_connectors/example_configs/sentry.md | 189 + .../saas_connectors/example_configs/stripe.md | 470 + .../example_configs/zendesk.md | 150 + .../fides/docs/saas_connectors/saas_config.md | 651 + .../docs/saas_connectors/saas_connectors.md | 103 + .../fides/docs/saas_connectors/saas_oauth2.md | 158 + .../docs/saas_connectors/saas_pagination.md | 95 + .../saas_connectors/saas_postprocessors.md | 222 + docs/fides/docs/tutorial/add.md | 2 +- docs/fides/docs/tutorial/dataset.md | 4 +- docs/fides/docs/tutorial/policy.md | 2 +- docs/fides/docs/tutorial/system.md | 4 +- docs/fides/docs/{admin_ui => ui}/datasets.md | 16 +- docs/fides/docs/ui/datastores.md | 45 + docs/fides/docs/ui/deployment.md | 1 + docs/fides/docs/ui/local_dev.md | 53 + docs/fides/docs/ui/overview.md | 21 + docs/fides/docs/ui/privacy_center.md | 64 + docs/fides/docs/ui/subject_requests.md | 39 + docs/fides/docs/ui/user_management.md | 35 + docs/fides/docs/{admin_ui => ui}/wizard.md | 14 +- docs/fides/mkdocs.yml | 118 +- docs/fidesops/docs/img/access_execution.png | Bin 0 -> 45094 bytes docs/fidesops/docs/img/access_graph.png | Bin 0 -> 105901 bytes docs/fidesops/docs/img/admin_ui/admin_ui.png | Bin 0 -> 76276 bytes docs/fidesops/docs/img/erasure_graph.png | Bin 0 -> 71915 bytes docs/fidesops/docs/img/favicon.ico | Bin 0 -> 15406 bytes mssql-requirements.txt | 1 + noxfile.py | 1 + noxfiles/ci_nox.py | 301 +- noxfiles/constants_nox.py | 38 +- noxfiles/dev_nox.py | 40 +- noxfiles/docker_nox.py | 5 +- noxfiles/docs_nox.py | 7 +- noxfiles/run_infrastructure.py | 297 + noxfiles/utils_nox.py | 34 +- optional-requirements.txt | 32 +- pyproject.toml | 163 +- requirements.txt | 41 +- scripts/create_test_data.py | 274 + generate_docs.py => scripts/generate_docs.py | 2 +- scripts/mssql_discover.py | 73 + scripts/quickstart.py | 804 + setup.cfg | 27 +- setup.py | 82 +- src/{fidesctl => fides}/__init__.py | 0 src/{fidesctl => fides}/_version.py | 9 +- .../api/ctl => fides/api}/__init__.py | 0 .../database => fides/api/ctl}/__init__.py | 0 src/{fidesctl => fides}/api/ctl/alembic.ini | 0 .../api/ctl/database}/__init__.py | 0 .../api/ctl/database/crud.py | 4 +- .../api/ctl/database/database.py | 27 +- .../api/ctl/database/session.py | 2 +- src/{fidesctl => fides}/api/ctl/deps.py | 19 +- .../api/ctl/migrations}/__init__.py | 0 .../api/ctl/migrations/env.py | 18 +- .../api/ctl/migrations/script.py.mako | 0 .../versions/0210948a8147_initial.py | 439 + .../021d288d0ce3_add_consent_request.py | 58 + .../versions/07014ff34eb2_add_mariadb.py | 44 + ...dd_fidesctl_meta_to_organization_object.py | 0 .../155fd8e51d9d_add_fideslib_models.py | 118 - ...7_add_security_policy_link_and_erasure_.py | 0 ...e7_add_saas_config_to_connection_config.py | 53 + .../1ff88b7bd579_add_authorization_request.py | 60 + ...dddf820a3_another_fidesops_remote_merge.py | 23 + .../26934c96ec80_initial_migration.py | 0 .../27fe9da9d0f9_privacy_request_stopped.py | 26 + ..._adds_first_name_and_last_name_to_user_.py | 29 + ...f72b275_migrate_to_usage_of_evaluation_.py | 0 .../327cd266f7b3_update_dataset_depth.py | 0 .../3a7c5fb119c9_add_manual_connector_type.py | 61 + ...3465d_adds_provided_identity_table_for_.py | 73 + .../3d9c476d7cea_classification_management.py | 0 ...8_remove_qualifier_lists_from_data_set_.py | 0 ...0_add_optional_contact_information_for_.py | 0 .../ctl/migrations/versions/4fc34906c389_.py | 0 .../5078badb90b9_adds_drp_action_to_policy.py | 39 + ...d2_extend_data_use_with_recipients_and_.py | 0 .../migrations/versions/530fb8533ca4_test.py | 54 + .../55d61eb8ed12_add_default_policies.py | 386 + ...cd643d7_fidesops_user_and_client_detail.py | 60 + .../6b287ff8cde4_penultimate_ops_merge.py | 23 + ...0603d_add_egress_and_ingress_to_systems.py | 0 .../6f98e1bd7e4f_another_upstream_merge.py | 23 + .../732105cd54e3_update_dataset_field_name.py | 0 ...5f5b76ae_merge_unified_with_ctl_and_ops.py | 23 + .../versions/7a4f4042091e_manual_webhooks.py | 95 + ...dd_column_for_special_category_to_data_.py | 0 ...8b7082_update_fideslang_data_categories.py | 205 + ...81d34352e8_merge_ops_and_ctl_migrations.py | 23 + ...51d8a102a_add_created_at_and_updated_at.py | 2 +- ...70db16d05_add_fidesops_user_permissions.py | 59 + .../906d7198df28_privacy_request_approve.py | 58 + .../912d801f06c0_audit_log_email_send.py | 32 + .../97801300fedd_identity_verification.py | 38 + .../api/ctl/migrations/versions}/__init__.py | 0 .../versions/a0e6feb5bdc8_add_consent.py | 66 + ...baf_data_protection_impact_assessments_.py | 0 .../aaa81d97a6f6_prepend_tables_with_ctl.py | 0 .../adad3be6af08_privacy_notice_attributes.py | 0 ...7c4a0_add_connection_config_description.py | 34 + .../bab75915670a_add_finished_audit_log.py | 32 + .../bde646a6f51e_add_execution_timeframe.py | 29 + ...3596_add_fidesctl_meta_field_to_dataset.py | 0 .../c2f7a29c4780_email_connection_config.py | 41 + .../c3472d75c80e_connectionconfig_disabled.py | 45 + .../c4df5d585029_data_use_unique_together.py | 31 + .../c5336b841d70_add_policy_webhooks.py | 111 + .../versions/c61fd9d4f73e_emailconfig.py | 70 + ...d4b_rename_user_name_tables_and_indexes.py | 136 + ...add_user_login_and_password_reset_dates.py | 30 + .../versions/c98da12d76f8_add_audit_log.py | 64 + .../cdbd0fa118dd_unified_fides_2_merger.py | 23 + .../versions/cf88efa1ad89_add_timescale_db.py | 45 + ...d65e7e921814_add_privacy_request_status.py | 34 + .../versions/d8df7ff7aab4_add_due_date.py | 30 + ...54f_add_tags_as_part_of_fideslang_1_1_0.py | 0 .../versions/e55a51b354e3_add_bigquery.py | 44 + ...6a80a49_add_parent_key_to_dataqualifier.py | 0 .../ed1b00ff963d_cancel_privacy_request.py | 45 + ...dcd28ede1f7_add_fidesctl_meta_to_system.py | 0 ...63a10_add_is_default_to_taxonomy_fields.py | 0 ...574d_add_redshift_and_snowflake_support.py | 45 + .../versions/f3841942d90c_add_mssql.py | 44 + .../versions/f53e04e5b7f5_merge_heads.py | 0 .../fb6b0150d6e4_final_unified_ctl_merge.py | 23 + ...bbcde_populate_saas_type_to_saas_config.py | 76 + ..._add_responsibility_role_attribute_for_.py | 0 .../api/ctl/routes}/__init__.py | 0 .../api/ctl/routes/admin.py | 12 +- .../api/ctl/routes/crud.py | 10 +- .../api/ctl/routes/datamap.py | 14 +- .../api/ctl/routes/generate.py | 20 +- src/fides/api/ctl/routes/health.py | 90 + .../api/ctl/routes/util.py | 20 +- .../api/ctl/routes/validate.py | 12 +- .../api/ctl/routes/visualize.py | 10 +- src/{fidesctl => fides}/api/ctl/sql_models.py | 14 +- src/{fidesctl => fides}/api/ctl/ui.py | 6 +- .../api/ctl/utils}/__init__.py | 0 .../api/ctl/utils/api_router.py | 0 .../api/ctl/utils/errors.py | 0 .../api/ctl/utils/logger.py | 0 src/{fidesctl => fides}/api/ctl/view.py | 6 +- src/fides/api/main.py | 313 + .../ctl => fides/api/ops}/__init__.py | 0 src/fides/api/ops/analytics.py | 54 + .../api/ops/api}/__init__.py | 0 src/fides/api/ops/api/deps.py | 45 + .../core => fides/api/ops/api/v1}/__init__.py | 0 src/fides/api/ops/api/v1/api.py | 43 + .../api/ops/api/v1/endpoints/__init__.py | 0 .../ops/api/v1/endpoints/config_endpoints.py | 27 + .../api/v1/endpoints/connection_endpoints.py | 397 + .../v1/endpoints/connection_type_endpoints.py | 164 + .../v1/endpoints/consent_request_endpoints.py | 275 + .../ops/api/v1/endpoints/dataset_endpoints.py | 406 + .../api/ops/api/v1/endpoints/drp_endpoints.py | 225 + .../ops/api/v1/endpoints/email_endpoints.py | 230 + .../api/v1/endpoints/encryption_endpoints.py | 82 + .../identity_verification_endpoints.py | 34 + .../v1/endpoints/manual_webhook_endpoints.py | 202 + .../ops/api/v1/endpoints/masking_endpoints.py | 52 + .../ops/api/v1/endpoints/oauth_endpoints.py | 225 + .../ops/api/v1/endpoints/policy_endpoints.py | 443 + .../v1/endpoints/policy_webhook_endpoints.py | 489 + .../v1/endpoints/privacy_request_endpoints.py | 1436 + .../api/v1/endpoints/saas_config_endpoints.py | 340 + .../ops/api/v1/endpoints/storage_endpoints.py | 294 + .../ops/api/v1/endpoints/user_endpoints.py | 163 + .../v1/endpoints/user_permission_endpoints.py | 94 + .../api/ops/api/v1/exception_handlers.py | 23 + src/fides/api/ops/api/v1/scope_registry.py | 119 + src/fides/api/ops/api/v1/urn_registry.py | 137 + src/fides/api/ops/common_exceptions.py | 189 + src/fides/api/ops/db/__init__.py | 0 src/fides/api/ops/db/base.py | 17 + src/fides/api/ops/db/base_class.py | 34 + src/fides/api/ops/email_templates/__init__.py | 1 + .../ops/email_templates/get_email_template.py | 52 + .../api/ops/email_templates/template_names.py | 8 + .../consent_request_verification.html | 15 + .../erasure_request_email_fulfillment.html | 39 + .../privacy_request_complete_access.html | 26 + .../privacy_request_complete_deletion.html | 14 + .../templates/privacy_request_receipt.html | 25 + .../privacy_request_review_approve.html | 14 + .../privacy_request_review_deny.html | 20 + .../subject_identity_verification.html | 16 + src/fides/api/ops/graph/__init__.py | 0 src/fides/api/ops/graph/analytics_events.py | 108 + src/fides/api/ops/graph/config.py | 502 + src/fides/api/ops/graph/data_type.py | 273 + src/fides/api/ops/graph/graph.py | 259 + src/fides/api/ops/graph/graph_differences.py | 208 + src/fides/api/ops/graph/traversal.py | 377 + src/fides/api/ops/migrations/__init__.py | 0 .../versions/0210948a8147_initial.py | 439 + .../021d288d0ce3_add_consent_request.py | 58 + .../versions/07014ff34eb2_add_mariadb.py | 44 + ...e7_add_saas_config_to_connection_config.py | 53 + .../1ff88b7bd579_add_authorization_request.py | 60 + .../27fe9da9d0f9_privacy_request_stopped.py | 26 + ..._adds_first_name_and_last_name_to_user_.py | 29 + .../3a7c5fb119c9_add_manual_connector_type.py | 61 + ...3465d_adds_provided_identity_table_for_.py | 73 + .../5078badb90b9_adds_drp_action_to_policy.py | 39 + .../migrations/versions/530fb8533ca4_test.py | 54 + .../55d61eb8ed12_add_default_policies.py | 385 + ...cd643d7_fidesops_user_and_client_detail.py | 60 + .../versions/7a4f4042091e_manual_webhooks.py | 95 + ...8b7082_update_fideslang_data_categories.py | 203 + ...70db16d05_add_fidesops_user_permissions.py | 59 + .../906d7198df28_privacy_request_approve.py | 58 + .../912d801f06c0_audit_log_email_send.py | 32 + .../97801300fedd_identity_verification.py | 38 + .../api/ops/migrations/versions/__init__.py | 0 .../versions/a0e6feb5bdc8_add_consent.py | 66 + ...7c4a0_add_connection_config_description.py | 34 + .../bab75915670a_add_finished_audit_log.py | 32 + .../bde646a6f51e_add_execution_timeframe.py | 29 + .../c2f7a29c4780_email_connection_config.py | 41 + .../c3472d75c80e_connectionconfig_disabled.py | 45 + .../c5336b841d70_add_policy_webhooks.py | 111 + .../versions/c61fd9d4f73e_emailconfig.py | 70 + ...d4b_rename_user_name_tables_and_indexes.py | 136 + ...add_user_login_and_password_reset_dates.py | 30 + .../versions/c98da12d76f8_add_audit_log.py | 64 + .../versions/cf88efa1ad89_add_timescale_db.py | 45 + ...d65e7e921814_add_privacy_request_status.py | 34 + .../versions/d8df7ff7aab4_add_due_date.py | 30 + .../versions/e55a51b354e3_add_bigquery.py | 44 + .../ed1b00ff963d_cancel_privacy_request.py | 45 + ...574d_add_redshift_and_snowflake_support.py | 45 + .../versions/f3841942d90c_add_mssql.py | 44 + ...bbcde_populate_saas_type_to_saas_config.py | 76 + src/fides/api/ops/models/__init__.py | 0 .../api/ops/models/authentication_request.py | 34 + src/fides/api/ops/models/connectionconfig.py | 213 + src/fides/api/ops/models/datasetconfig.py | 222 + src/fides/api/ops/models/email.py | 122 + src/fides/api/ops/models/manual_webhook.py | 84 + src/fides/api/ops/models/policy.py | 562 + src/fides/api/ops/models/privacy_request.py | 995 + src/fides/api/ops/models/storage.py | 110 + src/fides/api/ops/schemas/__init__.py | 1 + src/fides/api/ops/schemas/analytics.py | 14 + src/fides/api/ops/schemas/api.py | 30 + src/fides/api/ops/schemas/base_class.py | 32 + src/fides/api/ops/schemas/client.py | 8 + .../connection_configuration/__init__.py | 116 + .../connection_config.py | 118 + .../connection_secrets.py | 54 + .../connection_secrets_bigquery.py | 36 + .../connection_secrets_email.py | 19 + .../connection_secrets_manual_webhook.py | 9 + .../connection_secrets_mariadb.py | 24 + .../connection_secrets_mongodb.py | 22 + .../connection_secrets_mssql.py | 27 + .../connection_secrets_mysql.py | 24 + .../connection_secrets_postgres.py | 25 + .../connection_secrets_redshift.py | 23 + .../connection_secrets_saas.py | 109 + .../connection_secrets_snowflake.py | 30 + .../connection_secrets_timescale.py | 14 + .../connections_secrets_https.py | 19 + src/fides/api/ops/schemas/dataset.py | 260 + .../api/ops/schemas/drp_privacy_request.py | 75 + src/fides/api/ops/schemas/email/__init__.py | 0 src/fides/api/ops/schemas/email/email.py | 178 + .../schemas/email/email_secrets_docs_only.py | 11 + .../api/ops/schemas/encryption_request.py | 43 + src/fides/api/ops/schemas/external_https.py | 63 + .../api/ops/schemas/identity_verification.py | 8 + .../api/ops/schemas/manual_webhook_schemas.py | 121 + src/fides/api/ops/schemas/masking/__init__.py | 0 .../api/ops/schemas/masking/masking_api.py | 19 + .../schemas/masking/masking_configuration.py | 70 + .../ops/schemas/masking/masking_secrets.py | 34 + .../masking/masking_strategy_description.py | 19 + src/fides/api/ops/schemas/msg.py | 7 + src/fides/api/ops/schemas/policy.py | 122 + src/fides/api/ops/schemas/policy_webhooks.py | 86 + src/fides/api/ops/schemas/privacy_request.py | 256 + src/fides/api/ops/schemas/redis_cache.py | 17 + src/fides/api/ops/schemas/saas/__init__.py | 0 src/fides/api/ops/schemas/saas/saas_config.py | 353 + .../api/ops/schemas/saas/shared_schemas.py | 45 + .../schemas/saas/strategy_configuration.py | 158 + src/fides/api/ops/schemas/shared_schemas.py | 24 + src/fides/api/ops/schemas/storage/__init__.py | 0 .../storage/data_upload_location_response.py | 7 + src/fides/api/ops/schemas/storage/storage.py | 241 + .../storage/storage_secrets_docs_only.py | 18 + .../api/ops/schemas/third_party/__init__.py | 0 .../api/ops/schemas/third_party/onetrust.py | 114 + src/fides/api/ops/schemas/user_permission.py | 40 + src/fides/api/ops/service/__init__.py | 0 src/fides/api/ops/service/_verification.py | 44 + .../ops/service/authentication/__init__.py | 7 + .../authentication/authentication_strategy.py | 16 + .../authentication_strategy_api_key.py | 63 + .../authentication_strategy_basic.py | 38 + .../authentication_strategy_bearer.py | 32 + .../authentication_strategy_factory.py | 78 + ...tion_strategy_oauth2_authorization_code.py | 129 + .../authentication_strategy_oauth2_base.py | 221 + ...tion_strategy_oauth2_client_credentials.py | 39 + .../authentication_strategy_query_param.py | 40 + .../api/ops/service/connectors/__init__.py | 49 + .../ops/service/connectors/base_connector.py | 98 + .../ops/service/connectors/email_connector.py | 217 + .../ops/service/connectors/http_connector.py | 104 + .../service/connectors/limiter/__init__.py | 0 .../connectors/limiter/rate_limiter.py | 81 + .../service/connectors/manual_connector.py | 109 + .../connectors/manual_webhook_connector.py | 62 + .../service/connectors/mongodb_connector.py | 148 + .../ops/service/connectors/query_config.py | 760 + .../ops/service/connectors/saas/__init__.py | 0 .../connectors/saas/authenticated_client.py | 225 + .../saas/connector_registry_service.py | 223 + .../ops/service/connectors/saas_connector.py | 427 + .../service/connectors/saas_query_config.py | 373 + .../ops/service/connectors/sql_connector.py | 429 + .../service/connectors/timescale_connector.py | 5 + src/fides/api/ops/service/drp/__init__.py | 0 .../ops/service/drp/drp_fidesops_mapper.py | 66 + src/fides/api/ops/service/email/__init__.py | 0 .../ops/service/email/email_crud_service.py | 74 + .../service/email/email_dispatch_service.py | 208 + src/fides/api/ops/service/masking/__init__.py | 8 + .../ops/service/masking/strategy/__init__.py | 0 .../masking/strategy/format_preservation.py | 11 + .../masking/strategy/masking_strategy.py | 39 + .../strategy/masking_strategy_aes_encrypt.py | 141 + .../strategy/masking_strategy_factory.py | 68 + .../masking/strategy/masking_strategy_hash.py | 126 + .../masking/strategy/masking_strategy_hmac.py | 113 + .../strategy/masking_strategy_nullify.py | 47 + .../masking_strategy_random_string_rewrite.py | 71 + .../masking_strategy_string_rewrite.py | 67 + .../api/ops/service/outbound_urn_registry.py | 5 + .../api/ops/service/pagination/__init__.py | 5 + .../service/pagination/pagination_strategy.py | 32 + .../pagination/pagination_strategy_cursor.py | 52 + .../pagination/pagination_strategy_factory.py | 72 + .../pagination/pagination_strategy_link.py | 71 + .../pagination/pagination_strategy_offset.py | 85 + .../ops/service/privacy_request/__init__.py | 0 .../privacy_request/onetrust_service.py | 244 + .../privacy_request/request_runner_service.py | 503 + .../privacy_request/request_service.py | 68 + .../api/ops/service/processors/__init__.py | 0 .../post_processor_strategy/__init__.py | 4 + .../post_processor_strategy.py | 14 + .../post_processor_strategy_factory.py | 66 + .../post_processor_strategy_filter.py | 158 + .../post_processor_strategy_unwrap.py | 80 + .../api/ops/service/saas_request/__init__.py | 3 + .../override_implementations/__init__.py | 0 .../firebase_auth_request_overrides.py | 166 + .../mailchimp_request_overrides.py | 137 + .../saas_request_override_factory.py | 169 + src/fides/api/ops/service/storage/__init__.py | 0 .../storage/storage_authenticator_service.py | 58 + .../storage/storage_uploader_service.py | 124 + src/fides/api/ops/service/strategy.py | 77 + src/fides/api/ops/task/__init__.py | 0 .../api/ops/task/consolidate_query_matches.py | 41 + .../api/ops/task/filter_element_match.py | 156 + src/fides/api/ops/task/filter_results.py | 140 + src/fides/api/ops/task/graph_task.py | 808 + src/fides/api/ops/task/refine_target_path.py | 186 + src/fides/api/ops/task/task_resources.py | 193 + src/fides/api/ops/tasks/__init__.py | 82 + src/fides/api/ops/tasks/scheduled/__init__.py | 0 .../api/ops/tasks/scheduled/scheduler.py | 3 + src/fides/api/ops/tasks/scheduled/tasks.py | 55 + src/fides/api/ops/tasks/storage.py | 204 + src/fides/api/ops/util/__init__.py | 0 src/fides/api/ops/util/api_router.py | 35 + src/fides/api/ops/util/cache.py | 158 + src/fides/api/ops/util/collection_util.py | 54 + src/fides/api/ops/util/constants.py | 1 + src/fides/api/ops/util/data_category.py | 28 + src/fides/api/ops/util/encryption/__init__.py | 0 .../encryption/aes_gcm_encryption_scheme.py | 89 + .../util/encryption/hmac_encryption_scheme.py | 64 + .../api/ops/util/encryption/secrets_util.py | 77 + src/fides/api/ops/util/enums.py | 6 + src/fides/api/ops/util/logger.py | 71 + src/fides/api/ops/util/matching_queue.py | 45 + src/fides/api/ops/util/oauth_util.py | 155 + src/fides/api/ops/util/querytoken.py | 8 + src/fides/api/ops/util/saas_util.py | 291 + .../api/ops/util/storage_authenticator.py | 60 + src/fides/api/ops/util/text.py | 15 + src/fides/api/ops/util/url_util.py | 17 + src/fides/api/ops/util/wrappers.py | 17 + src/{fidesctl => fides}/cli/__init__.py | 56 +- src/fides/cli/commands/__init__.py | 0 .../cli/commands/annotate.py | 8 +- src/{fidesctl => fides}/cli/commands/core.py | 46 +- src/{fidesctl => fides}/cli/commands/crud.py | 8 +- src/{fidesctl => fides}/cli/commands/db.py | 12 +- .../cli/commands/export.py | 12 +- .../cli/commands/generate.py | 26 +- src/{fidesctl => fides}/cli/commands/scan.py | 22 +- src/{fidesctl => fides}/cli/commands/util.py | 51 +- src/{fidesctl => fides}/cli/commands/view.py | 16 +- src/{fidesctl => fides}/cli/options.py | 4 +- src/{fidesctl => fides}/cli/utils.py | 57 +- src/fides/ctl/__init__.py | 0 src/fides/ctl/connectors/__init__.py | 0 src/{fidesctl => fides}/ctl/connectors/aws.py | 2 +- .../ctl/connectors/bigquery.py | 2 +- .../ctl/connectors/models.py | 0 .../ctl/connectors/okta.py | 2 +- src/fides/ctl/core/__init__.py | 0 .../ctl/core/annotate_dataset.py | 12 +- src/{fidesctl => fides}/ctl/core/api.py | 4 +- .../ctl/core/api_helpers.py | 2 +- src/{fidesctl => fides}/ctl/core/audit.py | 6 +- src/fides/ctl/core/config/__init__.py | 208 + .../ctl/core/config/admin_ui_settings.py | 10 + .../ctl/core/config/cli_settings.py | 5 +- .../ctl/core/config/credentials_settings.py | 10 +- .../ctl/core/config/database_settings.py | 38 +- .../ctl/core/config/execution_settings.py | 20 + .../ctl/core/config/fides_settings.py | 0 .../ctl/core/config/logging_settings.py | 39 +- .../ctl/core/config/notification_settings.py | 18 + src/fides/ctl/core/config/redis_settings.py | 43 + .../ctl/core/config/security_settings.py | 15 +- .../ctl/core/config/user_settings.py | 10 +- .../ctl/core/config/utils.py | 10 +- src/{fidesctl => fides}/ctl/core/dataset.py | 8 +- src/{fidesctl => fides}/ctl/core/evaluate.py | 13 +- src/{fidesctl => fides}/ctl/core/export.py | 8 +- .../ctl/core/export_helpers.py | 6 +- src/{fidesctl => fides}/ctl/core/filters.py | 0 src/{fidesctl => fides}/ctl/core/parse.py | 2 +- src/{fidesctl => fides}/ctl/core/pull.py | 8 +- src/{fidesctl => fides}/ctl/core/push.py | 8 +- src/{fidesctl => fides}/ctl/core/system.py | 26 +- src/{fidesctl => fides}/ctl/core/utils.py | 4 +- src/{fidesctl => fides}/ctl/core/visualize.py | 0 src/fides/py.typed | 0 .../templates/fides_datamap_template.xlsx | Bin src/fidesctl.egg-info/entry_points.txt | 3 - src/fidesctl/api/ctl/routes/health.py | 61 - src/fidesctl/api/ctl/routes/user.py | 110 - src/fidesctl/api/main.py | 152 - src/fidesctl/ctl/core/config/__init__.py | 116 - tests/ctl/api/test_database.py | 14 +- tests/ctl/api/test_datamap.py | 7 +- tests/ctl/api/test_generate.py | 16 +- tests/ctl/api/test_ui.py | 2 +- tests/ctl/api/test_user_endpoints.py | 721 - tests/ctl/api/test_validate.py | 10 +- tests/ctl/cli/test_cli.py | 76 +- tests/ctl/cli/test_cli_utils.py | 42 +- tests/ctl/conftest.py | 16 +- tests/ctl/connectors/test_aws.py | 12 +- tests/ctl/connectors/test_okta.py | 8 +- .../core/config/test_credentials_settings.py | 24 +- tests/ctl/core/test_api.py | 62 +- tests/ctl/core/test_api_helpers.py | 22 +- tests/ctl/core/test_apply.py | 2 +- tests/ctl/core/test_audit.py | 2 +- tests/ctl/core/test_config.py | 166 +- tests/ctl/core/test_config_utils.py | 6 +- tests/ctl/core/test_dataset.py | 16 +- tests/ctl/core/test_evaluate.py | 26 +- tests/ctl/core/test_export.py | 14 +- tests/ctl/core/test_export_helpers.py | 2 +- tests/ctl/core/test_filters.py | 2 +- tests/ctl/core/test_pull.py | 6 +- tests/ctl/core/test_system.py | 30 +- tests/ctl/core/test_utils.py | 8 +- tests/ctl/core/test_visualize.py | 2 +- tests/ctl/database/test_crud.py | 10 +- tests/ctl/test_config.toml | 12 +- tests/ctl/test_invalid_config.toml | 6 +- tests/ops/.gitignore | 1 + tests/ops/__init__.py | 1 + tests/ops/api/__init__.py | 0 tests/ops/api/test_deps.py | 21 + tests/ops/api/v1/__init__.py | 0 tests/ops/api/v1/endpoints/__init__.py | 0 .../api/v1/endpoints/test_config_endpoints.py | 44 + .../test_connection_config_endpoints.py | 1338 + .../test_connection_template_endpoints.py | 723 + .../test_consent_request_endpoints.py | 438 + .../v1/endpoints/test_dataset_endpoints.py | 1189 + .../api/v1/endpoints/test_drp_endpoints.py | 496 + .../api/v1/endpoints/test_email_endpoints.py | 498 + .../v1/endpoints/test_encryption_endpoints.py | 179 + .../api/v1/endpoints/test_health_endpoints.py | 13 + .../test_identity_verification_endpoints.py | 72 + .../api/v1/endpoints/test_manual_webhooks.py | 543 + .../v1/endpoints/test_masking_endpoints.py | 212 + .../api/v1/endpoints/test_oauth_endpoints.py | 517 + .../api/v1/endpoints/test_policy_endpoints.py | 1108 + .../test_policy_webhook_endpoints.py | 1006 + .../test_privacy_request_endpoints.py | 3574 +++ .../endpoints/test_saas_config_endpoints.py | 454 + .../v1/endpoints/test_storage_endpoints.py | 872 + .../api/v1/endpoints/test_user_endpoints.py | 853 + .../test_user_permission_endpoints.py | 249 + tests/ops/api/v1/test_exception_handlers.py | 56 + tests/ops/api/v1/test_main.py | 13 + tests/ops/conftest.py | 292 + tests/ops/core/__init__.py | 0 tests/ops/email_templates/__init__.py | 0 .../test_get_email_template.py | 18 + tests/ops/fixtures/__init__.py | 0 tests/ops/fixtures/application_fixtures.py | 1276 + tests/ops/fixtures/bigquery_fixtures.py | 377 + tests/ops/fixtures/email_fixtures.py | 52 + tests/ops/fixtures/integration_fixtures.py | 479 + tests/ops/fixtures/manual_fixtures.py | 50 + tests/ops/fixtures/manual_webhook_fixtures.py | 56 + tests/ops/fixtures/mariadb_fixtures.py | 129 + tests/ops/fixtures/mongodb_fixtures.py | 61 + tests/ops/fixtures/mssql_fixtures.py | 122 + tests/ops/fixtures/mysql_fixtures.py | 220 + tests/ops/fixtures/postgres_fixtures.py | 253 + tests/ops/fixtures/redshift_fixtures.py | 64 + tests/ops/fixtures/saas/__init__.py | 0 .../fixtures/saas/adobe_campaign_fixtures.py | 133 + tests/ops/fixtures/saas/auth0_fixtures.py | 201 + tests/ops/fixtures/saas/braze_fixtures.py | 232 + .../saas/connection_template_fixtures.py | 154 + tests/ops/fixtures/saas/datadog_fixtures.py | 153 + tests/ops/fixtures/saas/hubspot_fixtures.py | 290 + tests/ops/fixtures/saas/mailchimp_fixtures.py | 127 + tests/ops/fixtures/saas/outreach_fixtures.py | 160 + .../saas/request_override/__init__.py | 0 .../firebase_auth_fixtures.py | 171 + .../mailchimp_override_fixtures.py | 100 + tests/ops/fixtures/saas/rollbar_fixtures.py | 101 + .../ops/fixtures/saas/salesforce_fixtures.py | 257 + tests/ops/fixtures/saas/segment_fixtures.py | 229 + tests/ops/fixtures/saas/sendgrid_fixtures.py | 171 + tests/ops/fixtures/saas/sentry_fixtures.py | 98 + tests/ops/fixtures/saas/shopify_fixtures.py | 253 + tests/ops/fixtures/saas/square_fixtures.py | 298 + tests/ops/fixtures/saas/stripe_fixtures.py | 343 + tests/ops/fixtures/saas/zendesk_fixtures.py | 148 + tests/ops/fixtures/saas_example_fixtures.py | 238 + tests/ops/fixtures/snowflake_fixtures.py | 78 + tests/ops/fixtures/timescale_fixtures.py | 80 + tests/ops/generator/__init__.py | 0 tests/ops/generator/sql_data_generator.py | 104 + tests/ops/generator/test_data_generator.py | 60 + tests/ops/graph/__init__.py | 0 tests/ops/graph/graph_test_util.py | 263 + tests/ops/graph/test_config.py | 453 + tests/ops/graph/test_data_types.py | 76 + tests/ops/graph/test_edge.py | 115 + tests/ops/graph/test_graph.py | 114 + .../ops/graph/test_graph_analytics_events.py | 20 + tests/ops/graph/test_graph_differences.py | 917 + tests/ops/graph/test_graph_traversal.py | 695 + tests/ops/graph/test_traversal_node.py | 113 + tests/ops/integration_test_config.toml | 54 + tests/ops/integration_tests/__init__.py | 0 .../ops/integration_tests/limiter/__init__.py | 0 .../limiter/test_rate_limiter.py | 75 + tests/ops/integration_tests/saas/__init__.py | 0 .../saas/request_override/__init__.py | 0 .../test_firebase_auth_task.py | 220 + .../test_mailchimp_override_task.py | 217 + .../saas/test_adobe_campaign_task.py | 314 + .../integration_tests/saas/test_auth0_task.py | 167 + .../integration_tests/saas/test_braze_task.py | 206 + .../saas/test_datadog_task.py | 80 + .../saas/test_hubspot_task.py | 212 + .../saas/test_mailchimp_task.py | 200 + .../saas/test_outreach_task.py | 150 + .../saas/test_rollbar_task.py | 88 + .../saas/test_salesforce_task.py | 786 + .../saas/test_segment_task.py | 233 + .../saas/test_sendgrid_task.py | 149 + .../saas/test_sentry_task.py | 391 + .../saas/test_shopify_task.py | 556 + .../saas/test_square_task.py | 218 + .../saas/test_stripe_task.py | 1185 + .../saas/test_zendesk_task.py | 336 + .../setup_scripts/__init__.py | 0 .../setup_scripts/mariadb_setup.py | 84 + .../setup_scripts/mssql_setup.py | 39 + .../setup_scripts/postgres_setup.py | 74 + .../setup_scripts/timescale_setup.py | 74 + ...st_connection_configuration_integration.py | 1447 + .../ops/integration_tests/test_email_task.py | 1 + tests/ops/integration_tests/test_execution.py | 849 + .../test_external_database_connections.py | 137 + .../test_integration_email.py | 195 + .../test_integration_mariadb_example.py | 32 + .../test_integration_mongodb_example.py | 26 + .../test_integration_mssql_example.py | 36 + .../test_integration_mysql_example.py | 32 + .../test_integration_postgres_example.py | 33 + .../test_integration_timescale_example.py | 32 + .../ops/integration_tests/test_manual_task.py | 479 + .../ops/integration_tests/test_mongo_task.py | 1184 + tests/ops/integration_tests/test_sql_task.py | 1477 + tests/ops/models/__init__.py | 0 tests/ops/models/test_base.py | 103 + tests/ops/models/test_client.py | 59 + tests/ops/models/test_connectionconfig.py | 149 + tests/ops/models/test_datasetconfig.py | 149 + tests/ops/models/test_fidesopsuser.py | 50 + .../models/test_fidesopsuserpermissions.py | 33 + tests/ops/models/test_manual_webhook.py | 44 + tests/ops/models/test_policy.py | 355 + tests/ops/models/test_policy_webhooks.py | 90 + tests/ops/models/test_privacy_request.py | 802 + tests/ops/models/test_saasconfig.py | 206 + tests/ops/models/test_storage.py | 98 + .../ops/resources/policy/masking_example.yaml | 43 + tests/ops/schemas/__init__.py | 0 .../connection_configuration/__init__.py | 0 .../test_connection_secrets_saas.py | 113 + tests/ops/schemas/email/email_test.py | 11 + tests/ops/schemas/test_user_permission.py | 22 + tests/ops/scripts/__init__.py | 0 tests/ops/service/__init__.py | 0 tests/ops/service/authentication/__init__.py | 0 .../test_authentication_strategy_api_key.py | 216 + .../test_authentication_strategy_basic.py | 50 + .../test_authentication_strategy_bearer.py | 29 + .../test_authentication_strategy_factory.py | 36 + ...tion_strategy_oauth2_authorization_code.py | 411 + ...tion_strategy_oauth2_client_credentials.py | 434 + ...est_authentication_strategy_query_param.py | 30 + .../ops/service/connection_config/__init__.py | 0 .../connection_config/test_http_connector.py | 56 + .../test_mariadb_connector.py | 47 + .../connection_config/test_mysql_connector.py | 45 + .../test_postgres_connector.py | 47 + tests/ops/service/connectors/__init__.py | 0 .../saas/test_authenticated_client.py | 122 + .../test_connector_registry_service.py | 467 + .../connectors/test_email_connector.py | 181 + .../service/connectors/test_queryconfig.py | 608 + .../service/connectors/test_saas_connector.py | 145 + .../connectors/test_saas_queryconfig.py | 522 + .../email/email_dispatch_service_test.py | 159 + tests/ops/service/masking/__init__.py | 0 .../ops/service/masking/strategy/__init__.py | 0 .../test_masking_strategy_aes_encrypt.py | 68 + .../strategy/test_masking_strategy_factory.py | 35 + .../strategy/test_masking_strategy_hash.py | 99 + .../strategy/test_masking_strategy_hmac.py | 126 + .../strategy/test_masking_strategy_null.py | 27 + ..._masking_strategy_random_string_rewrite.py | 33 + .../test_masking_strategy_string_rewrite.py | 29 + tests/ops/service/pagination/__init__.py | 0 .../test_pagination_strategy_cursor.py | 91 + .../test_pagination_strategy_factory.py | 53 + .../test_pagination_strategy_link.py | 174 + .../test_pagination_strategy_offset.py | 244 + tests/ops/service/privacy_request/__init__.py | 0 .../service/privacy_request/onetrust_test.py | 424 + .../request_runner_service_test.py | 2204 ++ tests/ops/service/processors/__init__.py | 0 .../post_processor_strategy/__init__.py | 0 .../test_post_processor_strategy_factory.py | 40 + .../test_post_processor_strategy_filter.py | 338 + .../test_post_processor_strategy_unwrap.py | 104 + tests/ops/service/saas_request/__init__.py | 0 .../test_saas_request_override_factory.py | 351 + .../service/storage_uploader_service_test.py | 500 + tests/ops/service/test_strategy_retrieval.py | 169 + tests/ops/task/__init__.py | 0 .../task/test_consolidate_query_matches.py | 50 + tests/ops/task/test_filter_element_match.py | 464 + tests/ops/task/test_filter_results.py | 936 + tests/ops/task/test_graph_task.py | 557 + tests/ops/task/test_refine_target_path.py | 315 + tests/ops/task/test_task_resources.py | 44 + tests/ops/task/traversal_data.py | 758 + tests/ops/tasks/__init__.py | 0 tests/ops/tasks/test_celery.py | 30 + tests/ops/tasks/test_scheduled.py | 46 + tests/ops/test_helpers/__init__.py | 0 .../ops/test_helpers/cache_secrets_helper.py | 23 + tests/ops/test_helpers/dataset_utils.py | 235 + tests/ops/test_helpers/saas_test_utils.py | 25 + tests/ops/test_helpers/test_dataset_utils.py | 667 + tests/ops/test_helpers/vault_client.py | 45 + tests/ops/util/__init__.py | 0 tests/ops/util/encryption/__init__.py | 0 .../test_aes_gcm_encryption_scheme.py | 45 + .../encryption/test_hmac_encryption_scheme.py | 29 + .../ops/util/encryption/test_secrets_util.py | 92 + tests/ops/util/test_api_router.py | 47 + tests/ops/util/test_cache.py | 75 + tests/ops/util/test_collection_util.py | 49 + tests/ops/util/test_dataset_yaml.py | 344 + tests/ops/util/test_jwt_util.py | 61 + tests/ops/util/test_logger.py | 26 + tests/ops/util/test_matching_queue.py | 16 + tests/ops/util/test_saas_util.py | 368 + 1470 files changed, 156131 insertions(+), 8474 deletions(-) delete mode 100644 .devcontainer/devcontainer.json create mode 100644 .fides/celery.toml rename .fides/{dataset.yml => db_dataset.yml} (54%) create mode 100644 .fides/fides.toml delete mode 100644 .fides/fidesctl.toml rename .fides/{policy.yml => policies.yml} (53%) create mode 100644 .fides/redis_dataset.yml delete mode 100644 .fides/system.yml create mode 100644 .fides/systems.yml create mode 100644 .github/dependabot.yaml create mode 100644 .github/workflows/backend_checks.yml delete mode 100644 .github/workflows/code_checks.yml create mode 100644 .github/workflows/codeql-analysis.yml rename .github/workflows/{frontend_pr_checks.yml => frontend_checks.yml} (56%) rename .github/workflows/{docker.yaml => publish_docker.yaml} (98%) create mode 100644 .github/workflows/publish_privacy_center_to_dockerhub.yaml create mode 100644 .vscode/launch.json rename clients/{ctl => }/admin-ui/.babelrc (100%) rename clients/{ctl => }/admin-ui/.env.development (65%) rename clients/{ctl => }/admin-ui/.env.production (100%) create mode 100644 clients/admin-ui/.eslintignore rename clients/{ctl => }/admin-ui/.eslintrc.json (84%) rename clients/{ctl => }/admin-ui/.gitignore (99%) create mode 100644 clients/admin-ui/.prettierignore create mode 100644 clients/admin-ui/.prettierrc.json rename clients/{ctl => }/admin-ui/LICENSE (100%) create mode 100644 clients/admin-ui/README.md rename clients/{ctl => }/admin-ui/__tests__/checkbox-tree.test.tsx (100%) rename clients/{ctl => }/admin-ui/__tests__/features/common/zones/config.test.ts (100%) rename clients/{ctl => }/admin-ui/__tests__/features/dataset-helpers.test.tsx (100%) rename clients/{ctl => }/admin-ui/__tests__/features/taxonomy-helpers.test.tsx (100%) rename clients/{ctl => }/admin-ui/__tests__/features/taxonomy-transform.test.tsx (100%) create mode 100644 clients/admin-ui/__tests__/index.test.tsx rename clients/{ctl => }/admin-ui/__tests__/jest.setup.ts (100%) create mode 100644 clients/admin-ui/__tests__/pages/datastore-connection/index.test.tsx create mode 100644 clients/admin-ui/__tests__/pages/login.test.tsx create mode 100644 clients/admin-ui/__tests__/test-utils.tsx rename clients/{ctl => }/admin-ui/cypress.config.ts (100%) rename clients/{ctl => }/admin-ui/cypress/.eslintrc.json (100%) rename clients/{ctl => }/admin-ui/cypress/.gitignore (100%) rename clients/{ctl => }/admin-ui/cypress/e2e/config-wizard.cy.ts (100%) rename clients/{ctl => }/admin-ui/cypress/e2e/datasets-classify.cy.ts (100%) rename clients/{ctl => }/admin-ui/cypress/e2e/datasets.cy.ts (99%) rename clients/{ctl => }/admin-ui/cypress/e2e/nav-bar.cy.ts (81%) rename clients/{ctl => }/admin-ui/cypress/e2e/systems.cy.ts (99%) rename clients/{ctl => }/admin-ui/cypress/e2e/taxonomy.cy.ts (99%) create mode 100644 clients/admin-ui/cypress/fixtures/classification/create.json create mode 100644 clients/admin-ui/cypress/fixtures/classification/list.json rename clients/{ctl => }/admin-ui/cypress/fixtures/classify/create.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/classify/dataset-in-review.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/classify/get-in-review.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/classify/list.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/classify/update.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/data_categories.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/data_qualifiers.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/data_subjects.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/data_uses.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/dataset.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/datasets.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/generate/dataset.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/generate/system.json (100%) create mode 100644 clients/admin-ui/cypress/fixtures/login.json rename clients/{ctl => }/admin-ui/cypress/fixtures/organization.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/system.json (100%) rename clients/{ctl => }/admin-ui/cypress/fixtures/systems.json (100%) rename clients/{ctl => }/admin-ui/cypress/support/commands.ts (61%) rename clients/{ctl => }/admin-ui/cypress/support/component-index.html (100%) rename clients/{ctl => }/admin-ui/cypress/support/component.ts (100%) rename clients/{ctl => }/admin-ui/cypress/support/e2e.ts (100%) rename clients/{ctl => }/admin-ui/cypress/support/stubs.ts (100%) rename clients/{ctl => }/admin-ui/cypress/tsconfig.json (100%) rename clients/{ctl => }/admin-ui/jest.config.js (74%) rename clients/{ctl => }/admin-ui/next-env.d.ts (100%) create mode 100644 clients/admin-ui/next.config.js rename clients/{ctl => }/admin-ui/package-lock.json (91%) rename clients/{ctl => }/admin-ui/package.json (78%) rename clients/{ctl => }/admin-ui/public/favicon.ico (100%) create mode 100644 clients/admin-ui/public/images/connector-logos/adobe.svg create mode 100644 clients/admin-ui/public/images/connector-logos/ethyca.svg create mode 100644 clients/admin-ui/public/images/connector-logos/hubspot.svg create mode 100644 clients/admin-ui/public/images/connector-logos/mailchimp.svg create mode 100644 clients/admin-ui/public/images/connector-logos/manual_webhook.svg create mode 100644 clients/admin-ui/public/images/connector-logos/mariadb.svg create mode 100644 clients/admin-ui/public/images/connector-logos/mongodb.svg create mode 100644 clients/admin-ui/public/images/connector-logos/mysql.svg create mode 100644 clients/admin-ui/public/images/connector-logos/outreach.svg create mode 100644 clients/admin-ui/public/images/connector-logos/postgres.svg create mode 100644 clients/admin-ui/public/images/connector-logos/redshift.svg create mode 100644 clients/admin-ui/public/images/connector-logos/salesforce.svg create mode 100644 clients/admin-ui/public/images/connector-logos/segment.svg create mode 100644 clients/admin-ui/public/images/connector-logos/sentry.svg create mode 100644 clients/admin-ui/public/images/connector-logos/snowflake.svg create mode 100644 clients/admin-ui/public/images/connector-logos/sqlserver.svg create mode 100644 clients/admin-ui/public/images/connector-logos/stripe.svg create mode 100644 clients/admin-ui/public/images/connector-logos/zendesk.svg rename clients/{ctl => }/admin-ui/public/logo-icon.svg (100%) create mode 100644 clients/admin-ui/public/logo.svg create mode 100644 clients/admin-ui/src/app/hooks.ts create mode 100644 clients/admin-ui/src/app/store.ts create mode 100644 clients/admin-ui/src/constants.ts rename clients/{ctl => }/admin-ui/src/features/YamlForm.tsx (100%) create mode 100644 clients/admin-ui/src/features/auth/ProtectedRoute.tsx create mode 100644 clients/admin-ui/src/features/auth/__tests__/ProtectedRoute.test.tsx create mode 100644 clients/admin-ui/src/features/auth/auth.slice.ts create mode 100644 clients/admin-ui/src/features/auth/index.ts create mode 100644 clients/admin-ui/src/features/auth/types.ts rename clients/{ctl => }/admin-ui/src/features/common/AccordionTree.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/BorderGrid.module.css rename clients/{ctl => }/admin-ui/src/features/common/BorderGrid.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/CheckboxTree.tsx (99%) create mode 100644 clients/admin-ui/src/features/common/ClipboardButton.tsx create mode 100644 clients/admin-ui/src/features/common/CommonHeaders.ts rename clients/{ctl => }/admin-ui/src/features/common/ConfirmationModal.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/DataTabs.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/DaysLeftTag.tsx rename clients/{ctl => }/admin-ui/src/features/common/DocsLink.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Head.tsx rename clients/{ctl => }/admin-ui/src/features/common/Header.tsx (63%) rename clients/{ctl => }/admin-ui/src/features/common/HorizontalStepper.tsx (94%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/AWSLogo.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/Add.tsx create mode 100644 clients/admin-ui/src/features/common/Icon/ArrowDownLine.tsx rename clients/{ctl/admin-ui/src/features/common/Icon/ArrowDownLine.tsx => admin-ui/src/features/common/Icon/ArrowDownLineCtl.tsx} (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/ArrowUpLine.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/CircleHelp.tsx create mode 100644 clients/admin-ui/src/features/common/Icon/CloseSolid.tsx rename clients/{ctl/admin-ui/src/features/common/Icon/CloseSolid.tsx => admin-ui/src/features/common/Icon/CloseSolidCtl.tsx} (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/DownloadSolid.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/ErrorWarning.tsx rename clients/{ctl => }/admin-ui/src/features/common/Icon/Eye.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/Gear.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/GreenCheckCircle.tsx rename clients/{ctl => }/admin-ui/src/features/common/Icon/HorizontalLine.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/ManualSetup.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/More.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/OktaLogo.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/Question.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/SearchLine.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/SortArrow.tsx rename clients/{ctl => }/admin-ui/src/features/common/Icon/StepperCircle.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/StepperCircleCheckmark.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/Icon/TrashCanSolid.tsx rename clients/{ctl => }/admin-ui/src/features/common/Icon/User.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/VerticalLine.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Icon/index.tsx (74%) create mode 100644 clients/admin-ui/src/features/common/Image.tsx rename clients/{ctl => }/admin-ui/src/features/common/Layout.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/NavBar.tsx create mode 100644 clients/admin-ui/src/features/common/PII.tsx create mode 100644 clients/admin-ui/src/features/common/PIIToggle.tsx create mode 100644 clients/admin-ui/src/features/common/PaginationFooter.tsx rename clients/{ctl => }/admin-ui/src/features/common/QuestionTooltip.tsx (58%) create mode 100644 clients/admin-ui/src/features/common/RequestStatusBadge.tsx create mode 100644 clients/admin-ui/src/features/common/RequestType.tsx rename clients/{ctl => }/admin-ui/src/features/common/SearchBar.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/Stepper.tsx (98%) rename clients/{ctl => }/admin-ui/src/features/common/constants.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/countries.ts (100%) create mode 100644 clients/admin-ui/src/features/common/dropdown/MultiSelectDropdown.tsx create mode 100644 clients/admin-ui/src/features/common/dropdown/MultiSelectDropdownList.tsx create mode 100644 clients/admin-ui/src/features/common/dropdown/SelectDropdown.tsx create mode 100644 clients/admin-ui/src/features/common/dropdown/types.ts rename clients/{ctl => }/admin-ui/src/features/common/features.slice.ts (100%) rename clients/{ctl => }/admin-ui/src/features/common/form/inputs.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/helpers.ts (57%) create mode 100644 clients/admin-ui/src/features/common/hooks/index.ts create mode 100644 clients/admin-ui/src/features/common/hooks/useAPIHelper.ts create mode 100644 clients/admin-ui/src/features/common/hooks/useAlert.tsx create mode 100644 clients/admin-ui/src/features/common/hooks/useOutsideClick.ts rename clients/{ctl => }/admin-ui/src/features/common/nav/NavBar.tsx (75%) rename clients/{ctl => }/admin-ui/src/features/common/nav/NavButton.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/nav/NavLink.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/nav/zone-config.ts (100%) rename clients/{ctl => }/admin-ui/src/features/common/plus.slice.ts (100%) rename clients/{ctl => }/admin-ui/src/features/common/toast.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/common/types.tsx (100%) create mode 100644 clients/admin-ui/src/features/common/utils.ts rename clients/{ctl => }/admin-ui/src/features/common/zones/config.ts (100%) rename clients/{ctl => }/admin-ui/src/features/common/zones/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/common/zones/types.ts (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/AddSystemForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/AuthenticateAwsForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/AuthenticateScanner.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/ConfigWizardWalkthrough.tsx (97%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/OrganizationInfoForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/ScanResultsForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/ScannerError.tsx (100%) rename clients/{ctl/admin-ui/src/features/system/SystemRegisterSuccess.tsx => admin-ui/src/features/config-wizard/SuccessPage.tsx} (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/ViewYourDataMapPage.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/config-wizard.slice.ts (96%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/constants.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/scanner.slice.ts (100%) rename clients/{ctl => }/admin-ui/src/features/config-wizard/setup.tsx (100%) create mode 100644 clients/admin-ui/src/features/connection-type/connection-type.slice.ts create mode 100644 clients/admin-ui/src/features/connection-type/index.ts create mode 100644 clients/admin-ui/src/features/connection-type/types.ts rename clients/{ctl => }/admin-ui/src/features/data-qualifier/data-qualifier.slice.ts (94%) rename clients/{ctl => }/admin-ui/src/features/data-subjects/data-subject.slice.ts (94%) rename clients/{ctl => }/admin-ui/src/features/data-use/data-use.slice.ts (93%) rename clients/{ctl => }/admin-ui/src/features/dataset/ApproveClassification.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/ClassifiedDataCategoryDropdown.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/ColumnDropdown.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DataCategoryDropdown.tsx (97%) rename clients/{ctl => }/admin-ui/src/features/dataset/DataCategoryInput.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatabaseConnectForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetCollectionView.tsx (98%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetFieldCell.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetFieldsTable.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetHeading.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetTable.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/DatasetYamlForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditCollectionDrawer.tsx (97%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditCollectionOrFieldForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditDatasetDrawer.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditDatasetForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditDrawer.tsx (96%) rename clients/{ctl => }/admin-ui/src/features/dataset/EditFieldDrawer.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/MoreActionsMenu.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/constants.ts (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/dataset.slice.ts (95%) rename clients/{ctl => }/admin-ui/src/features/dataset/helpers.ts (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/dataset/types.ts (100%) create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionFilters.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionGrid.module.css create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionGrid.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionGridItem.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionMenu.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionStatusBadge.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionTypeLogo.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionsContainer.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionsEmptyState.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionsHeader.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/ConnectionsLayout.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/DeleteConnectionModal.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/DisableConnectionModal.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/AddConnection.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/AddConnectionButton.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/Breadcrumb.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ChooseConnection.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ConfigurationSettingsNav.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ConfigureConnector.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ConnectionTypeFilter.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ConnectionTypeList.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/ConnectorParameters.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/DatasetConfiguration.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/TestConnection.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/constants.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/database/ConnectorParameters.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/forms/ConnectorParametersForm.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/forms/CustomInput.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/forms/YamlEditorForm.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/forms/types.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/helpers.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/ButtonGroup.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/ConnectorParameters.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/ConnectorParametersForm.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/DSRCustomization.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/DSRCustomizationForm.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/manual/types.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/sass/ConnectorParameters.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/sass/DatasetConfiguration.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/add-connection/types.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/constants.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/datastore-connection.slice.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/filters/ConnectionTypeFilter.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/filters/DisabledStatusFilter.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/filters/SystemTypeFilter.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/filters/TestingStatusFilter.tsx create mode 100644 clients/admin-ui/src/features/datastore-connections/index.ts create mode 100644 clients/admin-ui/src/features/datastore-connections/types.ts rename clients/{ctl => }/admin-ui/src/features/organization/constants.ts (100%) rename clients/{ctl => }/admin-ui/src/features/organization/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/organization/organization.slice.ts (100%) create mode 100644 clients/admin-ui/src/features/privacy-requests/DenyPrivacyRequestModal.tsx create mode 100644 clients/admin-ui/src/features/privacy-requests/RequestFilters.tsx create mode 100644 clients/admin-ui/src/features/privacy-requests/RequestRow.tsx create mode 100644 clients/admin-ui/src/features/privacy-requests/RequestTable.tsx create mode 100644 clients/admin-ui/src/features/privacy-requests/SortRequestButton.tsx create mode 100644 clients/admin-ui/src/features/privacy-requests/constants.ts create mode 100644 clients/admin-ui/src/features/privacy-requests/helpers.ts create mode 100644 clients/admin-ui/src/features/privacy-requests/index.ts create mode 100644 clients/admin-ui/src/features/privacy-requests/privacy-requests.slice.ts create mode 100644 clients/admin-ui/src/features/privacy-requests/types.ts create mode 100644 clients/admin-ui/src/features/subject-request/RequestDetails.tsx create mode 100644 clients/admin-ui/src/features/subject-request/SubjectIdentities.tsx create mode 100644 clients/admin-ui/src/features/subject-request/SubjectRequest.tsx create mode 100644 clients/admin-ui/src/features/subject-request/events-and-logs/ActivityTimeline.tsx create mode 100644 clients/admin-ui/src/features/subject-request/events-and-logs/EventDetails.tsx create mode 100644 clients/admin-ui/src/features/subject-request/events-and-logs/EventError.tsx create mode 100644 clients/admin-ui/src/features/subject-request/events-and-logs/EventLog.tsx create mode 100644 clients/admin-ui/src/features/subject-request/events-and-logs/EventsAndLogs.tsx create mode 100644 clients/admin-ui/src/features/subject-request/manual-processing/ManualProcessingDetail.tsx create mode 100644 clients/admin-ui/src/features/subject-request/manual-processing/ManualProcessingList.tsx create mode 100644 clients/admin-ui/src/features/subject-request/manual-processing/types.ts rename clients/{ctl => }/admin-ui/src/features/system/DescribeSystemStep.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/DescribeSystemsFormExtension.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/ManualSystemFlow.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/PrivacyDeclarationAccordion.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/PrivacyDeclarationForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/PrivacyDeclarationFormExtension.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/PrivacyDeclarationStep.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/ReviewSystemFormExtension.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/ReviewSystemStep.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/SystemCard.tsx (100%) create mode 100644 clients/admin-ui/src/features/system/SystemRegisterSuccess.tsx rename clients/{ctl => }/admin-ui/src/features/system/SystemYamlForm.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/SystemsManagement.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/form-layout.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/system/form.ts (100%) rename clients/{ctl => }/admin-ui/src/features/system/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/system/system.slice.ts (96%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/ActionButtons.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/DataCategoryChecklist.tsx (95%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/IdentifiabilityTag.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/TaxonomyEntityTag.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/TaxonomyFormBase.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/TaxonomyTabContent.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/TaxonomyTabs.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/helpers.ts (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/hooks.tsx (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/taxonomy.slice.ts (93%) rename clients/{ctl => }/admin-ui/src/features/taxonomy/types.ts (100%) create mode 100644 clients/admin-ui/src/features/user-management/DeleteUserModal.tsx create mode 100644 clients/admin-ui/src/features/user-management/EditUserForm.tsx create mode 100644 clients/admin-ui/src/features/user-management/NewUserForm.tsx create mode 100644 clients/admin-ui/src/features/user-management/UpdatePasswordModal.tsx create mode 100644 clients/admin-ui/src/features/user-management/UserForm.tsx create mode 100644 clients/admin-ui/src/features/user-management/UserManagementLayout.tsx create mode 100644 clients/admin-ui/src/features/user-management/UserManagementRow.tsx create mode 100644 clients/admin-ui/src/features/user-management/UserManagementTable.tsx create mode 100644 clients/admin-ui/src/features/user-management/UserManagementTableActions.tsx create mode 100644 clients/admin-ui/src/features/user-management/config/config.json create mode 100644 clients/admin-ui/src/features/user-management/form/inputs.tsx create mode 100644 clients/admin-ui/src/features/user-management/index.ts create mode 100644 clients/admin-ui/src/features/user-management/types.ts create mode 100644 clients/admin-ui/src/features/user-management/user-management.slice.ts rename clients/{ctl => }/admin-ui/src/features/user/index.ts (100%) rename clients/{ctl => }/admin-ui/src/features/user/user.slice.ts (83%) create mode 100644 clients/admin-ui/src/flags.json rename clients/{ctl => }/admin-ui/src/mocks/browser.ts (68%) rename clients/{ctl => }/admin-ui/src/mocks/data.ts (100%) rename clients/{ctl => }/admin-ui/src/mocks/handlers.ts (96%) rename clients/{ctl => }/admin-ui/src/mocks/index.ts (100%) rename clients/{ctl => }/admin-ui/src/mocks/server.ts (69%) rename clients/{ctl => }/admin-ui/src/pages/404.tsx (83%) create mode 100644 clients/admin-ui/src/pages/_app.tsx create mode 100644 clients/admin-ui/src/pages/api/auth/[...nextauth].ts rename clients/{ctl => }/admin-ui/src/pages/config-wizard/index.tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/dataset/[id].tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/dataset/index.tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/dataset/new/index.tsx (100%) create mode 100644 clients/admin-ui/src/pages/datastore-connection/index.tsx create mode 100644 clients/admin-ui/src/pages/datastore-connection/new.tsx create mode 100644 clients/admin-ui/src/pages/index.tsx create mode 100644 clients/admin-ui/src/pages/login.tsx create mode 100644 clients/admin-ui/src/pages/subject-request/[id].tsx rename clients/{ctl => }/admin-ui/src/pages/system/index.tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/system/new/configure.tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/system/new/index.tsx (100%) rename clients/{ctl => }/admin-ui/src/pages/taxonomy/index.tsx (100%) create mode 100644 clients/admin-ui/src/pages/user-management/index.tsx create mode 100644 clients/admin-ui/src/pages/user-management/new.tsx create mode 100644 clients/admin-ui/src/pages/user-management/profile/[id].tsx rename clients/{ctl => }/admin-ui/src/theme/components/button.ts (100%) create mode 100644 clients/admin-ui/src/theme/index.ts rename clients/{ctl => }/admin-ui/src/types/api/README.md (79%) create mode 100644 clients/admin-ui/src/types/api/index.ts rename clients/{ctl => }/admin-ui/src/types/api/models/AWSConfig.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/AccessToken.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/BigQueryConfig.ts (80%) rename clients/{ctl => }/admin-ui/src/types/api/models/Classification.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassificationResponse.ts (71%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassificationStatus.ts (57%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyCollection.ts (74%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyDataset.ts (62%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyDatasetResponse.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyField.ts (74%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyInstanceResponseValues.ts (65%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyRequestPayload.ts (60%) rename clients/{ctl => }/admin-ui/src/types/api/models/ClassifyStatusUpdatePayload.ts (72%) rename clients/{ctl => }/admin-ui/src/types/api/models/ContactDetails.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DBActions.ts (82%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataCategory.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataFlow.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataProtectionImpactAssessment.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataQualifier.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataResponsibilityTitle.ts (77%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataSubject.ts (94%) rename clients/{ctl => }/admin-ui/src/types/api/models/DataSubjectRights.ts (80%) create mode 100644 clients/admin-ui/src/types/api/models/DataSubjectRightsEnum.ts rename clients/{ctl => }/admin-ui/src/types/api/models/DataUse.ts (92%) rename clients/{ctl => }/admin-ui/src/types/api/models/DatabaseConfig.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/Dataset.ts (92%) rename clients/{ctl => }/admin-ui/src/types/api/models/DatasetCollection.ts (94%) rename clients/{ctl => }/admin-ui/src/types/api/models/DatasetField.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DatasetMetadata.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/DatasetSchema.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/Evaluation.ts (85%) rename clients/{ctl => }/admin-ui/src/types/api/models/FigureTypeEnum.ts (84%) create mode 100644 clients/admin-ui/src/types/api/models/Generate.ts rename clients/{ctl => }/admin-ui/src/types/api/models/GenerateRequestPayload.ts (84%) rename clients/{ctl => }/admin-ui/src/types/api/models/GenerateResponse.ts (58%) rename clients/{ctl => }/admin-ui/src/types/api/models/GenerateTypes.ts (80%) rename clients/{ctl => }/admin-ui/src/types/api/models/HTTPValidationError.ts (71%) rename clients/{ctl => }/admin-ui/src/types/api/models/IncludeExcludeEnum.ts (70%) rename clients/{ctl => }/admin-ui/src/types/api/models/KeyfileCreds.ts (100%) create mode 100644 clients/admin-ui/src/types/api/models/LegalBasisEnum.ts rename clients/{ctl => }/admin-ui/src/types/api/models/MatchesEnum.ts (76%) rename clients/{ctl => }/admin-ui/src/types/api/models/OktaConfig.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/Organization.ts (94%) rename clients/{ctl => }/admin-ui/src/types/api/models/OrganizationMetadata.ts (86%) rename clients/{ctl => }/admin-ui/src/types/api/models/Page_UserResponse_.ts (78%) rename clients/{ctl => }/admin-ui/src/types/api/models/Policy.ts (93%) rename clients/{ctl => }/admin-ui/src/types/api/models/PolicyRule.ts (94%) rename clients/{ctl => }/admin-ui/src/types/api/models/PrivacyDeclaration.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/PrivacyRule.ts (90%) rename clients/{ctl => }/admin-ui/src/types/api/models/Registry.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/ResourceFilter.ts (100%) create mode 100644 clients/admin-ui/src/types/api/models/SpecialCategoriesEnum.ts rename clients/{ctl => }/admin-ui/src/types/api/models/StatusEnum.ts (80%) rename clients/{ctl => }/admin-ui/src/types/api/models/System.ts (88%) rename clients/{ctl => }/admin-ui/src/types/api/models/SystemMetadata.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserCreate.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserCreateResponse.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserLogin.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserLoginResponse.ts (68%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserPasswordReset.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserResponse.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/UserUpdate.ts (100%) rename clients/{ctl => }/admin-ui/src/types/api/models/ValidTargets.ts (69%) create mode 100644 clients/admin-ui/src/types/api/models/ValidateRequest.ts rename clients/{ctl => }/admin-ui/src/types/api/models/ValidateResponse.ts (76%) rename clients/{ctl => }/admin-ui/src/types/api/models/ValidationError.ts (80%) rename clients/{ctl => }/admin-ui/src/types/api/models/ValidationStatus.ts (75%) rename clients/{ctl => }/admin-ui/src/types/api/models/ValidationTarget.ts (72%) rename clients/{ctl => }/admin-ui/src/types/api/models/Violation.ts (85%) rename clients/{ctl => }/admin-ui/src/types/api/models/ViolationAttributes.ts (100%) rename clients/{ctl => }/admin-ui/src/types/environment.d.ts (100%) rename clients/{ctl => }/admin-ui/src/types/errors/api.ts (100%) rename clients/{ctl => }/admin-ui/src/types/errors/index.ts (100%) rename clients/{ctl => }/admin-ui/src/types/errors/models.ts (100%) rename clients/{ctl => }/admin-ui/src/types/next-auth.d.ts (82%) create mode 100644 clients/admin-ui/tsconfig.json delete mode 100644 clients/ctl/admin-ui/.eslintignore delete mode 100644 clients/ctl/admin-ui/README.md delete mode 100644 clients/ctl/admin-ui/__tests__/index.test.tsx delete mode 100644 clients/ctl/admin-ui/cypress/components/ClassifiedDataCategoryInput.cy.tsx delete mode 100644 clients/ctl/admin-ui/cypress/components/DataCategoryInput.cy.tsx delete mode 100644 clients/ctl/admin-ui/next.config.js delete mode 100644 clients/ctl/admin-ui/public/logo.svg delete mode 100644 clients/ctl/admin-ui/src/app/hooks.ts delete mode 100644 clients/ctl/admin-ui/src/app/store.ts delete mode 100644 clients/ctl/admin-ui/src/features/common/BorderGrid.module.css delete mode 100644 clients/ctl/admin-ui/src/features/common/Icon/Add.tsx delete mode 100644 clients/ctl/admin-ui/src/features/common/Icon/TrashCanSolid.tsx delete mode 100644 clients/ctl/admin-ui/src/pages/_app.tsx delete mode 100644 clients/ctl/admin-ui/src/pages/api/auth/[...nextauth].ts delete mode 100644 clients/ctl/admin-ui/src/pages/index.tsx delete mode 100644 clients/ctl/admin-ui/src/pages/login.tsx delete mode 100644 clients/ctl/admin-ui/src/test-utils.tsx delete mode 100644 clients/ctl/admin-ui/src/types/api/index.ts delete mode 100644 clients/ctl/admin-ui/src/types/api/models/DataSubjectRightsEnum.ts delete mode 100644 clients/ctl/admin-ui/src/types/api/models/Generate.ts delete mode 100644 clients/ctl/admin-ui/src/types/api/models/LegalBasisEnum.ts delete mode 100644 clients/ctl/admin-ui/src/types/api/models/SpecialCategoriesEnum.ts delete mode 100644 clients/ctl/admin-ui/src/types/api/models/ValidateRequest.ts create mode 100644 clients/ops/privacy-center/.babelrc create mode 100644 clients/ops/privacy-center/.dockerignore create mode 100644 clients/ops/privacy-center/.eslintignore create mode 100644 clients/ops/privacy-center/.eslintrc.json create mode 100644 clients/ops/privacy-center/.gitignore create mode 100644 clients/ops/privacy-center/.prettierignore rename clients/{ctl/admin-ui => ops/privacy-center}/.prettierrc.json (100%) create mode 100644 clients/ops/privacy-center/Dockerfile create mode 100644 clients/ops/privacy-center/LICENSE create mode 100644 clients/ops/privacy-center/README.md create mode 100644 clients/ops/privacy-center/__tests__/RequestModal.test.tsx create mode 100644 clients/ops/privacy-center/__tests__/index.test.tsx create mode 100644 clients/ops/privacy-center/__tests__/jest.setup.ts create mode 100644 clients/ops/privacy-center/common/CommonHeaders.ts create mode 100644 clients/ops/privacy-center/common/hooks/index.ts create mode 100644 clients/ops/privacy-center/common/hooks/useLocalStorage.ts create mode 100644 clients/ops/privacy-center/components/Card.tsx create mode 100644 clients/ops/privacy-center/components/ConsentCard.tsx create mode 100644 clients/ops/privacy-center/components/ConsentItemCard.tsx create mode 100644 clients/ops/privacy-center/components/PrivacyCard.tsx create mode 100644 clients/ops/privacy-center/components/modals/PrivacyRequestForm.tsx create mode 100644 clients/ops/privacy-center/components/modals/RequestModal.tsx create mode 100644 clients/ops/privacy-center/components/modals/RequestSubmitted.tsx create mode 100644 clients/ops/privacy-center/components/modals/VerificationForm.tsx create mode 100644 clients/ops/privacy-center/components/modals/consent-request-modal/ConsentRequestForm.tsx create mode 100644 clients/ops/privacy-center/components/modals/consent-request-modal/ConsentRequestModal.tsx create mode 100644 clients/ops/privacy-center/components/modals/privacy-request-modal/PrivacyRequestForm.tsx create mode 100644 clients/ops/privacy-center/components/modals/privacy-request-modal/PrivacyRequestModal.tsx create mode 100644 clients/ops/privacy-center/components/modals/privacy-request-modal/RequestSubmitted.tsx create mode 100644 clients/ops/privacy-center/components/modals/types.ts create mode 100644 clients/ops/privacy-center/config/__mocks__/config.json create mode 100644 clients/ops/privacy-center/config/config.css create mode 100644 clients/ops/privacy-center/config/config.json create mode 100644 clients/ops/privacy-center/constants/index.ts create mode 100644 clients/ops/privacy-center/jest.config.js create mode 100644 clients/ops/privacy-center/next-env.d.ts create mode 100644 clients/ops/privacy-center/next.config.js create mode 100644 clients/ops/privacy-center/package-lock.json create mode 100644 clients/ops/privacy-center/package.json create mode 100644 clients/ops/privacy-center/pages/404.tsx create mode 100644 clients/ops/privacy-center/pages/_app.tsx create mode 100644 clients/ops/privacy-center/pages/consent.tsx create mode 100644 clients/ops/privacy-center/pages/index.tsx create mode 100644 clients/ops/privacy-center/public/consent.svg create mode 100644 clients/ops/privacy-center/public/delete.svg create mode 100644 clients/ops/privacy-center/public/download.svg create mode 100644 clients/ops/privacy-center/public/edit.svg create mode 100644 clients/ops/privacy-center/public/favicon.ico create mode 100644 clients/ops/privacy-center/public/green-check.svg create mode 100644 clients/ops/privacy-center/public/logo-icon.svg create mode 100644 clients/ops/privacy-center/public/logo.svg create mode 100755 clients/ops/privacy-center/start.sh rename clients/{ctl/admin-ui/src => ops/privacy-center}/theme/index.ts (54%) rename clients/{ctl/admin-ui => ops/privacy-center}/tsconfig.json (70%) create mode 100644 clients/ops/privacy-center/types/AlertState.ts create mode 100644 clients/ops/privacy-center/types/environment.d.ts create mode 100644 clients/ops/privacy-center/types/index.ts create mode 100644 data/config/celery.toml create mode 100644 data/config/fides.toml create mode 100644 data/dataset/bigquery_example_test_dataset.yml create mode 100644 data/dataset/email_dataset.yml create mode 100644 data/dataset/example_test_dataset.invalid create mode 100644 data/dataset/example_test_datasets.yml create mode 100644 data/dataset/manual_dataset.yml create mode 100644 data/dataset/mariadb_example_test_dataset.yml create mode 100644 data/dataset/mongo_example_test_dataset.yml create mode 100644 data/dataset/mssql_example_test_dataset.yml create mode 100644 data/dataset/mysql_example_test_dataset.yml create mode 100644 data/dataset/postgres_example_test_dataset.yml create mode 100644 data/dataset/redshift_example_test_dataset.yml create mode 100644 data/dataset/snowflake_example_test_dataset.yml create mode 100644 data/dataset/timebase_example_test_dataset.yml create mode 100644 data/saas/config/adobe_campaign_config.yml create mode 100644 data/saas/config/auth0_config.yml create mode 100644 data/saas/config/braze_config.yml create mode 100644 data/saas/config/datadog_config.yml create mode 100644 data/saas/config/firebase_auth_config.yml create mode 100644 data/saas/config/hubspot_config.yml create mode 100644 data/saas/config/mailchimp_config.yml create mode 100644 data/saas/config/outreach_config.yml create mode 100644 data/saas/config/request_override/mailchimp_override_config.yml create mode 100644 data/saas/config/rollbar_config.yml create mode 100644 data/saas/config/saas_example_config.yml create mode 100644 data/saas/config/salesforce_config.yml create mode 100644 data/saas/config/segment_config.yml create mode 100644 data/saas/config/sendgrid_config.yml create mode 100644 data/saas/config/sentry_config.yml create mode 100644 data/saas/config/shopify_config.yml create mode 100644 data/saas/config/square_config.yml create mode 100644 data/saas/config/stripe_config.yml create mode 100644 data/saas/config/zendesk_config.yml create mode 100644 data/saas/dataset/adobe_campaign_dataset.yml create mode 100644 data/saas/dataset/auth0_dataset.yml create mode 100644 data/saas/dataset/braze_dataset.yml create mode 100644 data/saas/dataset/datadog_dataset.yml create mode 100644 data/saas/dataset/firebase_auth_dataset.yml create mode 100644 data/saas/dataset/hubspot_dataset.yml create mode 100644 data/saas/dataset/mailchimp_dataset.yml create mode 100644 data/saas/dataset/outreach_dataset.yml create mode 100644 data/saas/dataset/request_override/mailchimp_override_dataset.yml create mode 100644 data/saas/dataset/rollbar_dataset.yml create mode 100644 data/saas/dataset/saas_example_dataset.yml create mode 100644 data/saas/dataset/salesforce_dataset.yml create mode 100644 data/saas/dataset/segment_dataset.yml create mode 100644 data/saas/dataset/sendgrid_dataset.yml create mode 100644 data/saas/dataset/sentry_dataset.yml create mode 100644 data/saas/dataset/shopify_dataset.yml create mode 100644 data/saas/dataset/square_dataset.yml create mode 100644 data/saas/dataset/stripe_dataset.yml create mode 100644 data/saas/dataset/zendesk_dataset.yml create mode 100644 data/saas/icon/adobe.svg create mode 100644 data/saas/icon/default.svg create mode 100644 data/saas/icon/hubspot.svg create mode 100644 data/saas/icon/mailchimp.svg create mode 100644 data/saas/icon/outreach.svg create mode 100644 data/saas/icon/salesforce.svg create mode 100644 data/saas/icon/segment.svg create mode 100644 data/saas/icon/sentry.svg create mode 100644 data/saas/icon/stripe.svg create mode 100644 data/saas/icon/zendesk.svg create mode 100644 data/saas/saas_connector_registry.toml create mode 100644 docker/docker-compose.integration-mariadb.yml create mode 100644 docker/docker-compose.integration-mongodb.yml create mode 100644 docker/docker-compose.integration-mssql.yml create mode 100644 docker/docker-compose.integration-mysql.yml create mode 100644 docker/docker-compose.integration-postgres.yml create mode 100644 docker/docker-compose.integration-timescale.yml create mode 100644 docker/sample_data/mariadb_example_data.sql create mode 100644 docker/sample_data/mariadb_example_schema.sql create mode 100644 docker/sample_data/mongo-init.js create mode 100644 docker/sample_data/mssql_example.sql create mode 100644 docker/sample_data/mysql_example.sql create mode 100644 docker/sample_data/postgres_example.sql create mode 100644 docker/sample_data/timescale_example.sql delete mode 100644 docs/fides/docs/admin_ui/local_dev.md delete mode 100644 docs/fides/docs/admin_ui/overview.md delete mode 100644 docs/fides/docs/admin_ui/user_management.md create mode 100644 docs/fides/docs/cicd.md delete mode 100644 docs/fides/docs/cicd/examples.md delete mode 100644 docs/fides/docs/cicd/overview.md create mode 100644 docs/fides/docs/css/logo.css create mode 100644 docs/fides/docs/deployment.md create mode 100644 docs/fides/docs/development/contributing_details.md create mode 100644 docs/fides/docs/development/fideslog.md create mode 100644 docs/fides/docs/development/jetbrains_debugging.md create mode 100644 docs/fides/docs/development/postman/Fides.postman_collection.json create mode 100644 docs/fides/docs/development/postman/using_postman.md create mode 100644 docs/fides/docs/development/release_checklist.md create mode 100644 docs/fides/docs/development/update_erd_diagram.md create mode 100644 docs/fides/docs/getting-started/database_connectors.md create mode 100644 docs/fides/docs/getting-started/datasets.md create mode 100644 docs/fides/docs/getting-started/execution_policies.md rename docs/fides/docs/{guides => getting-started}/generate_resources.md (83%) create mode 100644 docs/fides/docs/getting-started/privacy_requests.md create mode 100644 docs/fides/docs/getting-started/storage.md create mode 100644 docs/fides/docs/getting_started.md create mode 100644 docs/fides/docs/glossary.md create mode 100644 docs/fides/docs/guides/complex_fields.md create mode 100644 docs/fides/docs/guides/connection_types.md rename src/fidesctl/api/__init__.py => docs/fides/docs/guides/creating_users.md (100%) create mode 100644 docs/fides/docs/guides/data_rights_protocol.md create mode 100644 docs/fides/docs/guides/email_communications.md rename docs/fides/docs/guides/{extending_taxonomy.md => extend_taxonomy.md} (89%) create mode 100644 docs/fides/docs/guides/fidesops_workflow.md rename docs/fides/docs/guides/{generating_datamap.md => generate_datamaps.md} (85%) create mode 100644 docs/fides/docs/guides/manual_webhooks.md create mode 100644 docs/fides/docs/guides/masking_strategies.md create mode 100644 docs/fides/docs/guides/oauth.md create mode 100644 docs/fides/docs/guides/onetrust.md create mode 100644 docs/fides/docs/guides/policy_webhooks.md create mode 100644 docs/fides/docs/guides/query_execution.md create mode 100644 docs/fides/docs/guides/reporting.md create mode 100644 docs/fides/docs/img/Deployment_Diagram.png create mode 100644 docs/fides/docs/img/admin_ui/add_new_user.png create mode 100644 docs/fides/docs/img/admin_ui/approve_deny.png create mode 100644 docs/fides/docs/img/admin_ui/datastore.png create mode 100644 docs/fides/docs/img/admin_ui/datastore_list.png create mode 100644 docs/fides/docs/img/admin_ui/datastore_options.png create mode 100644 docs/fides/docs/img/admin_ui/delete_datastore.png create mode 100644 docs/fides/docs/img/admin_ui/edit_user.png create mode 100644 docs/fides/docs/img/admin_ui/failed_test.png create mode 100644 docs/fides/docs/img/admin_ui/privacy_center.png create mode 100644 docs/fides/docs/img/admin_ui/request_denial.png create mode 100644 docs/fides/docs/img/admin_ui/sr_overview.png create mode 100644 docs/fides/docs/img/admin_ui/subject_request_details.png create mode 100644 docs/fides/docs/img/admin_ui/subject_request_log.png create mode 100644 docs/fides/docs/img/admin_ui/user_management.png create mode 100644 docs/fides/docs/img/admin_ui/user_scopes.png create mode 100644 docs/fides/docs/img/app_database.png create mode 100644 docs/fides/docs/img/auth_flow.png create mode 100644 docs/fides/docs/img/connect_app_db_to_dbeaver.png create mode 100644 docs/fides/docs/img/fides-ecosystem.png create mode 100644 docs/fides/docs/img/fides-ops-process.png create mode 100644 docs/fides/docs/img/fidesops-overview-diagram.png create mode 100644 docs/fides/docs/img/fidesops.png create mode 100644 docs/fides/docs/img/fidesops.svg create mode 100644 docs/fides/docs/img/ide/SDKs.png create mode 100644 docs/fides/docs/img/ide/add_python_interpreter.png create mode 100644 docs/fides/docs/img/ide/debug_config.png create mode 100644 docs/fides/docs/img/ide/debugging.png create mode 100644 docs/fides/docs/img/ide/docker.png create mode 100644 docs/fides/docs/img/mongo_and_postgres_complex.png create mode 100644 docs/fides/docs/img/oauth2_workflow.png create mode 100644 docs/fides/docs/img/onetrust_request_flow.png create mode 100644 docs/fides/docs/img/postman_images/add_root_client_id_and_secret.png create mode 100644 docs/fides/docs/img/postman_images/client_form_data.png create mode 100644 docs/fides/docs/img/postman_images/create_root_client_token.png create mode 100644 docs/fides/docs/img/postman_images/fidesops_container.png create mode 100644 docs/fides/docs/img/postman_images/final_token.png create mode 100644 docs/fides/docs/img/postman_images/finalize_import.png create mode 100644 docs/fides/docs/img/postman_images/import_collection.png create mode 100644 docs/fides/docs/img/postman_images/local_results.png create mode 100644 docs/fides/docs/img/postman_images/open_fidesops_variables.png create mode 100644 docs/fides/docs/img/postman_images/root_token_response.png create mode 100644 docs/fides/docs/img/postman_images/save_root_client_token.png create mode 100644 docs/fides/docs/img/postman_images/succeeded_privacy_request.png create mode 100644 docs/fides/docs/img/postman_images/upload_files.png create mode 100644 docs/fides/docs/img/storage_destinations.png create mode 100644 docs/fides/docs/img/traversal_graph.png create mode 100644 docs/fides/docs/img/traversal_tables.png delete mode 100644 docs/fides/docs/installation/database.md delete mode 100644 docs/fides/docs/installation/installation.md create mode 100644 docs/fides/docs/installation/overview.md delete mode 100644 docs/fides/docs/installation/prerequisites_dependencies.md create mode 100644 docs/fides/docs/installation/requirements.md delete mode 100644 docs/fides/docs/js/vis.js delete mode 100644 docs/fides/docs/language/overview.md delete mode 100644 docs/fides/docs/language/resources/dataset.md delete mode 100644 docs/fides/docs/language/resources/organization.md delete mode 100644 docs/fides/docs/language/resources/policy.md delete mode 100644 docs/fides/docs/language/resources/registry.md delete mode 100644 docs/fides/docs/language/resources/system.md delete mode 100644 docs/fides/docs/language/syntax.md delete mode 100644 docs/fides/docs/language/taxonomy/data_categories.md delete mode 100644 docs/fides/docs/language/taxonomy/data_qualifiers.md delete mode 100644 docs/fides/docs/language/taxonomy/data_subjects.md delete mode 100644 docs/fides/docs/language/taxonomy/data_uses.md delete mode 100644 docs/fides/docs/language/taxonomy/explorer.md delete mode 100644 docs/fides/docs/language/taxonomy/overview.md create mode 100644 docs/fides/docs/postman/using_postman.md delete mode 100644 docs/fides/docs/quickstart/docker.md delete mode 100644 docs/fides/docs/quickstart/local_full.md delete mode 100644 docs/fides/docs/quickstart/local_standalone.md delete mode 100644 docs/fides/docs/quickstart/overview.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/adobe.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/hubspot.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/mailchimp.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/outreach.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/salesforce.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/segment.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/sendgrid.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/sentry.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/stripe.md create mode 100644 docs/fides/docs/saas_connectors/example_configs/zendesk.md create mode 100644 docs/fides/docs/saas_connectors/saas_config.md create mode 100644 docs/fides/docs/saas_connectors/saas_connectors.md create mode 100644 docs/fides/docs/saas_connectors/saas_oauth2.md create mode 100644 docs/fides/docs/saas_connectors/saas_pagination.md create mode 100644 docs/fides/docs/saas_connectors/saas_postprocessors.md rename docs/fides/docs/{admin_ui => ui}/datasets.md (72%) create mode 100644 docs/fides/docs/ui/datastores.md create mode 100644 docs/fides/docs/ui/deployment.md create mode 100644 docs/fides/docs/ui/local_dev.md create mode 100644 docs/fides/docs/ui/overview.md create mode 100644 docs/fides/docs/ui/privacy_center.md create mode 100644 docs/fides/docs/ui/subject_requests.md create mode 100644 docs/fides/docs/ui/user_management.md rename docs/fides/docs/{admin_ui => ui}/wizard.md (65%) create mode 100644 docs/fidesops/docs/img/access_execution.png create mode 100644 docs/fidesops/docs/img/access_graph.png create mode 100644 docs/fidesops/docs/img/admin_ui/admin_ui.png create mode 100644 docs/fidesops/docs/img/erasure_graph.png create mode 100644 docs/fidesops/docs/img/favicon.ico create mode 100644 mssql-requirements.txt create mode 100644 noxfiles/run_infrastructure.py create mode 100644 scripts/create_test_data.py rename generate_docs.py => scripts/generate_docs.py (94%) create mode 100644 scripts/mssql_discover.py create mode 100644 scripts/quickstart.py rename src/{fidesctl => fides}/__init__.py (100%) rename src/{fidesctl => fides}/_version.py (99%) rename src/{fidesctl/api/ctl => fides/api}/__init__.py (100%) rename src/{fidesctl/api/ctl/database => fides/api/ctl}/__init__.py (100%) rename src/{fidesctl => fides}/api/ctl/alembic.ini (100%) rename src/{fidesctl/api/ctl/migrations => fides/api/ctl/database}/__init__.py (100%) rename src/{fidesctl => fides}/api/ctl/database/crud.py (98%) rename src/{fidesctl => fides}/api/ctl/database/database.py (89%) rename src/{fidesctl => fides}/api/ctl/database/session.py (91%) rename src/{fidesctl => fides}/api/ctl/deps.py (87%) rename src/{fidesctl/api/ctl/migrations/versions => fides/api/ctl/migrations}/__init__.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/env.py (81%) rename src/{fidesctl => fides}/api/ctl/migrations/script.py.mako (100%) create mode 100644 src/fides/api/ctl/migrations/versions/0210948a8147_initial.py create mode 100644 src/fides/api/ctl/migrations/versions/021d288d0ce3_add_consent_request.py create mode 100644 src/fides/api/ctl/migrations/versions/07014ff34eb2_add_mariadb.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/150f234ef1de_add_fidesctl_meta_to_organization_object.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/155fd8e51d9d_add_fideslib_models.py (71%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/1739aa4a4ab7_add_security_policy_link_and_erasure_.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/1dfc5a2d30e7_add_saas_config_to_connection_config.py create mode 100644 src/fides/api/ctl/migrations/versions/1ff88b7bd579_add_authorization_request.py create mode 100644 src/fides/api/ctl/migrations/versions/25adddf820a3_another_fidesops_remote_merge.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/26934c96ec80_initial_migration.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/27fe9da9d0f9_privacy_request_stopped.py create mode 100644 src/fides/api/ctl/migrations/versions/29a7d707163a_adds_first_name_and_last_name_to_user_.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/312aff72b275_migrate_to_usage_of_evaluation_.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/327cd266f7b3_update_dataset_depth.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/3a7c5fb119c9_add_manual_connector_type.py create mode 100644 src/fides/api/ctl/migrations/versions/3c5e1253465d_adds_provided_identity_table_for_.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/3d9c476d7cea_classification_management.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/45c7a349db68_remove_qualifier_lists_from_data_set_.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/4c3693c289d0_add_optional_contact_information_for_.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/4fc34906c389_.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/5078badb90b9_adds_drp_action_to_policy.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/50b3736634d2_extend_data_use_with_recipients_and_.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/530fb8533ca4_test.py create mode 100644 src/fides/api/ctl/migrations/versions/55d61eb8ed12_add_default_policies.py create mode 100644 src/fides/api/ctl/migrations/versions/5a966cd643d7_fidesops_user_and_client_detail.py create mode 100644 src/fides/api/ctl/migrations/versions/6b287ff8cde4_penultimate_ops_merge.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/6bd93cb0603d_add_egress_and_ingress_to_systems.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/6f98e1bd7e4f_another_upstream_merge.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/732105cd54e3_update_dataset_field_name.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/794e5f5b76ae_merge_unified_with_ctl_and_ops.py create mode 100644 src/fides/api/ctl/migrations/versions/7a4f4042091e_manual_webhooks.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/7a94527643a1_add_column_for_special_category_to_data_.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/7abe778b7082_update_fideslang_data_categories.py create mode 100644 src/fides/api/ctl/migrations/versions/7b81d34352e8_merge_ops_and_ctl_migrations.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/7c851d8a102a_add_created_at_and_updated_at.py (95%) create mode 100644 src/fides/api/ctl/migrations/versions/90070db16d05_add_fidesops_user_permissions.py create mode 100644 src/fides/api/ctl/migrations/versions/906d7198df28_privacy_request_approve.py create mode 100644 src/fides/api/ctl/migrations/versions/912d801f06c0_audit_log_email_send.py create mode 100644 src/fides/api/ctl/migrations/versions/97801300fedd_identity_verification.py rename src/{fidesctl/api/ctl/routes => fides/api/ctl/migrations/versions}/__init__.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/a0e6feb5bdc8_add_consent.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/a2b9b156ebaf_data_protection_impact_assessments_.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/aaa81d97a6f6_prepend_tables_with_ctl.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/adad3be6af08_privacy_notice_attributes.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/b3b68c87c4a0_add_connection_config_description.py create mode 100644 src/fides/api/ctl/migrations/versions/bab75915670a_add_finished_audit_log.py create mode 100644 src/fides/api/ctl/migrations/versions/bde646a6f51e_add_execution_timeframe.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/be432bd23596_add_fidesctl_meta_field_to_dataset.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/c2f7a29c4780_email_connection_config.py create mode 100644 src/fides/api/ctl/migrations/versions/c3472d75c80e_connectionconfig_disabled.py create mode 100644 src/fides/api/ctl/migrations/versions/c4df5d585029_data_use_unique_together.py create mode 100644 src/fides/api/ctl/migrations/versions/c5336b841d70_add_policy_webhooks.py create mode 100644 src/fides/api/ctl/migrations/versions/c61fd9d4f73e_emailconfig.py create mode 100644 src/fides/api/ctl/migrations/versions/c7cc36820d4b_rename_user_name_tables_and_indexes.py create mode 100644 src/fides/api/ctl/migrations/versions/c9759675b5d3_add_user_login_and_password_reset_dates.py create mode 100644 src/fides/api/ctl/migrations/versions/c98da12d76f8_add_audit_log.py create mode 100644 src/fides/api/ctl/migrations/versions/cdbd0fa118dd_unified_fides_2_merger.py create mode 100644 src/fides/api/ctl/migrations/versions/cf88efa1ad89_add_timescale_db.py create mode 100644 src/fides/api/ctl/migrations/versions/d65e7e921814_add_privacy_request_status.py create mode 100644 src/fides/api/ctl/migrations/versions/d8df7ff7aab4_add_due_date.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/d8f8bd52754f_add_tags_as_part_of_fideslang_1_1_0.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/e55a51b354e3_add_bigquery.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/e576b6a80a49_add_parent_key_to_dataqualifier.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/ed1b00ff963d_cancel_privacy_request.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/edcd28ede1f7_add_fidesctl_meta_to_system.py (100%) rename src/{fidesctl => fides}/api/ctl/migrations/versions/f131a1263a10_add_is_default_to_taxonomy_fields.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/f206d4e7574d_add_redshift_and_snowflake_support.py create mode 100644 src/fides/api/ctl/migrations/versions/f3841942d90c_add_mssql.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/f53e04e5b7f5_merge_heads.py (100%) create mode 100644 src/fides/api/ctl/migrations/versions/fb6b0150d6e4_final_unified_ctl_merge.py create mode 100644 src/fides/api/ctl/migrations/versions/fc90277bbcde_populate_saas_type_to_saas_config.py rename src/{fidesctl => fides}/api/ctl/migrations/versions/fdd28c39a679_add_responsibility_role_attribute_for_.py (100%) rename src/{fidesctl/api/ctl/utils => fides/api/ctl/routes}/__init__.py (100%) rename src/{fidesctl => fides}/api/ctl/routes/admin.py (66%) rename src/{fidesctl => fides}/api/ctl/routes/crud.py (96%) rename src/{fidesctl => fides}/api/ctl/routes/datamap.py (93%) rename src/{fidesctl => fides}/api/ctl/routes/generate.py (92%) create mode 100644 src/fides/api/ctl/routes/health.py rename src/{fidesctl => fides}/api/ctl/routes/util.py (88%) rename src/{fidesctl => fides}/api/ctl/routes/validate.py (90%) rename src/{fidesctl => fides}/api/ctl/routes/visualize.py (87%) rename src/{fidesctl => fides}/api/ctl/sql_models.py (96%) rename src/{fidesctl => fides}/api/ctl/ui.py (95%) rename src/{fidesctl/cli/commands => fides/api/ctl/utils}/__init__.py (100%) rename src/{fidesctl => fides}/api/ctl/utils/api_router.py (100%) rename src/{fidesctl => fides}/api/ctl/utils/errors.py (100%) rename src/{fidesctl => fides}/api/ctl/utils/logger.py (100%) rename src/{fidesctl => fides}/api/ctl/view.py (91%) create mode 100644 src/fides/api/main.py rename src/{fidesctl/ctl => fides/api/ops}/__init__.py (100%) create mode 100644 src/fides/api/ops/analytics.py rename src/{fidesctl/ctl/connectors => fides/api/ops/api}/__init__.py (100%) create mode 100644 src/fides/api/ops/api/deps.py rename src/{fidesctl/ctl/core => fides/api/ops/api/v1}/__init__.py (100%) create mode 100644 src/fides/api/ops/api/v1/api.py create mode 100644 src/fides/api/ops/api/v1/endpoints/__init__.py create mode 100644 src/fides/api/ops/api/v1/endpoints/config_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/connection_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/connection_type_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/consent_request_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/dataset_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/drp_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/email_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/encryption_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/identity_verification_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/manual_webhook_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/masking_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/oauth_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/policy_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/policy_webhook_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/privacy_request_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/saas_config_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/storage_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/user_endpoints.py create mode 100644 src/fides/api/ops/api/v1/endpoints/user_permission_endpoints.py create mode 100644 src/fides/api/ops/api/v1/exception_handlers.py create mode 100644 src/fides/api/ops/api/v1/scope_registry.py create mode 100644 src/fides/api/ops/api/v1/urn_registry.py create mode 100644 src/fides/api/ops/common_exceptions.py create mode 100644 src/fides/api/ops/db/__init__.py create mode 100644 src/fides/api/ops/db/base.py create mode 100644 src/fides/api/ops/db/base_class.py create mode 100644 src/fides/api/ops/email_templates/__init__.py create mode 100644 src/fides/api/ops/email_templates/get_email_template.py create mode 100644 src/fides/api/ops/email_templates/template_names.py create mode 100644 src/fides/api/ops/email_templates/templates/consent_request_verification.html create mode 100644 src/fides/api/ops/email_templates/templates/erasure_request_email_fulfillment.html create mode 100644 src/fides/api/ops/email_templates/templates/privacy_request_complete_access.html create mode 100644 src/fides/api/ops/email_templates/templates/privacy_request_complete_deletion.html create mode 100644 src/fides/api/ops/email_templates/templates/privacy_request_receipt.html create mode 100644 src/fides/api/ops/email_templates/templates/privacy_request_review_approve.html create mode 100644 src/fides/api/ops/email_templates/templates/privacy_request_review_deny.html create mode 100644 src/fides/api/ops/email_templates/templates/subject_identity_verification.html create mode 100644 src/fides/api/ops/graph/__init__.py create mode 100644 src/fides/api/ops/graph/analytics_events.py create mode 100644 src/fides/api/ops/graph/config.py create mode 100644 src/fides/api/ops/graph/data_type.py create mode 100644 src/fides/api/ops/graph/graph.py create mode 100644 src/fides/api/ops/graph/graph_differences.py create mode 100644 src/fides/api/ops/graph/traversal.py create mode 100644 src/fides/api/ops/migrations/__init__.py create mode 100644 src/fides/api/ops/migrations/versions/0210948a8147_initial.py create mode 100644 src/fides/api/ops/migrations/versions/021d288d0ce3_add_consent_request.py create mode 100644 src/fides/api/ops/migrations/versions/07014ff34eb2_add_mariadb.py create mode 100644 src/fides/api/ops/migrations/versions/1dfc5a2d30e7_add_saas_config_to_connection_config.py create mode 100644 src/fides/api/ops/migrations/versions/1ff88b7bd579_add_authorization_request.py create mode 100644 src/fides/api/ops/migrations/versions/27fe9da9d0f9_privacy_request_stopped.py create mode 100644 src/fides/api/ops/migrations/versions/29a7d707163a_adds_first_name_and_last_name_to_user_.py create mode 100644 src/fides/api/ops/migrations/versions/3a7c5fb119c9_add_manual_connector_type.py create mode 100644 src/fides/api/ops/migrations/versions/3c5e1253465d_adds_provided_identity_table_for_.py create mode 100644 src/fides/api/ops/migrations/versions/5078badb90b9_adds_drp_action_to_policy.py create mode 100644 src/fides/api/ops/migrations/versions/530fb8533ca4_test.py create mode 100644 src/fides/api/ops/migrations/versions/55d61eb8ed12_add_default_policies.py create mode 100644 src/fides/api/ops/migrations/versions/5a966cd643d7_fidesops_user_and_client_detail.py create mode 100644 src/fides/api/ops/migrations/versions/7a4f4042091e_manual_webhooks.py create mode 100644 src/fides/api/ops/migrations/versions/7abe778b7082_update_fideslang_data_categories.py create mode 100644 src/fides/api/ops/migrations/versions/90070db16d05_add_fidesops_user_permissions.py create mode 100644 src/fides/api/ops/migrations/versions/906d7198df28_privacy_request_approve.py create mode 100644 src/fides/api/ops/migrations/versions/912d801f06c0_audit_log_email_send.py create mode 100644 src/fides/api/ops/migrations/versions/97801300fedd_identity_verification.py create mode 100644 src/fides/api/ops/migrations/versions/__init__.py create mode 100644 src/fides/api/ops/migrations/versions/a0e6feb5bdc8_add_consent.py create mode 100644 src/fides/api/ops/migrations/versions/b3b68c87c4a0_add_connection_config_description.py create mode 100644 src/fides/api/ops/migrations/versions/bab75915670a_add_finished_audit_log.py create mode 100644 src/fides/api/ops/migrations/versions/bde646a6f51e_add_execution_timeframe.py create mode 100644 src/fides/api/ops/migrations/versions/c2f7a29c4780_email_connection_config.py create mode 100644 src/fides/api/ops/migrations/versions/c3472d75c80e_connectionconfig_disabled.py create mode 100644 src/fides/api/ops/migrations/versions/c5336b841d70_add_policy_webhooks.py create mode 100644 src/fides/api/ops/migrations/versions/c61fd9d4f73e_emailconfig.py create mode 100644 src/fides/api/ops/migrations/versions/c7cc36820d4b_rename_user_name_tables_and_indexes.py create mode 100644 src/fides/api/ops/migrations/versions/c9759675b5d3_add_user_login_and_password_reset_dates.py create mode 100644 src/fides/api/ops/migrations/versions/c98da12d76f8_add_audit_log.py create mode 100644 src/fides/api/ops/migrations/versions/cf88efa1ad89_add_timescale_db.py create mode 100644 src/fides/api/ops/migrations/versions/d65e7e921814_add_privacy_request_status.py create mode 100644 src/fides/api/ops/migrations/versions/d8df7ff7aab4_add_due_date.py create mode 100644 src/fides/api/ops/migrations/versions/e55a51b354e3_add_bigquery.py create mode 100644 src/fides/api/ops/migrations/versions/ed1b00ff963d_cancel_privacy_request.py create mode 100644 src/fides/api/ops/migrations/versions/f206d4e7574d_add_redshift_and_snowflake_support.py create mode 100644 src/fides/api/ops/migrations/versions/f3841942d90c_add_mssql.py create mode 100644 src/fides/api/ops/migrations/versions/fc90277bbcde_populate_saas_type_to_saas_config.py create mode 100644 src/fides/api/ops/models/__init__.py create mode 100644 src/fides/api/ops/models/authentication_request.py create mode 100644 src/fides/api/ops/models/connectionconfig.py create mode 100644 src/fides/api/ops/models/datasetconfig.py create mode 100644 src/fides/api/ops/models/email.py create mode 100644 src/fides/api/ops/models/manual_webhook.py create mode 100644 src/fides/api/ops/models/policy.py create mode 100644 src/fides/api/ops/models/privacy_request.py create mode 100644 src/fides/api/ops/models/storage.py create mode 100644 src/fides/api/ops/schemas/__init__.py create mode 100644 src/fides/api/ops/schemas/analytics.py create mode 100644 src/fides/api/ops/schemas/api.py create mode 100644 src/fides/api/ops/schemas/base_class.py create mode 100644 src/fides/api/ops/schemas/client.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/__init__.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_config.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_bigquery.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_email.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_manual_webhook.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_mariadb.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_mongodb.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_mssql.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_mysql.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_postgres.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_redshift.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_saas.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_snowflake.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connection_secrets_timescale.py create mode 100644 src/fides/api/ops/schemas/connection_configuration/connections_secrets_https.py create mode 100644 src/fides/api/ops/schemas/dataset.py create mode 100644 src/fides/api/ops/schemas/drp_privacy_request.py create mode 100644 src/fides/api/ops/schemas/email/__init__.py create mode 100644 src/fides/api/ops/schemas/email/email.py create mode 100644 src/fides/api/ops/schemas/email/email_secrets_docs_only.py create mode 100644 src/fides/api/ops/schemas/encryption_request.py create mode 100644 src/fides/api/ops/schemas/external_https.py create mode 100644 src/fides/api/ops/schemas/identity_verification.py create mode 100644 src/fides/api/ops/schemas/manual_webhook_schemas.py create mode 100644 src/fides/api/ops/schemas/masking/__init__.py create mode 100644 src/fides/api/ops/schemas/masking/masking_api.py create mode 100644 src/fides/api/ops/schemas/masking/masking_configuration.py create mode 100644 src/fides/api/ops/schemas/masking/masking_secrets.py create mode 100644 src/fides/api/ops/schemas/masking/masking_strategy_description.py create mode 100644 src/fides/api/ops/schemas/msg.py create mode 100644 src/fides/api/ops/schemas/policy.py create mode 100644 src/fides/api/ops/schemas/policy_webhooks.py create mode 100644 src/fides/api/ops/schemas/privacy_request.py create mode 100644 src/fides/api/ops/schemas/redis_cache.py create mode 100644 src/fides/api/ops/schemas/saas/__init__.py create mode 100644 src/fides/api/ops/schemas/saas/saas_config.py create mode 100644 src/fides/api/ops/schemas/saas/shared_schemas.py create mode 100644 src/fides/api/ops/schemas/saas/strategy_configuration.py create mode 100644 src/fides/api/ops/schemas/shared_schemas.py create mode 100644 src/fides/api/ops/schemas/storage/__init__.py create mode 100644 src/fides/api/ops/schemas/storage/data_upload_location_response.py create mode 100644 src/fides/api/ops/schemas/storage/storage.py create mode 100644 src/fides/api/ops/schemas/storage/storage_secrets_docs_only.py create mode 100644 src/fides/api/ops/schemas/third_party/__init__.py create mode 100644 src/fides/api/ops/schemas/third_party/onetrust.py create mode 100644 src/fides/api/ops/schemas/user_permission.py create mode 100644 src/fides/api/ops/service/__init__.py create mode 100644 src/fides/api/ops/service/_verification.py create mode 100644 src/fides/api/ops/service/authentication/__init__.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_api_key.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_basic.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_bearer.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_factory.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_oauth2_authorization_code.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_oauth2_base.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_oauth2_client_credentials.py create mode 100644 src/fides/api/ops/service/authentication/authentication_strategy_query_param.py create mode 100644 src/fides/api/ops/service/connectors/__init__.py create mode 100644 src/fides/api/ops/service/connectors/base_connector.py create mode 100644 src/fides/api/ops/service/connectors/email_connector.py create mode 100644 src/fides/api/ops/service/connectors/http_connector.py create mode 100644 src/fides/api/ops/service/connectors/limiter/__init__.py create mode 100644 src/fides/api/ops/service/connectors/limiter/rate_limiter.py create mode 100644 src/fides/api/ops/service/connectors/manual_connector.py create mode 100644 src/fides/api/ops/service/connectors/manual_webhook_connector.py create mode 100644 src/fides/api/ops/service/connectors/mongodb_connector.py create mode 100644 src/fides/api/ops/service/connectors/query_config.py create mode 100644 src/fides/api/ops/service/connectors/saas/__init__.py create mode 100644 src/fides/api/ops/service/connectors/saas/authenticated_client.py create mode 100644 src/fides/api/ops/service/connectors/saas/connector_registry_service.py create mode 100644 src/fides/api/ops/service/connectors/saas_connector.py create mode 100644 src/fides/api/ops/service/connectors/saas_query_config.py create mode 100644 src/fides/api/ops/service/connectors/sql_connector.py create mode 100644 src/fides/api/ops/service/connectors/timescale_connector.py create mode 100644 src/fides/api/ops/service/drp/__init__.py create mode 100644 src/fides/api/ops/service/drp/drp_fidesops_mapper.py create mode 100644 src/fides/api/ops/service/email/__init__.py create mode 100644 src/fides/api/ops/service/email/email_crud_service.py create mode 100644 src/fides/api/ops/service/email/email_dispatch_service.py create mode 100644 src/fides/api/ops/service/masking/__init__.py create mode 100644 src/fides/api/ops/service/masking/strategy/__init__.py create mode 100644 src/fides/api/ops/service/masking/strategy/format_preservation.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_aes_encrypt.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_factory.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_hash.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_hmac.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_nullify.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_random_string_rewrite.py create mode 100644 src/fides/api/ops/service/masking/strategy/masking_strategy_string_rewrite.py create mode 100644 src/fides/api/ops/service/outbound_urn_registry.py create mode 100644 src/fides/api/ops/service/pagination/__init__.py create mode 100644 src/fides/api/ops/service/pagination/pagination_strategy.py create mode 100644 src/fides/api/ops/service/pagination/pagination_strategy_cursor.py create mode 100644 src/fides/api/ops/service/pagination/pagination_strategy_factory.py create mode 100644 src/fides/api/ops/service/pagination/pagination_strategy_link.py create mode 100644 src/fides/api/ops/service/pagination/pagination_strategy_offset.py create mode 100644 src/fides/api/ops/service/privacy_request/__init__.py create mode 100644 src/fides/api/ops/service/privacy_request/onetrust_service.py create mode 100644 src/fides/api/ops/service/privacy_request/request_runner_service.py create mode 100644 src/fides/api/ops/service/privacy_request/request_service.py create mode 100644 src/fides/api/ops/service/processors/__init__.py create mode 100644 src/fides/api/ops/service/processors/post_processor_strategy/__init__.py create mode 100644 src/fides/api/ops/service/processors/post_processor_strategy/post_processor_strategy.py create mode 100644 src/fides/api/ops/service/processors/post_processor_strategy/post_processor_strategy_factory.py create mode 100644 src/fides/api/ops/service/processors/post_processor_strategy/post_processor_strategy_filter.py create mode 100644 src/fides/api/ops/service/processors/post_processor_strategy/post_processor_strategy_unwrap.py create mode 100644 src/fides/api/ops/service/saas_request/__init__.py create mode 100644 src/fides/api/ops/service/saas_request/override_implementations/__init__.py create mode 100644 src/fides/api/ops/service/saas_request/override_implementations/firebase_auth_request_overrides.py create mode 100644 src/fides/api/ops/service/saas_request/override_implementations/mailchimp_request_overrides.py create mode 100644 src/fides/api/ops/service/saas_request/saas_request_override_factory.py create mode 100644 src/fides/api/ops/service/storage/__init__.py create mode 100644 src/fides/api/ops/service/storage/storage_authenticator_service.py create mode 100644 src/fides/api/ops/service/storage/storage_uploader_service.py create mode 100644 src/fides/api/ops/service/strategy.py create mode 100644 src/fides/api/ops/task/__init__.py create mode 100644 src/fides/api/ops/task/consolidate_query_matches.py create mode 100644 src/fides/api/ops/task/filter_element_match.py create mode 100644 src/fides/api/ops/task/filter_results.py create mode 100644 src/fides/api/ops/task/graph_task.py create mode 100644 src/fides/api/ops/task/refine_target_path.py create mode 100644 src/fides/api/ops/task/task_resources.py create mode 100644 src/fides/api/ops/tasks/__init__.py create mode 100644 src/fides/api/ops/tasks/scheduled/__init__.py create mode 100644 src/fides/api/ops/tasks/scheduled/scheduler.py create mode 100644 src/fides/api/ops/tasks/scheduled/tasks.py create mode 100644 src/fides/api/ops/tasks/storage.py create mode 100644 src/fides/api/ops/util/__init__.py create mode 100644 src/fides/api/ops/util/api_router.py create mode 100644 src/fides/api/ops/util/cache.py create mode 100644 src/fides/api/ops/util/collection_util.py create mode 100644 src/fides/api/ops/util/constants.py create mode 100644 src/fides/api/ops/util/data_category.py create mode 100644 src/fides/api/ops/util/encryption/__init__.py create mode 100644 src/fides/api/ops/util/encryption/aes_gcm_encryption_scheme.py create mode 100644 src/fides/api/ops/util/encryption/hmac_encryption_scheme.py create mode 100644 src/fides/api/ops/util/encryption/secrets_util.py create mode 100644 src/fides/api/ops/util/enums.py create mode 100644 src/fides/api/ops/util/logger.py create mode 100644 src/fides/api/ops/util/matching_queue.py create mode 100644 src/fides/api/ops/util/oauth_util.py create mode 100644 src/fides/api/ops/util/querytoken.py create mode 100644 src/fides/api/ops/util/saas_util.py create mode 100644 src/fides/api/ops/util/storage_authenticator.py create mode 100644 src/fides/api/ops/util/text.py create mode 100644 src/fides/api/ops/util/url_util.py create mode 100644 src/fides/api/ops/util/wrappers.py rename src/{fidesctl => fides}/cli/__init__.py (66%) create mode 100644 src/fides/cli/commands/__init__.py rename src/{fidesctl => fides}/cli/commands/annotate.py (80%) rename src/{fidesctl => fides}/cli/commands/core.py (78%) rename src/{fidesctl => fides}/cli/commands/crud.py (85%) rename src/{fidesctl => fides}/cli/commands/db.py (80%) rename src/{fidesctl => fides}/cli/commands/export.py (91%) rename src/{fidesctl => fides}/cli/commands/generate.py (90%) rename src/{fidesctl => fides}/cli/commands/scan.py (89%) rename src/{fidesctl => fides}/cli/commands/util.py (69%) rename src/{fidesctl => fides}/cli/commands/view.py (52%) rename src/{fidesctl => fides}/cli/options.py (97%) rename src/{fidesctl => fides}/cli/utils.py (86%) create mode 100644 src/fides/ctl/__init__.py create mode 100644 src/fides/ctl/connectors/__init__.py rename src/{fidesctl => fides}/ctl/connectors/aws.py (99%) rename src/{fidesctl => fides}/ctl/connectors/bigquery.py (92%) rename src/{fidesctl => fides}/ctl/connectors/models.py (100%) rename src/{fidesctl => fides}/ctl/connectors/okta.py (98%) create mode 100644 src/fides/ctl/core/__init__.py rename src/{fidesctl => fides}/ctl/core/annotate_dataset.py (95%) rename src/{fidesctl => fides}/ctl/core/api.py (96%) rename src/{fidesctl => fides}/ctl/core/api_helpers.py (98%) rename src/{fidesctl => fides}/ctl/core/audit.py (97%) create mode 100644 src/fides/ctl/core/config/__init__.py create mode 100644 src/fides/ctl/core/config/admin_ui_settings.py rename src/{fidesctl => fides}/ctl/core/config/cli_settings.py (93%) rename src/{fidesctl => fides}/ctl/core/config/credentials_settings.py (91%) rename src/{fidesctl => fides}/ctl/core/config/database_settings.py (67%) create mode 100644 src/fides/ctl/core/config/execution_settings.py rename src/{fidesctl => fides}/ctl/core/config/fides_settings.py (100%) rename src/{fidesctl => fides}/ctl/core/config/logging_settings.py (53%) create mode 100644 src/fides/ctl/core/config/notification_settings.py create mode 100644 src/fides/ctl/core/config/redis_settings.py rename src/{fidesctl => fides}/ctl/core/config/security_settings.py (74%) rename src/{fidesctl => fides}/ctl/core/config/user_settings.py (79%) rename src/{fidesctl => fides}/ctl/core/config/utils.py (88%) rename src/{fidesctl => fides}/ctl/core/dataset.py (97%) rename src/{fidesctl => fides}/ctl/core/evaluate.py (98%) rename src/{fidesctl => fides}/ctl/core/export.py (98%) rename src/{fidesctl => fides}/ctl/core/export_helpers.py (98%) rename src/{fidesctl => fides}/ctl/core/filters.py (100%) rename src/{fidesctl => fides}/ctl/core/parse.py (92%) rename src/{fidesctl => fides}/ctl/core/pull.py (93%) rename src/{fidesctl => fides}/ctl/core/push.py (95%) rename src/{fidesctl => fides}/ctl/core/system.py (94%) rename src/{fidesctl => fides}/ctl/core/utils.py (96%) rename src/{fidesctl => fides}/ctl/core/visualize.py (100%) create mode 100644 src/fides/py.typed rename src/{fidesctl => fides}/templates/fides_datamap_template.xlsx (100%) delete mode 100644 src/fidesctl.egg-info/entry_points.txt delete mode 100644 src/fidesctl/api/ctl/routes/health.py delete mode 100644 src/fidesctl/api/ctl/routes/user.py delete mode 100644 src/fidesctl/api/main.py delete mode 100644 src/fidesctl/ctl/core/config/__init__.py delete mode 100644 tests/ctl/api/test_user_endpoints.py create mode 100644 tests/ops/.gitignore create mode 100644 tests/ops/__init__.py create mode 100644 tests/ops/api/__init__.py create mode 100644 tests/ops/api/test_deps.py create mode 100644 tests/ops/api/v1/__init__.py create mode 100644 tests/ops/api/v1/endpoints/__init__.py create mode 100644 tests/ops/api/v1/endpoints/test_config_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_connection_config_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_connection_template_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_consent_request_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_dataset_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_drp_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_email_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_encryption_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_health_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_identity_verification_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_manual_webhooks.py create mode 100644 tests/ops/api/v1/endpoints/test_masking_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_oauth_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_policy_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_policy_webhook_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_privacy_request_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_saas_config_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_storage_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_user_endpoints.py create mode 100644 tests/ops/api/v1/endpoints/test_user_permission_endpoints.py create mode 100644 tests/ops/api/v1/test_exception_handlers.py create mode 100644 tests/ops/api/v1/test_main.py create mode 100644 tests/ops/conftest.py create mode 100644 tests/ops/core/__init__.py create mode 100644 tests/ops/email_templates/__init__.py create mode 100644 tests/ops/email_templates/test_get_email_template.py create mode 100644 tests/ops/fixtures/__init__.py create mode 100644 tests/ops/fixtures/application_fixtures.py create mode 100644 tests/ops/fixtures/bigquery_fixtures.py create mode 100644 tests/ops/fixtures/email_fixtures.py create mode 100644 tests/ops/fixtures/integration_fixtures.py create mode 100644 tests/ops/fixtures/manual_fixtures.py create mode 100644 tests/ops/fixtures/manual_webhook_fixtures.py create mode 100644 tests/ops/fixtures/mariadb_fixtures.py create mode 100644 tests/ops/fixtures/mongodb_fixtures.py create mode 100644 tests/ops/fixtures/mssql_fixtures.py create mode 100644 tests/ops/fixtures/mysql_fixtures.py create mode 100644 tests/ops/fixtures/postgres_fixtures.py create mode 100644 tests/ops/fixtures/redshift_fixtures.py create mode 100644 tests/ops/fixtures/saas/__init__.py create mode 100644 tests/ops/fixtures/saas/adobe_campaign_fixtures.py create mode 100644 tests/ops/fixtures/saas/auth0_fixtures.py create mode 100644 tests/ops/fixtures/saas/braze_fixtures.py create mode 100644 tests/ops/fixtures/saas/connection_template_fixtures.py create mode 100644 tests/ops/fixtures/saas/datadog_fixtures.py create mode 100644 tests/ops/fixtures/saas/hubspot_fixtures.py create mode 100644 tests/ops/fixtures/saas/mailchimp_fixtures.py create mode 100644 tests/ops/fixtures/saas/outreach_fixtures.py create mode 100644 tests/ops/fixtures/saas/request_override/__init__.py create mode 100644 tests/ops/fixtures/saas/request_override/firebase_auth_fixtures.py create mode 100644 tests/ops/fixtures/saas/request_override/mailchimp_override_fixtures.py create mode 100644 tests/ops/fixtures/saas/rollbar_fixtures.py create mode 100644 tests/ops/fixtures/saas/salesforce_fixtures.py create mode 100644 tests/ops/fixtures/saas/segment_fixtures.py create mode 100644 tests/ops/fixtures/saas/sendgrid_fixtures.py create mode 100644 tests/ops/fixtures/saas/sentry_fixtures.py create mode 100644 tests/ops/fixtures/saas/shopify_fixtures.py create mode 100644 tests/ops/fixtures/saas/square_fixtures.py create mode 100644 tests/ops/fixtures/saas/stripe_fixtures.py create mode 100644 tests/ops/fixtures/saas/zendesk_fixtures.py create mode 100644 tests/ops/fixtures/saas_example_fixtures.py create mode 100644 tests/ops/fixtures/snowflake_fixtures.py create mode 100644 tests/ops/fixtures/timescale_fixtures.py create mode 100644 tests/ops/generator/__init__.py create mode 100644 tests/ops/generator/sql_data_generator.py create mode 100644 tests/ops/generator/test_data_generator.py create mode 100644 tests/ops/graph/__init__.py create mode 100644 tests/ops/graph/graph_test_util.py create mode 100644 tests/ops/graph/test_config.py create mode 100644 tests/ops/graph/test_data_types.py create mode 100644 tests/ops/graph/test_edge.py create mode 100644 tests/ops/graph/test_graph.py create mode 100644 tests/ops/graph/test_graph_analytics_events.py create mode 100644 tests/ops/graph/test_graph_differences.py create mode 100644 tests/ops/graph/test_graph_traversal.py create mode 100644 tests/ops/graph/test_traversal_node.py create mode 100644 tests/ops/integration_test_config.toml create mode 100644 tests/ops/integration_tests/__init__.py create mode 100644 tests/ops/integration_tests/limiter/__init__.py create mode 100644 tests/ops/integration_tests/limiter/test_rate_limiter.py create mode 100644 tests/ops/integration_tests/saas/__init__.py create mode 100644 tests/ops/integration_tests/saas/request_override/__init__.py create mode 100644 tests/ops/integration_tests/saas/request_override/test_firebase_auth_task.py create mode 100644 tests/ops/integration_tests/saas/request_override/test_mailchimp_override_task.py create mode 100644 tests/ops/integration_tests/saas/test_adobe_campaign_task.py create mode 100644 tests/ops/integration_tests/saas/test_auth0_task.py create mode 100644 tests/ops/integration_tests/saas/test_braze_task.py create mode 100644 tests/ops/integration_tests/saas/test_datadog_task.py create mode 100644 tests/ops/integration_tests/saas/test_hubspot_task.py create mode 100644 tests/ops/integration_tests/saas/test_mailchimp_task.py create mode 100644 tests/ops/integration_tests/saas/test_outreach_task.py create mode 100644 tests/ops/integration_tests/saas/test_rollbar_task.py create mode 100644 tests/ops/integration_tests/saas/test_salesforce_task.py create mode 100644 tests/ops/integration_tests/saas/test_segment_task.py create mode 100644 tests/ops/integration_tests/saas/test_sendgrid_task.py create mode 100644 tests/ops/integration_tests/saas/test_sentry_task.py create mode 100644 tests/ops/integration_tests/saas/test_shopify_task.py create mode 100644 tests/ops/integration_tests/saas/test_square_task.py create mode 100644 tests/ops/integration_tests/saas/test_stripe_task.py create mode 100644 tests/ops/integration_tests/saas/test_zendesk_task.py create mode 100644 tests/ops/integration_tests/setup_scripts/__init__.py create mode 100644 tests/ops/integration_tests/setup_scripts/mariadb_setup.py create mode 100644 tests/ops/integration_tests/setup_scripts/mssql_setup.py create mode 100644 tests/ops/integration_tests/setup_scripts/postgres_setup.py create mode 100644 tests/ops/integration_tests/setup_scripts/timescale_setup.py create mode 100644 tests/ops/integration_tests/test_connection_configuration_integration.py create mode 100644 tests/ops/integration_tests/test_email_task.py create mode 100644 tests/ops/integration_tests/test_execution.py create mode 100644 tests/ops/integration_tests/test_external_database_connections.py create mode 100644 tests/ops/integration_tests/test_integration_email.py create mode 100644 tests/ops/integration_tests/test_integration_mariadb_example.py create mode 100644 tests/ops/integration_tests/test_integration_mongodb_example.py create mode 100644 tests/ops/integration_tests/test_integration_mssql_example.py create mode 100644 tests/ops/integration_tests/test_integration_mysql_example.py create mode 100644 tests/ops/integration_tests/test_integration_postgres_example.py create mode 100644 tests/ops/integration_tests/test_integration_timescale_example.py create mode 100644 tests/ops/integration_tests/test_manual_task.py create mode 100644 tests/ops/integration_tests/test_mongo_task.py create mode 100644 tests/ops/integration_tests/test_sql_task.py create mode 100644 tests/ops/models/__init__.py create mode 100644 tests/ops/models/test_base.py create mode 100644 tests/ops/models/test_client.py create mode 100644 tests/ops/models/test_connectionconfig.py create mode 100644 tests/ops/models/test_datasetconfig.py create mode 100644 tests/ops/models/test_fidesopsuser.py create mode 100644 tests/ops/models/test_fidesopsuserpermissions.py create mode 100644 tests/ops/models/test_manual_webhook.py create mode 100644 tests/ops/models/test_policy.py create mode 100644 tests/ops/models/test_policy_webhooks.py create mode 100644 tests/ops/models/test_privacy_request.py create mode 100644 tests/ops/models/test_saasconfig.py create mode 100644 tests/ops/models/test_storage.py create mode 100644 tests/ops/resources/policy/masking_example.yaml create mode 100644 tests/ops/schemas/__init__.py create mode 100644 tests/ops/schemas/connection_configuration/__init__.py create mode 100644 tests/ops/schemas/connection_configuration/test_connection_secrets_saas.py create mode 100644 tests/ops/schemas/email/email_test.py create mode 100644 tests/ops/schemas/test_user_permission.py create mode 100644 tests/ops/scripts/__init__.py create mode 100644 tests/ops/service/__init__.py create mode 100644 tests/ops/service/authentication/__init__.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_api_key.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_basic.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_bearer.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_factory.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_oauth2_authorization_code.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_oauth2_client_credentials.py create mode 100644 tests/ops/service/authentication/test_authentication_strategy_query_param.py create mode 100644 tests/ops/service/connection_config/__init__.py create mode 100644 tests/ops/service/connection_config/test_http_connector.py create mode 100644 tests/ops/service/connection_config/test_mariadb_connector.py create mode 100644 tests/ops/service/connection_config/test_mysql_connector.py create mode 100644 tests/ops/service/connection_config/test_postgres_connector.py create mode 100644 tests/ops/service/connectors/__init__.py create mode 100644 tests/ops/service/connectors/saas/test_authenticated_client.py create mode 100644 tests/ops/service/connectors/test_connector_registry_service.py create mode 100644 tests/ops/service/connectors/test_email_connector.py create mode 100644 tests/ops/service/connectors/test_queryconfig.py create mode 100644 tests/ops/service/connectors/test_saas_connector.py create mode 100644 tests/ops/service/connectors/test_saas_queryconfig.py create mode 100644 tests/ops/service/email/email_dispatch_service_test.py create mode 100644 tests/ops/service/masking/__init__.py create mode 100644 tests/ops/service/masking/strategy/__init__.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_aes_encrypt.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_factory.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_hash.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_hmac.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_null.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_random_string_rewrite.py create mode 100644 tests/ops/service/masking/strategy/test_masking_strategy_string_rewrite.py create mode 100644 tests/ops/service/pagination/__init__.py create mode 100644 tests/ops/service/pagination/test_pagination_strategy_cursor.py create mode 100644 tests/ops/service/pagination/test_pagination_strategy_factory.py create mode 100644 tests/ops/service/pagination/test_pagination_strategy_link.py create mode 100644 tests/ops/service/pagination/test_pagination_strategy_offset.py create mode 100644 tests/ops/service/privacy_request/__init__.py create mode 100644 tests/ops/service/privacy_request/onetrust_test.py create mode 100644 tests/ops/service/privacy_request/request_runner_service_test.py create mode 100644 tests/ops/service/processors/__init__.py create mode 100644 tests/ops/service/processors/post_processor_strategy/__init__.py create mode 100644 tests/ops/service/processors/post_processor_strategy/test_post_processor_strategy_factory.py create mode 100644 tests/ops/service/processors/post_processor_strategy/test_post_processor_strategy_filter.py create mode 100644 tests/ops/service/processors/post_processor_strategy/test_post_processor_strategy_unwrap.py create mode 100644 tests/ops/service/saas_request/__init__.py create mode 100644 tests/ops/service/saas_request/test_saas_request_override_factory.py create mode 100644 tests/ops/service/storage_uploader_service_test.py create mode 100644 tests/ops/service/test_strategy_retrieval.py create mode 100644 tests/ops/task/__init__.py create mode 100644 tests/ops/task/test_consolidate_query_matches.py create mode 100644 tests/ops/task/test_filter_element_match.py create mode 100644 tests/ops/task/test_filter_results.py create mode 100644 tests/ops/task/test_graph_task.py create mode 100644 tests/ops/task/test_refine_target_path.py create mode 100644 tests/ops/task/test_task_resources.py create mode 100644 tests/ops/task/traversal_data.py create mode 100644 tests/ops/tasks/__init__.py create mode 100644 tests/ops/tasks/test_celery.py create mode 100644 tests/ops/tasks/test_scheduled.py create mode 100644 tests/ops/test_helpers/__init__.py create mode 100644 tests/ops/test_helpers/cache_secrets_helper.py create mode 100644 tests/ops/test_helpers/dataset_utils.py create mode 100644 tests/ops/test_helpers/saas_test_utils.py create mode 100644 tests/ops/test_helpers/test_dataset_utils.py create mode 100644 tests/ops/test_helpers/vault_client.py create mode 100644 tests/ops/util/__init__.py create mode 100644 tests/ops/util/encryption/__init__.py create mode 100644 tests/ops/util/encryption/test_aes_gcm_encryption_scheme.py create mode 100644 tests/ops/util/encryption/test_hmac_encryption_scheme.py create mode 100644 tests/ops/util/encryption/test_secrets_util.py create mode 100644 tests/ops/util/test_api_router.py create mode 100644 tests/ops/util/test_cache.py create mode 100644 tests/ops/util/test_collection_util.py create mode 100644 tests/ops/util/test_dataset_yaml.py create mode 100644 tests/ops/util/test_jwt_util.py create mode 100644 tests/ops/util/test_logger.py create mode 100644 tests/ops/util/test_matching_queue.py create mode 100644 tests/ops/util/test_saas_util.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index 5fc356d487..0000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "Fidesctl", - "dockerComposeFile": "../docker-compose.yml", - "service": "fidesctl", - "workspaceFolder": "/fides", - "shutdownAction": "stopCompose", - "extensions": [ - "ms-python.python", - "ms-azuretools.vscode-docker", - "redhat.vscode-yaml", - "davidanson.vscode-markdownlint", - "bungcip.better-toml", - "github.vscode-pull-request-github", - "ms-python.vscode-pylance", - "ethyca.fidesctl" - ], - "settings": { - "editor.formatOnSave": true, - "editor.tabSize": 4, - "editor.insertSpaces": true, - "python.formatting.provider": "black", - "python.linting.mypyEnabled": true, - "conf.fidesctl.confFilePath": "/fides/.fides/fidesctl.toml", - "conf.fidesctl.manifestFilePath": "/fides/.fides/", - "conf.fidesctl.parseOnSave": true - } -} diff --git a/.dockerignore b/.dockerignore index efd8ddfd46..3d118b23e0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,14 @@ # Ignore existing build artifacts build/ dist/ -src/fidesctl.egg-info/ -src/fidesctl/ui-build/ +src/fides.egg-info/ +src/fides/ui-build/ +src/ui-build/ + +# Frontend +**/node_modules +**/.next + # Ignore Python-Specific Files .mypy_cache/ @@ -10,6 +16,9 @@ src/fidesctl/ui-build/ .pytest_cache/ __pycache__/ .coverage +**.*.pyc +**.*.pyo +**.*.pyd # pyenv .python-version @@ -30,8 +39,8 @@ docs/ # Ignore dev files .github/ .devcontainer/ -**/node_modules/ # Ignore cypress artifacts **/videos/ **/screenshots/ +.DS_Store diff --git a/.fides/celery.toml b/.fides/celery.toml new file mode 100644 index 0000000000..71e19044f7 --- /dev/null +++ b/.fides/celery.toml @@ -0,0 +1,2 @@ +event_queue_prefix = "fidesops_worker" +task_default_queue = "fidesops" diff --git a/.fides/dataset.yml b/.fides/db_dataset.yml similarity index 54% rename from .fides/dataset.yml rename to .fides/db_dataset.yml index 6c5123b235..76b1ac6a75 100644 --- a/.fides/dataset.yml +++ b/.fides/db_dataset.yml @@ -1,149 +1,112 @@ dataset: -- fides_key: public +- fides_key: fides_db organization_fides_key: default_organization - tags: null name: public - description: The dataset responsible for storing all of the data related to a fidesctl - instance. + description: The dataset for the fides application. meta: {} data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - fidesctl_meta: null - joint_controller: null retention: 1 year post employment - third_country_transfers: null collections: + - name: accessmanualwebhook + description: 'Fides Generated Description for Table: accessmanualwebhook' + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: connection_config_id + description: 'Fides Generated Description for Column: connection_config_id' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + description: 'Fides Generated Description for Column: created_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: fields + description: 'Fides Generated Description for Column: fields' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + description: 'Fides Generated Description for Column: id' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + description: 'Fides Generated Description for Column: updated_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - name: alembic_version - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: version_num - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: auditlog - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: action - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: message - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: privacy_request_id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: user_id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: client - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: hashed_secret - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: salt - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: scopes - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: user_id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: cls_classification_detail description: 'Fides Generated Description for Table: cls_classification_detail' data_categories: null @@ -245,162 +208,93 @@ dataset: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - name: ctl_data_categories - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: parent_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: is_default - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_data_qualifiers - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: parent_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: is_default - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_data_subjects - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: automated_decisions_or_profiling description: Boolean value representing if automated decisions or profiling @@ -408,253 +302,150 @@ dataset: data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: rights description: JSON structure containing a strategy and optional values for detailing data subject rights available data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: is_default - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_data_uses - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: legal_basis - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: legitimate_interest description: Boolean value denoting whether or not the data use is marked as a legitimate interest data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: legitimate_interest_impact_assessment description: A url pointing to a legitimate interest impact assessment data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: parent_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: recipients - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: special_category - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: is_default - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_datasets - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: collections - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: data_categories - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: data_qualifier - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fidesctl_meta - description: Metadata specifically for the fidesctl application data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: joint_controller description: Encrypted contact information for a joint controller (name, address, email, phone) @@ -662,263 +453,159 @@ dataset: - user.contact data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: End of joint controller agreement. - fields: null - name: legal_basis description: The legal basis for processing personal data as defined by Article 6 of the GDPR data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: meta - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: recipients description: An array of recipients of the intended data use. data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: retention description: A string representing how long the dataset is retained for. Can also be found and applied as a property within Collections and Fields. data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: special_category description: The special category as defined by Article 9 of the GDPR data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: third_country_transfers - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_evaluations - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: details - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: message - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: status - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: violations - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fidesuser - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: first_name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: hashed_password - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: last_login_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: last_name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: password_reset_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: salt - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: username - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fidesuserpermissions - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: scopes - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: user_id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_organizations - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: controller description: Encrypted contact information for the controller (name, address, @@ -927,14 +614,11 @@ dataset: - user.contact data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: 1 Year post-employment - fields: null - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: data_protection_officer description: Encrypted contact information for the Data Protection Officer (name, address, email, phone) @@ -942,56 +626,34 @@ dataset: - user.contact data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: 1 Year post-employment - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fidesctl_meta - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_parent_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: representative description: Encrypted contact information for the representative (name, address, email, phone) @@ -999,196 +661,121 @@ dataset: - user.contact data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: 1 Year post-employment - fields: null - name: security_policy description: A link to the Ethyca security policy data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_policies - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: rules - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_registries - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: ctl_systems - description: null - data_categories: null data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null fields: - name: administrating_department - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: created_at description: The timestamp of when the row was created data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: data_protection_impact_assessment description: Properties identifying if a DPIA is required, the status of it, and a link if applicable. data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: data_responsibility_title - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: description - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified @@ -1201,21 +788,28 @@ dataset: data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: null fields: null - - name: fides_key + - name: egress description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: null fields: null + - name: fides_key + data_categories: + - system.operations + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - name: fidesctl_meta - description: null + data_categories: + - system.operations + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: null fields: null - - name: id + - name: ingress description: null data_categories: - system.operations @@ -1236,74 +830,599 @@ dataset: - user.contact data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified retention: End of joint controller agreement. - fields: null - name: meta - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: name - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: organization_fides_key - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: privacy_declarations - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: registry_id - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: system_dependencies - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: system_type - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: tags - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: third_country_transfers - description: null data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null - name: updated_at description: The timestamp of when the row was last updated data_categories: - system.operations data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - retention: null - fields: null + - name: emailconfig + description: 'Fides Generated Description for Table: emailconfig' + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + description: 'Fides Generated Description for Column: created_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: details + description: 'Fides Generated Description for Column: details' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + description: 'Fides Generated Description for Column: id' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + description: 'Fides Generated Description for Column: key' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + description: 'Fides Generated Description for Column: name' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: secrets + description: 'Fides Generated Description for Column: secrets' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: service_type + description: 'Fides Generated Description for Column: service_type' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + description: 'Fides Generated Description for Column: updated_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: authenticationrequest + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: connection_key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: state + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: client + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: fides_key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: hashed_secret + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: salt + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: scopes + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: user_id + data_categories: [user.unique_id] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: connectionconfig + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: access + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: connection_type + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: description + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: disabled + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: disabled_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: last_test_succeeded + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: last_test_timestamp + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: saas_config + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: secrets + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: consent + description: 'Fides Generated Description for Table: consent' + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: data_use + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: data_use_description + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: opt_in + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: provided_identity_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: consentrequest + description: 'Fides Generated Description for Table: consentrequest' + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + description: 'Fides Generated Description for Column: created_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + description: 'Fides Generated Description for Column: id' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: provided_identity_id + description: 'Fides Generated Description for Column: provided_identity_id' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + description: 'Fides Generated Description for Column: updated_at' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: datasetconfig + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: connection_config_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: dataset + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: fides_key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: executionlog + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: action_type + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: collection_name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: dataset_name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: fields_affected + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: message + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: privacy_request_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: status + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + + - name: fidesuser + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: first_name + data_categories: [user.name] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: hashed_password + data_categories: [user.credentials.password] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [user.unique_id] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: last_login_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: last_name + data_categories: [user.name] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: password_reset_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: salt + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: username + data_categories: [user.credentials] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: fidesuserpermissions + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: scopes + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: user_id + data_categories: [user.unique_id] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policy + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: client_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: execution_timeframe + description: 'Fides Generated Description for Column: execution_timeframe' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: drp_action + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policypostwebhook + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: connection_config_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: direction + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: order + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policy_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policyprewebhook + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: connection_config_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: direction + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: order + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policy_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: privacyrequest + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: cancel_reason + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: canceled_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: client_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: due_date + description: 'Fides Generated Description for Column: due_date' + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: external_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: finished_processing_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: identity_verified_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: origin + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: paused_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policy_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: requested_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: reviewed_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: reviewed_by + data_categories: [user.name] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: started_processing_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: status + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: providedidentity + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: encrypted_value + data_categories: [user.contact, user.unique_id] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: field_name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: hashed_value + data_categories: [user.contact, user.unique_id] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: privacy_request_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: rule + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: action_type + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: client_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: masking_strategy + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: policy_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: storage_destination_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: ruletarget + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: client_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: data_category + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: rule_id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: storageconfig + data_categories: [] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fields: + - name: created_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: details + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: format + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: id + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: key + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: name + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: secrets + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: type + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + - name: updated_at + data_categories: [system.operations] + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified diff --git a/.fides/fides.toml b/.fides/fides.toml new file mode 100644 index 0000000000..e12f1bb177 --- /dev/null +++ b/.fides/fides.toml @@ -0,0 +1,56 @@ +[database] +server = "fides-db" +user = "postgres" +password = "fides" +port = "5432" +db = "fides" +test_db = "fides_test" + +[credentials] +app_postgres = {connection_string="postgresql+psycopg2://postgres:fides@fides-db:5432/fides_test"} + +[logging] +level = "INFO" + +[cli] +server_host = "localhost" +server_port = 8080 + +[user] +analytics_opt_out = false + +[redis] +host = "redis" +password = "testpassword" +port = 6379 +charset = "utf8" +default_ttl_seconds = 604800 +db_index = 0 +ssl = false +ssl_cert_reqs = "required" + +[security] +app_encryption_key = "OLMkv91j8DHiDAULnK5Lxx3kSCov30b3" +cors_origins = [ "http://localhost", "http://localhost:8080", "http://localhost:3000", "http://localhost:3001",] +encoding = "UTF-8" +oauth_root_client_id = "fidesopsadmin" +oauth_root_client_secret = "fidesopsadminsecret" +drp_jwt_secret = "secret" +root_username = "root_user" +root_password = "Testpassword1!" + +[execution] +masking_strict = true +require_manual_request_approval = false +task_retry_backoff = 1 +subject_identity_verification_required = false +task_retry_count = 0 +task_retry_delay = 1 + +[admin_ui] +enabled = true + +[notifications] +send_request_completion_notification = true +send_request_receipt_notification = true +send_request_review_notification = true diff --git a/.fides/fidesctl.toml b/.fides/fidesctl.toml deleted file mode 100644 index d53452be48..0000000000 --- a/.fides/fidesctl.toml +++ /dev/null @@ -1,17 +0,0 @@ -[database] -server = "fidesctl-db" -user = "postgres" -password = "fidesctl" -port = "5432" -db = "fidesctl" -test_db = "fidesctl_test" - -[logging] -level = "INFO" - -[cli] -server_host = "localhost" -server_port = 8080 - -[user] -analytics_opt_out = false diff --git a/.fides/policy.yml b/.fides/policies.yml similarity index 53% rename from .fides/policy.yml rename to .fides/policies.yml index 545f099d4c..30da1592d7 100644 --- a/.fides/policy.yml +++ b/.fides/policies.yml @@ -1,28 +1,8 @@ policy: -- fides_key: fidesctl_policy - organization_fides_key: default_organization - tags: null - name: Fidesctl Policy - description: The main privacy policy for Fidesctl. - rules: - - name: reject_non_system_data - data_categories: - matches: OTHER - values: - - system.operations - data_uses: - matches: OTHER - values: - - provide - data_subjects: - matches: OTHER - values: - - anonymous_user - data_qualifier: aggregated + - fides_key: data_sharing_policy - organization_fides_key: default_organization - tags: null name: Data Sharing + organization_fides_key: default_organization description: The privacy policy that governs sharing of data with third parties. rules: - name: Disallow Third-Party Marketing diff --git a/.fides/redis_dataset.yml b/.fides/redis_dataset.yml new file mode 100644 index 0000000000..2a7f7beec1 --- /dev/null +++ b/.fides/redis_dataset.yml @@ -0,0 +1,126 @@ +dataset: + - fides_key: fides_cache + name: Fides Redis Cache + description: Fields stored in temporary storage to support Fides request execution + collections: + - name: hash_table + fields: + - name: EN_ACCESS_GRAPH__ + description: This graph is summarized and sent to Fideslog to create high level insight into how graphs change between retries to inform future features. + data_categories: + - system.operations + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fidesops_meta: + data_type: object # Stores an encrypted representation of the fidesops graph that executes the privacy requests. + fields: + - name: : # The current collection + data_categories: + - system.operations + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + fidesops_meta: + data_type: object + fields: + - name: : # An upstream collection + data_categories: [system.operations] + fidesops_meta: + data_type: string[] # List of edges between the upstream collection and the current collection + - name: EN_EMAIL_INFORMATION________ # Usage: For building emails associated with email-connector datasets at the end of the privacy request. This encrypted raw information is retrieved from each relevant email-based collection and used to build a single email per email connector, with instructions on how to mask data on the given dataset. + fidesops_meta: + data_type: object # Stores how to locate and mask records for a given "email" collection. + fields: + - name: step # Currently always "erasure". The email connector only sends emails for erasure requests. + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: collection # : + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: action_needed + fidesops_meta: + data_type: object[] + fields: + - name: locators + data_categories: [user] + fidesops_meta: + data_type: object # Field names mapped to values that should be used to locate the relevant records to mask + - name: get # Always None for this "action required" cache + - name: update + fidesops_meta: + data_type: object # Field names (nested fields are dot-separated) mapped to the masking value + - name: EN_FAILED_LOCATION__ # Usage: Used to resume a privacy request from a particular checkpoint. + fidesops_meta: + data_type: object + fields: + - name: step # The particular checkpoint where the privacy request failed. Only one checkpoint can be cached at a time. + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: collection # dataset_name:collection_name # Optional. If the privacy request failed inside the graph, the particular dataset/collection where it failed. + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: EN_MANUAL_INPUT____: # Usage: To store data uploaded by a human for a given manual collection which can be used to query downstream dependent results and later filtered and returned to the user. This is for the Manual Connector, which is integrated with the graph. + fidesops_meta: + data_type: object[] # A list of rows manually uploaded for a given collection. The fields will be entirely dependent on the collection in question. + - name: EN_MANUAL_MASK____: # Usage: To have an erasure for a Manual Connector (which is integrated with the graph) return the same information that an automated connector returns. This allows a user to confirm they've manually masked data on their end for a given collection. + data_categories: [system.operations] + fidesops_meta: + data_type: integer # A count of records manually erased for a given collection + - name: EN_PAUSED_LOCATION__ # Usage: Caches the location where a privacy request is paused and awaiting input by a manual connector. Manual data should be uploaded corresponding to this cached location. Manual connectors are integrated with the graph. + fidesops_meta: + data_type: object + fields: + - name: step # Either access or erasure + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: collection # dataset_name:collection_name. The given collection where the manual connector is awaiting input. + data_categories: [system.operations] + fidesops_meta: + data_type: string + - name: action_needed + fidesops_meta: + data_type: object[] + fields: + - name: locators + data_type: object # Field names mapped to values that should be used to manually locate the record(s) associated with a given subject + - name: get # Applicable if we're paused on the "access" step. A list of field names on the current collection that should be retrieved. + data_categories: [user] + data_type: string[] + - name: update # Applicable if we're paused on the "erasure" step + data_type: object # Field names mapped to the values that should be used to mask + - name: EN_PLACEHOLDER_RESULTS____access_request__: # Usage: Saves the access data that we should use to perform the erasure request. Access request data is a prerequisite to running an erasure. + fidesops_meta: + data_type: object[] # A list of encrypted rows. This separate representation of access results is stored to indicate which array elements are not applicable to the given data subject. + - name: EN___access_request__: # Usage: These are the results of the access request for a given collection. These rows are used to find data in dependent collections downstream and are later filtered by data category and returned to the user. + fidesops_meta: + data_type: object[] # A list of encrypted rows retrieved from the given collection in an access request. + - name: EN___erasure_request__: # Usage: For retrying a privacy request after pause or failure, lets us know that an erasure was already performed on this collection, so we don't attempt again. + data_categories: [system.operations] + fidesops_meta: + data_type: integer # An encrypted count of records masked on the given collection + - name: EN_WEBHOOK_MANUAL_INPUT____ # Usage: Stores fields manually uploaded for a *webhook* to be returned directly to the user at the end of the privacy request. Manual webhooks run before the graph, as opposed to manual connectors which collect manual data as *part* of the graph. + fidesops_meta: + data_type: object # A single record that was manually uploaded for the given manual webhook (all dynamic fields may be user-related) + - name: id--async-execution # Usage: May not be using yet, but tying a privacy request to its celery task could give us more insight into its current status in the future. + data_categories: [system.operations] + fidesops_meta: + data_type: string # Stores the privacy request's celery task id + - name: id--drp-" # Usage: For DRP troubleshooting. Individually caches portions of the drp request body. Can map to multiple scalar values. + - name: id--encryption-key # Usage: Used to encrypt access request results before uploading to the user + fidesops_meta: + data_categories: [system.operations] + data_type: string # Sets the fidesops encryption key. + - name: id--identity- # Usage: For caching the users' identity to be used in privacy request execution. For example, identity attribute might be "email" or "phone_number" + data_categories: [user] + fidesops_meta: + data_type: string + - name: id--masking-secret-- # Usage: To carry out erasure requests using certain masking strategies that need secrets + data_categories: [system.operations] + fidesops_meta: + data_type: string # An automatically generated secret that should be used in conjunction with the given masking strategy + - name: IDENTITY_VERIFICATION_CODE__ # Usage: To verify the user's identity before executing a privacy request. + data_categories: [system.operations] + fidesops_meta: + data_type: string # A stringified version of a six-digit identification number diff --git a/.fides/system.yml b/.fides/system.yml deleted file mode 100644 index 9fb4d6ee37..0000000000 --- a/.fides/system.yml +++ /dev/null @@ -1,29 +0,0 @@ -system: -- fides_key: fidesctl_system - organization_fides_key: default_organization - name: Fidesctl System - description: Software that functionally applies Fides. - registry_id: null - meta: null - fidesctl_meta: null - system_type: Service - data_responsibility_title: Controller - privacy_declarations: - - name: Store system data. - data_categories: - - system.operations - - user.contact - data_use: improve.system - data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified - data_subjects: - - anonymous_user - dataset_references: - - public - system_dependencies: null - joint_controller: null - third_country_transfers: null - administrating_department: Not defined - data_protection_impact_assessment: - is_required: false - progress: null - link: null diff --git a/.fides/systems.yml b/.fides/systems.yml new file mode 100644 index 0000000000..e5d36896f2 --- /dev/null +++ b/.fides/systems.yml @@ -0,0 +1,88 @@ +system: + # System Info + - fides_key: privacy_annotations + name: Fides Privacy Annotations + organization_fides_key: default_organization + description: Privacy annotations as code. + system_type: Service + # RoPA Info - these need to exist to pass an audit + data_responsibility_title: Controller + data_protection_impact_assessment: + is_required: false + progress: null + link: null + joint_controller: null + third_country_transfers: null + administrating_department: Not defined + # Privacy Declarations + privacy_declarations: + - name: Store fidesctl annotation data. + data_categories: + - system.operations + - user.contact + data_use: improve.system + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + data_subjects: + - anonymous_user + dataset_references: + - fides_db + + # System Info + - fides_key: privacy_request_fullfillment + name: Fides Privacy Request Fulfillment + organization_fides_key: default_organization + description: Privacy request fufillment. + system_type: Application + # RoPA Info - these need to exist to pass an audit + data_responsibility_title: Controller + data_protection_impact_assessment: + is_required: false + progress: null + link: null + joint_controller: null + third_country_transfers: null + administrating_department: Not defined + # Privacy Declarations + privacy_declarations: + - name: Manage privacy request Fufillment + data_categories: [] # comprehensive list of data categories in `fides_db` + data_use: provide.service + data_subjects: + - customer + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + dataset_references: + - fides_db + - fides_cache + + # System Info + - fides_key: admin_ui + name: Fides Administration UI + organization_fides_key: default_organization + description: Fides administration UI. + system_type: Application + # RoPA Info - these need to exist to pass an audit + data_responsibility_title: Controller + data_protection_impact_assessment: + is_required: false + progress: null + link: null + joint_controller: null + third_country_transfers: null + administrating_department: Not defined + # Privacy Declarations + privacy_declarations: + - name: Manage privacy request Fufillment + data_categories: [] # comprehensive list of data categories in `fides_db` + data_use: provide.service + data_subjects: + - employee + data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified + dataset_references: + - fides_db + # Specific tables for reference + # - fides_db.client + # - fides_db.connectionconfig + # - fides_db.fidesuser + # - fides_db.fidesuserpermissions + # - fides_db.providedidentity + # - fides_db.privacyrequest diff --git a/.gitattributes b/.gitattributes index d2fc909941..254007f175 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -src/fidesctl/_version.py export-subst +src/fides/_version.py export-subst diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000000..adcf4706e0 --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,34 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + labels: + - dependencies + - python + - dependabot + - package-ecosystem: npm + directory: "/clients/ops/admin-ui" + schedule: + interval: weekly + labels: + - dependencies + - javascript + - dependabot + - package-ecosystem: npm + directory: "/clients/ops/privacy-center" + schedule: + interval: weekly + labels: + - dependencies + - javascript + - dependabot + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + labels: + - dependencies + - github_actions + - dependabot diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 966804df3d..4766d48d49 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,8 +12,8 @@ Closes * [ ] All CI Pipelines Succeeded * Documentation Updated: - - [ ] documentation complete, or draft/outline provided (tag docs-team to complete/review on this branch) - - [ ] documentation issue created (tag docs-team to complete issue separately) + * [ ] documentation complete, or draft/outline provided (tag docs-team to complete/review on this branch) + * [ ] documentation issue created (tag docs-team to complete issue separately) * [ ] Issue Requirements are Met * [ ] Relevant Follow-Up Issues Created * [ ] Update `CHANGELOG.md` diff --git a/.github/workflows/backend_checks.yml b/.github/workflows/backend_checks.yml new file mode 100644 index 0000000000..0c795186e5 --- /dev/null +++ b/.github/workflows/backend_checks.yml @@ -0,0 +1,391 @@ +name: Backend Code Checks + +on: + pull_request: + paths-ignore: + - "**.md" + +env: + IMAGE: ethyca/fides:local + DEFAULT_PYTHON_VERSION: "3.10.6" + +jobs: + Build: + strategy: + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + + - name: Build container + uses: docker/build-push-action@v2 + with: + builder: ${{ steps.buildx.outputs.name }} + context: . + build-args: PYTHON_VERSION=${{ matrix.python_version }} + target: prod + outputs: type=docker,dest=/tmp/python-${{ matrix.python_version }}.tar + push: false + tags: ${{ env.IMAGE }} + + - name: Upload container + uses: actions/upload-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/python-${{ matrix.python_version }}.tar + retention-days: 1 + +################### +## Static Checks ## +################### + isort: + runs-on: ubuntu-latest + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run sorter + run: nox -s isort + + Black: + runs-on: ubuntu-latest + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: set up python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run formatter + run: nox -s black + + Pylint: + runs-on: ubuntu-latest + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: set up python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run linter + run: nox -s pylint + + Mypy: + runs-on: ubuntu-latest + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: set up python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run typechecker + run: nox -s mypy + + Xenon: + runs-on: ubuntu-latest + steps: + + - name: Checkout + uses: actions/checkout@v3 + + - name: set up python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run cyclomatic complexity check + run: nox -s xenon + +######################## +## Application Checks ## +######################## + Docs: + needs: Build + runs-on: ubuntu-latest + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ env.DEFAULT_PYTHON_VERSION }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ env.DEFAULT_PYTHON_VERSION }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Check that the docs can build + run: nox -s docs_check + + Fides-Checks: + needs: Build + runs-on: ubuntu-latest + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ env.DEFAULT_PYTHON_VERSION }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ env.DEFAULT_PYTHON_VERSION }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install Nox + run: pip install nox>=2022 + + - name: Check fides installation + run: nox -s check_install + + - name: Run fides evaluation + run: nox -s check_fides_annotations -- docker + + - name: Scan fides db + run: nox -s fides_db_scan + +################ +## Safe Tests ## +################ + Pytest-Ctl-Not-External: + needs: Build + strategy: + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run non-external test suite + run: nox -s "pytest_ctl(not-external)" + + + Pytest-Unit-Ops: + needs: Build + strategy: + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run unit test suite + run: nox -s "pytest_ops(unit)" + + Pytest-Integration-Ops: + needs: Build + strategy: + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + continue-on-error: true + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run integration test suite + run: nox -s "pytest_ops(integration)" + +################## +## Unsafe Tests ## +################## + Pytest-Ctl-External: + needs: Build + strategy: + max-parallel: 1 # This prevents collisions in shared external resources + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + if: contains(github.event.pull_request.labels.*.name, 'run unsafe ci checks') + continue-on-error: true + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Run external test suite + run: nox -s "pytest_ctl(external)" + env: + SNOWFLAKE_FIDESCTL_PASSWORD: ${{ secrets.SNOWFLAKE_FIDESCTL_PASSWORD }} + REDSHIFT_FIDESCTL_PASSWORD: ${{ secrets.REDSHIFT_FIDESCTL_PASSWORD }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_FIDESCTL_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_FIDESCTL_ACCESS_KEY }} + OKTA_CLIENT_TOKEN: ${{ secrets.OKTA_FIDESCTL_CLIENT_TOKEN }} + AWS_DEFAULT_REGION: us-east-1 + BIGQUERY_CONFIG: ${{ secrets.BIGQUERY_CONFIG }} + + External-Datastores: + needs: Build + strategy: + max-parallel: 1 # This prevents collisions in shared external resources + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + runs-on: ubuntu-latest + if: contains(github.event.pull_request.labels.*.name, 'run unsafe ci checks') + continue-on-error: true + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Checkout + uses: actions/checkout@v3 + + - name: Install Nox + run: pip install nox>=2022 + + - name: Integration Tests (External) + env: + REDSHIFT_TEST_URI: ${{ secrets.REDSHIFT_TEST_URI }} + REDSHIFT_TEST_DB_SCHEMA: fidesops_test + BIGQUERY_KEYFILE_CREDS: ${{ secrets.BIGQUERY_KEYFILE_CREDS }} + BIGQUERY_DATASET: fidesopstest + SNOWFLAKE_TEST_URI: ${{ secrets.SNOWFLAKE_TEST_URI }} + run: nox -s "pytest_ops(external-datastores)" + + External-SaaS-Connectors: + needs: Build + runs-on: ubuntu-latest + continue-on-error: true + if: contains(github.event.pull_request.labels.*.name, 'run unsafe ci checks') + permissions: + contents: read + id-token: write + strategy: + max-parallel: 1 # This prevents collisions in shared external resources + matrix: + python_version: ["3.8.14", "3.9.14", "3.10.6"] + steps: + - name: Download container + uses: actions/download-artifact@v3 + with: + name: python-${{ matrix.python_version }} + path: /tmp/ + + - name: Load image + run: docker load --input /tmp/python-${{ matrix.python_version }}.tar + + - name: Install Nox + run: pip install nox>=2022 + + - name: Checkout + uses: actions/checkout@v3 + + - name: Get Vault Token + uses: hashicorp/vault-action@v2.4.2 + with: + url: ${{ secrets.VAULT_ADDR }} + namespace: ${{ secrets.VAULT_NAMESPACE }} + method: jwt + role: ${{ secrets.VAULT_ROLE }} + exportToken: True + + - name: SaaS Connector Tests + env: + VAULT_ADDR: ${{ secrets.VAULT_ADDR }} + VAULT_NAMESPACE: ${{ secrets.VAULT_NAMESPACE }} + run: nox -s "pytest_ops(saas)" diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml deleted file mode 100644 index 9bf7d2cc7d..0000000000 --- a/.github/workflows/code_checks.yml +++ /dev/null @@ -1,277 +0,0 @@ -name: Code Checks - -on: - pull_request: - paths-ignore: - - "**.md" - -env: - CONTAINER: fidesctl-local - IMAGE: ethyca/fidesctl:local - -jobs: - Build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v2 - - - name: Build fidesctl container - uses: docker/build-push-action@v2 - with: - builder: ${{ steps.buildx.outputs.name }} - context: . - target: prod - outputs: type=docker,dest=/tmp/${{ env.CONTAINER }}.tar - push: false - tags: ${{ env.IMAGE }} - - - name: Upload fidesctl container - uses: actions/upload-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/${{ env.CONTAINER }}.tar - retention-days: 1 - - Fidesctl: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Python 3.9 - uses: actions/setup-python@v3 - with: - python-version: "3.9" - - - name: Install Nox - run: pip install nox>=2022 - - - name: Check fidesctl installation - run: nox -s check_install -- docker - - - name: Run fidesctl evaluation - run: nox -s fidesctl -- docker - - - name: Scan fidesctl db - run: nox -s fidesctl_db_scan -- docker - - isort: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run sorter - run: nox -s isort -- docker - - Black: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run formatter - run: nox -s black -- docker - - Docs: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Check that the docs can build - run: nox -s docs_check - - Pylint: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run linter - run: nox -s pylint -- docker - - Mypy: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run typechecker - run: nox -s mypy -- docker - - Xenon: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run cyclomatic complexity check - run: nox -s xenon -- docker - - Pytest-Unit: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run unit test suite - run: nox -s "pytest(unit)" - - Pytest-Integration: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run integration test suite - run: nox -s "pytest(integration)" - - Pytest-External: - needs: Build - runs-on: ubuntu-latest - steps: - - name: Download fidesctl container - uses: actions/download-artifact@v3 - with: - name: ${{ env.CONTAINER }} - path: /tmp/ - - - name: Load fidesctl image - run: docker load --input /tmp/${{ env.CONTAINER }}.tar - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install Nox - run: pip install nox>=2022 - - - name: Run external test suite - run: nox -s pytest_external - env: - SNOWFLAKE_FIDESCTL_PASSWORD: ${{ secrets.SNOWFLAKE_FIDESCTL_PASSWORD }} - REDSHIFT_FIDESCTL_PASSWORD: ${{ secrets.REDSHIFT_FIDESCTL_PASSWORD }} - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_FIDESCTL_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_FIDESCTL_ACCESS_KEY }} - OKTA_CLIENT_TOKEN: ${{ secrets.OKTA_FIDESCTL_CLIENT_TOKEN }} - AWS_DEFAULT_REGION: us-east-1 - BIGQUERY_CONFIG: ${{ secrets.BIGQUERY_CONFIG }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..ec6cd000d9 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '00 6 * * 1' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript', 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://git.io/codeql-language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/frontend_pr_checks.yml b/.github/workflows/frontend_checks.yml similarity index 56% rename from .github/workflows/frontend_pr_checks.yml rename to .github/workflows/frontend_checks.yml index e7ce3a7cec..d976f80746 100644 --- a/.github/workflows/frontend_pr_checks.yml +++ b/.github/workflows/frontend_checks.yml @@ -1,4 +1,4 @@ -name: Frontend PR Checks +name: Frontend Code Checks on: pull_request: @@ -14,16 +14,16 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x] + node-version: [ 16.x ] defaults: run: - working-directory: clients/ctl/admin-ui + working-directory: clients/admin-ui steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -33,11 +33,14 @@ jobs: - name: Lint run: npm run lint + - name: Format + run: npm run format:ci + - name: Jest test run: npm run test:ci - name: Build - run: npm run export + run: npm run build Admin-UI-Cypress: runs-on: ubuntu-latest @@ -55,21 +58,46 @@ jobs: - name: Install dependencies run: | - cd clients/ctl/admin-ui + cd clients/admin-ui npm install - name: Cypress E2E tests uses: cypress-io/github-action@v4 with: - working-directory: clients/ctl/admin-ui + working-directory: clients/admin-ui install: false start: npm run cy:start wait-on: "http://localhost:3000" wait-on-timeout: 120 - - name: Cypress component tests - uses: cypress-io/github-action@v4 + Privacy-Center-Unit: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16.x] + defaults: + run: + working-directory: clients/ops/privacy-center + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 with: - working-directory: clients/ctl/admin-ui - install: false - component: true + node-version: ${{ matrix.node-version }} + + - name: Install dependencies + run: npm install + + - name: Lint + run: npm run lint + + - name: Format + run: npm run format:ci + + - name: Jest test + run: npm run test:ci + + - name: Build + run: npm run build diff --git a/.github/workflows/docker.yaml b/.github/workflows/publish_docker.yaml similarity index 98% rename from .github/workflows/docker.yaml rename to .github/workflows/publish_docker.yaml index a76050501f..4eba7aaccf 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/publish_docker.yaml @@ -12,7 +12,7 @@ env: DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} jobs: - push-fidesctl: + push-fides: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/publish_docs.yaml b/.github/workflows/publish_docs.yaml index 59f3ed7ae4..f62a2a29e1 100644 --- a/.github/workflows/publish_docs.yaml +++ b/.github/workflows/publish_docs.yaml @@ -30,7 +30,7 @@ jobs: - name: Install Docs Requirements run: pip install -r docs/fides/requirements.txt - - name: Install fidesctl + - name: Install fides run: pip install -e ./[all] - name: Checkout the gh-pages branches diff --git a/.github/workflows/publish_package.yaml b/.github/workflows/publish_package.yaml index ec0a261d9a..9738537402 100644 --- a/.github/workflows/publish_package.yaml +++ b/.github/workflows/publish_package.yaml @@ -1,4 +1,4 @@ -name: Publish fidesctl +name: Publish Fides on: push: @@ -27,12 +27,12 @@ jobs: - name: Install node modules run: | - cd clients/ctl/admin-ui + cd clients/admin-ui npm install - name: Build and export frontend files run: | - cd clients/ctl/admin-ui + cd clients/admin-ui npm run prod-export - name: Install Twine and wheel diff --git a/.github/workflows/publish_privacy_center_to_dockerhub.yaml b/.github/workflows/publish_privacy_center_to_dockerhub.yaml new file mode 100644 index 0000000000..2f05912dfb --- /dev/null +++ b/.github/workflows/publish_privacy_center_to_dockerhub.yaml @@ -0,0 +1,36 @@ +name: Docker Build & Push Privacy Center + +on: + push: + tags: + - "*" + +env: + DOCKER_USER: ethycaci + DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} + +jobs: + push-fides-privacy-center-image: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ env.DOCKER_USER }} + password: ${{ env.DOCKER_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ethyca/fides-privacy-center + + - name: Build and publish + uses: docker/build-push-action@v3 + with: + context: ./clients/ops/privacy-center + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.metadata.outputs.labels }} diff --git a/.github/workflows/release_event.yml b/.github/workflows/release_event.yml index 58dd16f443..e3e9031eff 100644 --- a/.github/workflows/release_event.yml +++ b/.github/workflows/release_event.yml @@ -8,10 +8,11 @@ jobs: Notify-of-New-Release: runs-on: ubuntu-latest steps: + - name: Repository Dispatch uses: peter-evans/repository-dispatch@v2 with: token: ${{ secrets.DISPATCH_ACCESS_TOKEN }} - repository: ethyca/fidesctl-plus - event-type: new-fidesctl-release + repository: ethyca/fidesplus + event-type: new-fides-release client-payload: '{"tag": "${{ github.event.release.tag_name }}", "url": "${{ github.event.release.html_url }}"}' diff --git a/.gitignore b/.gitignore index 157fe84d09..82f6b6c40e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore + # frontend ui-build/ @@ -7,6 +9,7 @@ ui-build/ *.DS_Store *.swp *.out +*.tmp # rails specific *.sqlite3 @@ -20,7 +23,8 @@ tmp/* # docs docs/fides/site/ docs/fides/docs/api/openapi.json -docs/fides/docs/schemas/config_schema.json +docs/fidesops/docs/api/openapi.json +docs/fidesops/site # python specific *.pyc @@ -95,7 +99,6 @@ project/metals.sbt # Windows Thumbs.db -# Source for the following rules: https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -112,7 +115,6 @@ develop-eggs/ dist/ downloads/ eggs/ -.eggs/ lib/ lib64/ parts/ @@ -121,10 +123,13 @@ var/ wheels/ *egg-info/ !*egg-info/entry_points.txt # Required so that this works when mounted via docker-compose -.installed.cfg *.egg MANIFEST conda-out/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg # PyInstaller # Usually these files are written by a python script from a template @@ -157,6 +162,8 @@ coverage.xml *.log local_settings.py db.sqlite3 +db.sqlite3-journal +test.db # Flask stuff: instance/ @@ -184,12 +191,23 @@ ipython_config.py # celery beat schedule file celerybeat-schedule +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + # SageMath parsed files *.sage.py # Environments .env .venv +.env.local env/ venv/ ENV/ @@ -210,3 +228,30 @@ venv.bak/ .mypy_cache/ .dmypy.json dmypy.json + +# Pyre type checker +.pyre/ + +.idea + +# VSCode +.vscode/* + +# Congigure and save debugging details in VS Code launch.json file +!.vscode/launch.json + +*.code-workspace +.mypy_cache +docker-stack.yml +.DS_Store + +envfiles/ + +# Access request package local upload destination, generated at runtime +fides_uploads + +# Prevent SaaS configs from being committed +saas_config.toml + +# Script secrets +scripts/secrets.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b7643ad5af..192a224f4e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,34 +6,34 @@ repos: - id: docker name: docker entry: make build-local - files: "^fidesctl/" + files: "^fides/" types_or: [file, python] language: system - id: black name: black entry: make black - files: "^fidesctl/" + files: "^fides/" types_or: [file, python] language: system - id: mypy name: mypy entry: make mypy - files: "^fidesctl/" + files: "^fides/" types_or: [file, python] language: system - id: xenon name: xenon entry: make xenon - files: "^fidesctl/" + files: "^fides/" types_or: [file, python] language: system - id: pylint name: pylint entry: make pylint - files: "^fidesctl/" + files: "^fides/" types_or: [file, python] language: system diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..4d9109b9d8 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Chrome", + "request": "launch", + "type": "chrome", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}/clients/ops/admin-ui" + }, + { + "name": "Attach to Chrome", + "port": 9222, + "request": "attach", + "type": "chrome", + "urlFilter": "http://localhost:3000/*", // use urlFilter instead of url! + "webRoot": "${workspaceFolder}/clients/ops/admin-ui" + } + ] +} + + + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 48263e4cfd..8ed8b38f4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,11 @@ The types of changes are: * Changed behavior of `load_default_taxonomy` to append instead of upsert [#1040](https://github.com/ethyca/fides/pull/1040) * Changed behavior of adding privacy declarations to decouple the actions of the "add" and "next" buttons [#1086](https://github.com/ethyca/fides/pull/1086) * Moved system related UI components from the `config-wizard` directory to the `system` directory [#1097](https://github.com/ethyca/fides/pull/1097) -* Dataset fields table shows categories in the last column. [#1088](https://github.com/ethyca/fides/pull/1088) +* Updated "type" on SaaS config to be a simple string type, not an enum [#1197](https://github.com/ethyca/fides/pull/1197) + +### Developer Experience + +* Optional dependencies may have their version defined only once, in `optional-requirements.txt` [#1171](https://github.com/ethyca/fides/pull/1171) ### Docs @@ -128,12 +132,30 @@ The types of changes are: * Fixed an issue where `fides push --diff` would return a false positive diff [#1026](https://github.com/ethyca/fides/pull/1026) * Pinned pydantic version to < 1.10.0 to fix an error in finding referenced fides keys [#1045](https://github.com/ethyca/fides/pull/1045) +### Fixed + +* Fixed failing mypy tests [#1030](https://github.com/ethyca/fides/pull/1030) +* Fixed an issue where `fides push --diff` would return a false positive diff [#1026](https://github.com/ethyca/fides/pull/1026) + +### Docs + +* Minor formatting updates to [Policy Webhooks](https://ethyca.github.io/fidesops/guides/policy_webhooks/) documentation [#1114](https://github.com/ethyca/fidesops/pull/1114) + +### Removed + +* Removed create superuser [#1116](https://github.com/ethyca/fidesops/pull/1116) + ## [1.8.2](https://github.com/ethyca/fides/compare/1.8.1...1.8.2) - 2022-08-18 ### Added -* Added the ability to edit taxonomy fields via the UI [#977](https://github.com/ethyca/fides/pull/977) +* Added the ability to edit taxonomy fields via the UI [#977](https://github.com/ethyca/fides/pull/977) [#1028](https://github.com/ethyca/fides/pull/1028) * New column `is_default` added to DataCategory, DataUse, DataSubject, and DataQualifier tables [#976](https://github.com/ethyca/fides/pull/976) +* Added the ability to add taxonomy fields via the UI [#1019](https://github.com/ethyca/fides/pull/1019) +* Added the ability to delete taxonomy fields via the UI [#1006](https://github.com/ethyca/fides/pull/1006) + * Only non-default taxonomy entities can be deleted [#1023](https://github.com/ethyca/fides/pull/1023) +* Prevent deleting taxonomy `is_default` fields and from adding `is_default=True` fields via the API [#990](https://github.com/ethyca/fides/pull/990). +* Added a "Custom" tag to distinguish user defined taxonomy fields from default taxonomy fields in the UI [#1027](https://github.com/ethyca/fides/pull/1027) ### Changed @@ -339,9 +361,64 @@ The types of changes are: ### Added -* CHANGELOG.md file -* On API server startup, in-use config values are logged at the DEBUG level -* Send a usage analytics event upon execution of the `fidesctl init` command +* ESLint configuration changes [#514](https://github.com/ethyca/fidesops/pull/514) +* User creation, update and permissions in the Admin UI [#511](https://github.com/ethyca/fidesops/pull/511) +* Yaml support for dataset upload [#284](https://github.com/ethyca/fidesops/pull/284) + +### Breaking Changes + +* Update masking API to take multiple input values [#443](https://github.com/ethyca/fidesops/pull/443) + +### Docs + +* DRP feature documentation [#520](https://github.com/ethyca/fidesops/pull/520) + +## [1.4.2](https://github.com/ethyca/fidesops/compare/1.4.1...1.4.2) - 2022-05-12 + +### Added + +* GET routes for users [#405](https://github.com/ethyca/fidesops/pull/405) +* Username based search on GET route [#444](https://github.com/ethyca/fidesops/pull/444) +* FIDESOPS\_\_DEV_MODE for Easier SaaS Request Debugging [#363](https://github.com/ethyca/fidesops/pull/363) +* Track user privileges across sessions [#425](https://github.com/ethyca/fidesops/pull/425) +* Add first_name and last_name fields. Also add them along with created_at to FidesUser response [#465](https://github.com/ethyca/fidesops/pull/465) +* Denial reasons for DSR and user `AuditLog` [#463](https://github.com/ethyca/fidesops/pull/463) +* DRP action to Policy [#453](https://github.com/ethyca/fidesops/pull/453) +* `CHANGELOG.md` file[#484](https://github.com/ethyca/fidesops/pull/484) +* DRP status endpoint [#485](https://github.com/ethyca/fidesops/pull/485) +* DRP exerise endpoint [#496](https://github.com/ethyca/fidesops/pull/496) +* Frontend for privacy request denial reaons [#480](https://github.com/ethyca/fidesops/pull/480) +* Publish Fidesops to Pypi [#491](https://github.com/ethyca/fidesops/pull/491) +* DRP data rights endpoint [#526](https://github.com/ethyca/fidesops/pull/526) + +### Changed + +* Converted HTTP Status Codes to Starlette constant values [#438](https://github.com/ethyca/fidesops/pull/438) +* SaasConnector.send behavior on ignore_errors now returns raw response [#462](https://github.com/ethyca/fidesops/pull/462) +* Seed user permissions in `create_superuser.py` script [#468](https://github.com/ethyca/fidesops/pull/468) +* User API Endpoints (update fields and reset user passwords) [#471](https://github.com/ethyca/fidesops/pull/471) +* Format tests with `black` [#466](https://github.com/ethyca/fidesops/pull/466) +* Extract privacy request endpoint logic into separate service for DRP [#470](https://github.com/ethyca/fidesops/pull/470) +* Fixing inconsistent SaaS connector integration tests [#473](https://github.com/ethyca/fidesops/pull/473) +* Add user data to login response [#501](https://github.com/ethyca/fidesops/pull/501) + +### Breaking Changes + +* Update masking API to take multiple input values [#443](https://github.com/ethyca/fidesops/pull/443) + +### Docs + +* Added issue template for documentation updates [#442](https://github.com/ethyca/fidesops/pull/442) +* Clarify masking updates [#464](https://github.com/ethyca/fidesops/pull/464) +* Added dark mode [#476](https://github.com/ethyca/fidesops/pull/476) + +### Fixed + +* Removed miradb test warning [#436](https://github.com/ethyca/fidesops/pull/436) +* Added missing import [#448](https://github.com/ethyca/fidesops/pull/448) +* Removed pypi badge pointing to wrong package [#452](https://github.com/ethyca/fidesops/pull/452) +* Audit imports and references [#479](https://github.com/ethyca/fidesops/pull/479) +* Switch to using update method on PUT permission endpoint [#500](https://github.com/ethyca/fidesops/pull/500) ### Developer Experience diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 58bbf4e839..10675eac5c 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,5 +1,5 @@ -## Fides Code of Conduct +# Fides Code of Conduct -The Fides project, which includes Fideslang, Fidesops, and Fidesctl, adheres to the following [Code of Conduct](https://ethyca.github.io/fides/community/code_of_conduct/). +The Fides project, which includes fidescls and fideslang, adheres to the following [Code of Conduct](https://ethyca.github.io/fides/community/code_of_conduct/). The Fides core team welcomes any contributions and suggestions to help make the community a better place 🤝 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index baf64add5f..8b0652564a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,5 @@ -## Fides Contribution Guidelines +# Fides Contribution Guidelines -The Fides project, which includes Fideslang, Fidesops, and Fidesctl, adheres to the following [Contribution Guidelines](https://ethyca.github.io/fides/development/overview/). +The Fides project, which includes fidescls and fideslang, adheres to the following [Contribution Guidelines](https://ethyca.github.io/fides/development/overview/). The Fides core team welcomes any contributions and suggestions to help make the community a better place 🤝 diff --git a/Dockerfile b/Dockerfile index a0dedbe794..9502f9a29b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,55 +1,40 @@ -FROM --platform=linux/amd64 python:3.9-slim-bullseye as base - -# Update pip in the base image since we'll use it everywhere -RUN pip install -U pip - -#################### -## Build frontend ## -#################### +# Pin to 3.10.6 to avoid a mypy error in 3.10.7 +# If you update this, also update `DEFAULT_PYTHON_VERSION` +# in the GitHub workflow files +ARG PYTHON_VERSION=3.10.6 + +############## +## Frontend ## +############## FROM node:16 as frontend -WORKDIR /fides/clients/ctl/admin-ui - -# install node modules -COPY clients/ctl/admin-ui/ . +# Build the admin-io frontend +WORKDIR /fides/clients/admin-ui +COPY clients/admin-ui/ . RUN npm install - -# Build the frontend static files RUN npm run export -####################### -## Tool Installation ## -####################### +############# +## Backend ## +############# +FROM --platform=linux/amd64 python:${PYTHON_VERSION}-slim-bullseye as backend -FROM base as builder - -RUN : \ - && apt-get update \ - && apt-get install \ - -y --no-install-recommends \ - curl \ +# Install auxiliary software +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ git \ + make \ vim \ + curl \ g++ \ gnupg \ gcc \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -########################### -## Database Dependencies ## -########################### - -# Postgres -RUN : \ - && apt-get update \ - && apt-get install \ - -y --no-install-recommends \ - libpq-dev \ + python3-wheel \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # SQL Server (MS SQL) +# https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15 RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl https://packages.microsoft.com/config/debian/11/prod.list | tee /etc/apt/sources.list.d/msprod.list ENV ACCEPT_EULA=y DEBIAN_FRONTEND=noninteractive @@ -67,53 +52,49 @@ RUN : \ ## Python Dependencies ## ######################### -COPY dev-requirements.txt dev-requirements.txt -RUN pip install -r dev-requirements.txt +COPY optional-requirements.txt . +RUN pip install -U pip --no-cache-dir install -r optional-requirements.txt -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt +COPY dev-requirements.txt . +RUN pip install -U pip --no-cache-dir install -r dev-requirements.txt -COPY optional-requirements.txt optional-requirements.txt -RUN pip install -r optional-requirements.txt +COPY requirements.txt . +RUN pip install -U pip --no-cache-dir install -r requirements.txt ############################### ## General Application Setup ## ############################### - COPY . /fides WORKDIR /fides +# Immediately flush to stdout, globally +ENV PYTHONUNBUFFERED=TRUE + # Reset the busted git cache RUN git rm --cached -r . RUN git reset --hard -# Immediately flush to stdout, globally -ENV PYTHONUNBUFFERED=TRUE - # Enable detection of running within Docker -ENV RUNNING_IN_DOCKER=TRUE +ENV RUNNING_IN_DOCKER=true EXPOSE 8080 -CMD ["fidesctl", "webserver"] - -################################### -## Application Development Setup ## -################################### +CMD [ "fides", "webserver" ] -FROM builder as dev +############################# +## Development Application ## +############################# +FROM backend as dev -# Install fidesctl as a symlink -RUN pip install --no-deps -e ".[all,mssql]" +RUN pip install -e . -################################## -## Production Application Setup ## -################################## - -FROM builder as prod - -# Copy frontend build over in order to be available in wheel package -COPY --from=frontend /fides/clients/ctl/admin-ui/out/ /fides/src/fidesctl/ui-build/static/admin/ +############################# +## Production Application ## +############################# +FROM backend as prod # Install without a symlink -RUN python setup.py bdist_wheel -RUN pip install --no-deps dist/fidesctl-*.whl +RUN python setup.py sdist +RUN pip install dist/ethyca-fides-*.tar.gz + +# Copy frontend build over +COPY --from=frontend /fides/clients/admin-ui/out/ /fides/src/fides/ui-build/static/admin diff --git a/MANIFEST.in b/MANIFEST.in index ded2c31711..1f62a87c7d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,16 @@ include LICENSE +include README.md include requirements.txt include dev-requirements.txt +include optional-requirements.txt include versioneer.py -include src/fidesctl/api/ctl/alembic.ini -include src/fidesctl/templates/fides_datamap_template.xlsx -recursive-include src/fidesctl/ui-build * \ No newline at end of file +include src/fides/api/ctl/alembic.ini +include src/fides/_version.py +include src/fides/py.typed +include src/fides/templates/fides_datamap_template.xlsx + +recursive-include src/fides/ui-build * + +graft src/fides/api/ops/email_templates/templates + +global-exclude *.pyc diff --git a/README.md b/README.md index 41e286abe0..0e8a224831 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Meet Fidesctl: Privacy Policies as Code +# Meet Fides: Privacy Policies as Code [![Latest Release Version][release-image]][release-url] [![Docker][docker-workflow-image]][docker-actions-url] @@ -47,7 +47,7 @@ This guide will walk through generating a mock RoPA using predefined resources i Once you see the `fides#` prompt (takes ~3 minutes the first time), you can run the next command: ``` - fidesctl init + fides init ``` This builds the required images, spins up the database, and runs the initialization scripts. @@ -55,19 +55,19 @@ This guide will walk through generating a mock RoPA using predefined resources i 3. Use the `export datamap` command to generate a [data map](/docs/fides/docs/guides/generating_datamap.md) of the provided [demo resources](demo_resources/): ```sh - fidesctl push demo_resources/ - fidesctl export datamap --output-dir demo_resources/ + fides push demo_resources/ + fides export datamap --output-dir demo_resources/ ``` This will `push` the provided demo resources, and `export` an `.xlsx` file of their contents to the `demo_resources/` directory. 4. View the newly-generated data map generated from the provided resources. - #### **Controller** +#### **Controller** The header block at the top of the data map is composed of properties found in the [Organization resource](/demo_resources/demo_organization.yml). In a production deployment, this would be composed of publicly available information for your company or organization. - #### **Article 30 Record of Processing Activities** +#### **Article 30 Record of Processing Activities** The remainder of the information on the data map is generated from the provided [configuration resources](https://ethyca.github.io/fides/language/resources/system). In a production environment, these could be [automatically generated](https://ethyca.github.io/fides/guides/generate_resources/) from your databases and system resources. @@ -152,8 +152,8 @@ Read about the [Fides community](https://ethyca.github.io/fides/community/hints_ ## :balance_scale: License -The Fides ecosystem of tools ([Fidesops](https://github.com/ethyca/fidesops) and [Fidesctl](https://github.com/ethyca/fides)) are licensed under the [Apache Software License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). -Fides tools are built on [Fideslang](https://github.com/ethyca/privacy-taxonomy), the Fides language specification, which is licensed under [CC by 4](https://github.com/ethyca/privacy-taxonomy/blob/main/LICENSE). +The Fides ecosystem of tools ([Fides](https://github.com/ethyca/fides) and [fidescls](https://github.com/ethyca/fidescls)) are licensed under the [Apache Software License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). +Fides tools are built on [fideslang](https://github.com/ethyca/privacy-taxonomy), the Fides language specification, which is licensed under [CC by 4](https://github.com/ethyca/privacy-taxonomy/blob/main/LICENSE). Fides is created and sponsored by Ethyca: a developer tools company building the trust infrastructure of the internet. If you have questions or need assistance getting started, let us know at fides@ethyca.com! diff --git a/clients/ctl/admin-ui/.babelrc b/clients/admin-ui/.babelrc similarity index 100% rename from clients/ctl/admin-ui/.babelrc rename to clients/admin-ui/.babelrc diff --git a/clients/ctl/admin-ui/.env.development b/clients/admin-ui/.env.development similarity index 65% rename from clients/ctl/admin-ui/.env.development rename to clients/admin-ui/.env.development index 7d83fda2ad..160c4e57e7 100644 --- a/clients/ctl/admin-ui/.env.development +++ b/clients/admin-ui/.env.development @@ -1,2 +1,3 @@ +NEXT_PUBLIC_FIDESOPS_API=http://0.0.0.0:8080 NEXT_PUBLIC_FIDESCTL_API=/api/v1 NEXT_PUBLIC_FIDESCTL_API_SERVER=http://0.0.0.0:8080 diff --git a/clients/ctl/admin-ui/.env.production b/clients/admin-ui/.env.production similarity index 100% rename from clients/ctl/admin-ui/.env.production rename to clients/admin-ui/.env.production diff --git a/clients/admin-ui/.eslintignore b/clients/admin-ui/.eslintignore new file mode 100644 index 0000000000..acaeb30a90 --- /dev/null +++ b/clients/admin-ui/.eslintignore @@ -0,0 +1,5 @@ +node_modules +dist +.eslintrc.json +next.config.js +jest.config.js \ No newline at end of file diff --git a/clients/ctl/admin-ui/.eslintrc.json b/clients/admin-ui/.eslintrc.json similarity index 84% rename from clients/ctl/admin-ui/.eslintrc.json rename to clients/admin-ui/.eslintrc.json index 33ea3b8ca6..4ad04f5aa8 100644 --- a/clients/ctl/admin-ui/.eslintrc.json +++ b/clients/admin-ui/.eslintrc.json @@ -8,7 +8,8 @@ "plugins": ["simple-import-sort"], "root": true, "parserOptions": { - "project": "./tsconfig.json" + "project": "tsconfig.json", + "tsconfigRootDir": "./" }, "rules": { // causes bug in re-exporting default exports, see @@ -23,14 +24,10 @@ "react/jsx-filename-extension": [ 1, { - "extensions": [ - ".tsx" - ] + "extensions": [".tsx"] } ], - "react/jsx-props-no-spreading": [ - 0 - ], + "react/jsx-props-no-spreading": [0], "simple-import-sort/imports": "error", "simple-import-sort/exports": "error", // since we are using static site export @@ -42,12 +39,10 @@ "error", { "props": true, - "ignorePropertyModificationsForRegex": [ - "^draft" - ] + "ignorePropertyModificationsForRegex": ["^draft"] } ], // Default exports are slightly preferred for component files, but this rule has too many false positives. "import/prefer-default-export": "off" } -} \ No newline at end of file +} diff --git a/clients/ctl/admin-ui/.gitignore b/clients/admin-ui/.gitignore similarity index 99% rename from clients/ctl/admin-ui/.gitignore rename to clients/admin-ui/.gitignore index 4e6c1c97e6..1ab82d7892 100644 --- a/clients/ctl/admin-ui/.gitignore +++ b/clients/admin-ui/.gitignore @@ -107,3 +107,6 @@ dist # msw web worker script public/mockServiceWorker.js + + +out/ \ No newline at end of file diff --git a/clients/admin-ui/.prettierignore b/clients/admin-ui/.prettierignore new file mode 100644 index 0000000000..36fcd514b4 --- /dev/null +++ b/clients/admin-ui/.prettierignore @@ -0,0 +1,4 @@ +.idea/ +.next/ +node_modules/ +out/ \ No newline at end of file diff --git a/clients/admin-ui/.prettierrc.json b/clients/admin-ui/.prettierrc.json new file mode 100644 index 0000000000..805e2f196e --- /dev/null +++ b/clients/admin-ui/.prettierrc.json @@ -0,0 +1,4 @@ +{ + "tabWidth": 2, + "endOfLine": "lf" +} diff --git a/clients/ctl/admin-ui/LICENSE b/clients/admin-ui/LICENSE similarity index 100% rename from clients/ctl/admin-ui/LICENSE rename to clients/admin-ui/LICENSE diff --git a/clients/admin-ui/README.md b/clients/admin-ui/README.md new file mode 100644 index 0000000000..d1e70d6820 --- /dev/null +++ b/clients/admin-ui/README.md @@ -0,0 +1,54 @@ +# Admin UI + +Admin UI for managing Fides privacy requests. A web application built in Next.js with the FidesUI component library. + +## Running Locally + +1. Run `nox -s create_user` and follow prompts to create a user. Note that password requires 8 or more characters, upper and lowercase chars, a number, and a symbol. +2. In a new shell, `cd` into `clients/ops/admin-ui`, then run `npm run dev`. +3. Nav to `http://localhost:3000/` and logged in using created user. The `email` field is simply the `user` that was created, not a valid email address. + +## Testing Entire Request Flow + +1. Run the fides server with `nox -s dev`. +2. Create a policy key through the API (using the Postman collection). +3. Configure the `clients/privacy-center` application to use that policy by adding it to the appropriate request config in `config/config.json`. +4. Run the Privacy Request center using `npm run dev`. +5. Submit a privacy request through the Privacy Request center. +6. View that request in the Admin UI and either approve or deny it. + +## Unit test locations + +Unless otherwise specified below, all unit tests should be colocated in the directory with the file(s) they are testing, in a `__tests__` subfolder. + +The sole exception to this is the `pages` directory. Tests for Next.js pages live in the root `__tests__/pages` directory. Otherwise, Next.js attempts to include them in final build output, which breaks the build. + +## Feature flags +During the software development process, one or more features may not be visible at runtime. To toggle a given feature, find the given feature flag `name` key located in the [flags.json](/clients/admin-ui/srcgs.json) file. Update the `isActive` key value to `true/false`. If `true`, feature will be visible at runtime. Otherwise, feature will not be visible at runtime. + +For techinical reference implementation, please reference [react-feature-flags](https://github.com/romaindso/react-feature-flags). + + + + + + +# FidesCtl Readme +# Admin UI + +Admin UI for managing Fidesctl. + +## Running Locally + +1. Run `nox -s dev` in top-level `fides` directory +1. Navigate to `http://localhost:3000/`. + +## Preparing for production + +To view a production version of this site, including the backend: + +1. Run `npm prod-export`. This will + 1. Export the static site to `out/` + 1. Copy the build from `out/` to the folder in the backend which will serve static assets at `/` +1. Run `nox -s api` in the top-level `fides` directory. +1. Navigate to `http://localhost:8000` diff --git a/clients/ctl/admin-ui/__tests__/checkbox-tree.test.tsx b/clients/admin-ui/__tests__/checkbox-tree.test.tsx similarity index 100% rename from clients/ctl/admin-ui/__tests__/checkbox-tree.test.tsx rename to clients/admin-ui/__tests__/checkbox-tree.test.tsx diff --git a/clients/ctl/admin-ui/__tests__/features/common/zones/config.test.ts b/clients/admin-ui/__tests__/features/common/zones/config.test.ts similarity index 100% rename from clients/ctl/admin-ui/__tests__/features/common/zones/config.test.ts rename to clients/admin-ui/__tests__/features/common/zones/config.test.ts diff --git a/clients/ctl/admin-ui/__tests__/features/dataset-helpers.test.tsx b/clients/admin-ui/__tests__/features/dataset-helpers.test.tsx similarity index 100% rename from clients/ctl/admin-ui/__tests__/features/dataset-helpers.test.tsx rename to clients/admin-ui/__tests__/features/dataset-helpers.test.tsx diff --git a/clients/ctl/admin-ui/__tests__/features/taxonomy-helpers.test.tsx b/clients/admin-ui/__tests__/features/taxonomy-helpers.test.tsx similarity index 100% rename from clients/ctl/admin-ui/__tests__/features/taxonomy-helpers.test.tsx rename to clients/admin-ui/__tests__/features/taxonomy-helpers.test.tsx diff --git a/clients/ctl/admin-ui/__tests__/features/taxonomy-transform.test.tsx b/clients/admin-ui/__tests__/features/taxonomy-transform.test.tsx similarity index 100% rename from clients/ctl/admin-ui/__tests__/features/taxonomy-transform.test.tsx rename to clients/admin-ui/__tests__/features/taxonomy-transform.test.tsx diff --git a/clients/admin-ui/__tests__/index.test.tsx b/clients/admin-ui/__tests__/index.test.tsx new file mode 100644 index 0000000000..f1b3cd9286 --- /dev/null +++ b/clients/admin-ui/__tests__/index.test.tsx @@ -0,0 +1,34 @@ +import Home from "../src/pages"; +import { mockNextUseRouter, render, screen } from "./test-utils"; + +describe("Home", () => { + it("renders the Subject Requests page by default when logged in", () => { + mockNextUseRouter({ route: "/" }); + render(, { + preloadedState: { + auth: { + user: { + username: "Test", + }, + token: "valid-token", + }, + }, + }); + + const message = screen.getAllByText("Subject Requests")[0]; + expect(message).toBeInTheDocument(); + }); + + // TODO: Either update or remove this test. We no longer use the SessionProvider from next/auth + // skip until this is fixed in fidesops + // it.skip("renders a logged out notification when no session is present", () => { + // render( + // + // + // + // ); + // + // const message = screen.getByText("You are not logged in."); + // expect(message).toBeInTheDocument(); + // }); +}); diff --git a/clients/ctl/admin-ui/__tests__/jest.setup.ts b/clients/admin-ui/__tests__/jest.setup.ts similarity index 100% rename from clients/ctl/admin-ui/__tests__/jest.setup.ts rename to clients/admin-ui/__tests__/jest.setup.ts diff --git a/clients/admin-ui/__tests__/pages/datastore-connection/index.test.tsx b/clients/admin-ui/__tests__/pages/datastore-connection/index.test.tsx new file mode 100644 index 0000000000..a2abfd9f02 --- /dev/null +++ b/clients/admin-ui/__tests__/pages/datastore-connection/index.test.tsx @@ -0,0 +1,68 @@ +import { rest } from "msw"; +import { setupServer } from "msw/node"; + +import { + BASE_URL, + CONNECTION_ROUTE, + DATASTORE_CONNECTION_ROUTE, + LOGIN_ROUTE, +} from "../../../src/constants"; +import DatastoreConnection from "../../../src/pages/datastore-connection"; +import { act, render, waitFor } from "../../test-utils"; + +const useRouter = jest.spyOn(require("next/router"), "useRouter"); + +afterAll(() => { + useRouter.mockRestore(); +}); + +describe(`${DATASTORE_CONNECTION_ROUTE}`, () => { + describe("Auth behavior", () => { + it("Should redirect to LoginPage when user isn't logged in.", async () => { + const push = jest.fn(); + useRouter.mockImplementation(() => ({ + push, + })); + + await act(async () => { + render(); + }); + + await waitFor(() => expect(push).toHaveBeenCalledTimes(1)); + expect(push).toHaveBeenCalledWith(LOGIN_ROUTE); + }); + + it.skip(`Should stay on DatastoreConnectionPage when the user is already logged in`, async () => { + await act(async () => { + const push = jest.fn(); + + useRouter.mockImplementation(() => ({ + pathname: "", + push, + prefetch: jest.fn(() => Promise.resolve()), + })); + const server = setupServer( + rest.get(`${BASE_URL}${CONNECTION_ROUTE}`, (req, res) => res()) + ); + + server.listen(); + + await act(async () => { + render(, { + preloadedState: { + auth: { + user: { + username: "Test User", + }, + token: "valid-token", + }, + }, + }); + }); + + expect(push).toHaveBeenCalledTimes(0); + server.close(); + }); + }); + }); +}); diff --git a/clients/admin-ui/__tests__/pages/login.test.tsx b/clients/admin-ui/__tests__/pages/login.test.tsx new file mode 100644 index 0000000000..40bcc4e89c --- /dev/null +++ b/clients/admin-ui/__tests__/pages/login.test.tsx @@ -0,0 +1,86 @@ +import { rest } from "msw"; +import { setupServer } from "msw/node"; + +import { BASE_API_URN, INDEX_ROUTE } from "../../src/constants"; +import LoginPage from "../../src/pages/login"; +import { act, fireEvent, render, screen, waitFor } from "../test-utils"; + +const useRouter = jest.spyOn(require("next/router"), "useRouter"); + +afterAll(() => { + useRouter.mockRestore(); +}); + +describe("/login", () => { + it("Should redirect when the user logs in successfully", async () => { + const server = setupServer( + rest.post(`${BASE_API_URN}/login`, (req, res, ctx) => + res( + ctx.json({ + user_data: { + username: "Test", + }, + token_data: { + access_token: "test-access-token", + }, + }) + ) + ) + ); + + server.listen(); + + const push = jest.fn(); + useRouter.mockImplementation(() => ({ + push, + })); + + await act(async () => { + render(); + }); + + expect(push).toBeCalledTimes(0); + + const email = screen.getByRole("textbox", { name: /email/i }); + const passwordInput = screen.getByLabelText(/password/i); + const loginButton = screen.getByRole("button"); + + await act(async () => { + await fireEvent.change(email, { target: { value: "test-user" } }); + await fireEvent.change(passwordInput, { + target: { value: "test-user-password" }, + }); + await fireEvent.submit(loginButton); + }); + + await waitFor(() => expect(push).toHaveBeenCalledTimes(1)); + expect(push).toHaveBeenCalledWith(INDEX_ROUTE); + + server.close(); + }); + + it(`Should redirect to "${INDEX_ROUTE}" when the user is already logged in`, async () => { + await act(async () => { + const push = jest.fn(); + useRouter.mockImplementation(() => ({ + push, + })); + + await act(async () => { + render(, { + preloadedState: { + auth: { + user: { + username: "Test User", + }, + token: "valid-token", + }, + }, + }); + }); + + expect(push).toHaveBeenCalledWith(INDEX_ROUTE); + expect(push).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/clients/admin-ui/__tests__/test-utils.tsx b/clients/admin-ui/__tests__/test-utils.tsx new file mode 100644 index 0000000000..08342d738a --- /dev/null +++ b/clients/admin-ui/__tests__/test-utils.tsx @@ -0,0 +1,59 @@ +// test-utils.jsx +import { Store } from "@reduxjs/toolkit"; +import { render as rtlRender, RenderOptions } from "@testing-library/react"; +import React from "react"; +import { Provider } from "react-redux"; + +import { makeStore, RootState } from "~/app/store"; + +type CustomRenderOptions = { + preloadedState?: Partial; + customStore?: Store; +} & RenderOptions; + +function render( + ui: React.ReactElement>, + { + preloadedState, + customStore = makeStore(preloadedState), + ...renderOptions + }: CustomRenderOptions = {} +) { + const Wrapper: React.FC = ({ children }) => ( + {children} + ); + return rtlRender(ui, { wrapper: Wrapper, ...renderOptions }); +} + +// re-export everything +export * from "@testing-library/react"; + +// override render method +export { render }; + +// Mocks useRouter +const useRouter = jest.spyOn(require("next/router"), "useRouter"); + +/** + * mockNextUseRouter + * Mocks the useRouter React hook from Next.js on a test-case by test-case basis + * Adapted from https://github.com/vercel/next.js/issues/7479#issuecomment-587145429 + */ +export function mockNextUseRouter({ + route = "/", + pathname = "/", + query = "/", + asPath = "/", +}: { + route?: string; + pathname?: string; + query?: string; + asPath?: string; +}) { + useRouter.mockImplementation(() => ({ + route, + pathname, + query, + asPath, + })); +} diff --git a/clients/ctl/admin-ui/cypress.config.ts b/clients/admin-ui/cypress.config.ts similarity index 100% rename from clients/ctl/admin-ui/cypress.config.ts rename to clients/admin-ui/cypress.config.ts diff --git a/clients/ctl/admin-ui/cypress/.eslintrc.json b/clients/admin-ui/cypress/.eslintrc.json similarity index 100% rename from clients/ctl/admin-ui/cypress/.eslintrc.json rename to clients/admin-ui/cypress/.eslintrc.json diff --git a/clients/ctl/admin-ui/cypress/.gitignore b/clients/admin-ui/cypress/.gitignore similarity index 100% rename from clients/ctl/admin-ui/cypress/.gitignore rename to clients/admin-ui/cypress/.gitignore diff --git a/clients/ctl/admin-ui/cypress/e2e/config-wizard.cy.ts b/clients/admin-ui/cypress/e2e/config-wizard.cy.ts similarity index 100% rename from clients/ctl/admin-ui/cypress/e2e/config-wizard.cy.ts rename to clients/admin-ui/cypress/e2e/config-wizard.cy.ts diff --git a/clients/ctl/admin-ui/cypress/e2e/datasets-classify.cy.ts b/clients/admin-ui/cypress/e2e/datasets-classify.cy.ts similarity index 100% rename from clients/ctl/admin-ui/cypress/e2e/datasets-classify.cy.ts rename to clients/admin-ui/cypress/e2e/datasets-classify.cy.ts diff --git a/clients/ctl/admin-ui/cypress/e2e/datasets.cy.ts b/clients/admin-ui/cypress/e2e/datasets.cy.ts similarity index 99% rename from clients/ctl/admin-ui/cypress/e2e/datasets.cy.ts rename to clients/admin-ui/cypress/e2e/datasets.cy.ts index fc32f217a4..e371a00442 100644 --- a/clients/ctl/admin-ui/cypress/e2e/datasets.cy.ts +++ b/clients/admin-ui/cypress/e2e/datasets.cy.ts @@ -5,6 +5,10 @@ import { } from "cypress/support/stubs"; describe("Dataset", () => { + before(() => { + cy.login(); + }); + beforeEach(() => { stubDatasetCrud(); // Ensure these tests all run with Plus features disabled. diff --git a/clients/ctl/admin-ui/cypress/e2e/nav-bar.cy.ts b/clients/admin-ui/cypress/e2e/nav-bar.cy.ts similarity index 81% rename from clients/ctl/admin-ui/cypress/e2e/nav-bar.cy.ts rename to clients/admin-ui/cypress/e2e/nav-bar.cy.ts index 72d93f19bb..979bf6caf1 100644 --- a/clients/ctl/admin-ui/cypress/e2e/nav-bar.cy.ts +++ b/clients/admin-ui/cypress/e2e/nav-bar.cy.ts @@ -1,12 +1,17 @@ describe("Nav Bar", () => { + before(() => { + cy.login(); + }); + it("Renders all page links", () => { cy.visit("/"); - // Enabled links + cy.getByTestId("nav-link-Subject Requests"); + cy.getByTestId("nav-link-Datastore Connections"); + cy.getByTestId("nav-link-User Management"); cy.getByTestId("nav-link-Datasets"); cy.getByTestId("nav-link-Taxonomy"); cy.getByTestId("nav-link-Systems"); - }); it("Renders the active page based on the current route", () => { diff --git a/clients/ctl/admin-ui/cypress/e2e/systems.cy.ts b/clients/admin-ui/cypress/e2e/systems.cy.ts similarity index 99% rename from clients/ctl/admin-ui/cypress/e2e/systems.cy.ts rename to clients/admin-ui/cypress/e2e/systems.cy.ts index fa058e2811..b7bf993c12 100644 --- a/clients/ctl/admin-ui/cypress/e2e/systems.cy.ts +++ b/clients/admin-ui/cypress/e2e/systems.cy.ts @@ -1,6 +1,9 @@ import { stubSystemCrud, stubTaxonomyEntities } from "../support/stubs"; describe("System management page", () => { + before(() => { + cy.login(); + }); beforeEach(() => { cy.intercept("GET", "/api/v1/system", { fixture: "systems.json" }).as( "getSystems" diff --git a/clients/ctl/admin-ui/cypress/e2e/taxonomy.cy.ts b/clients/admin-ui/cypress/e2e/taxonomy.cy.ts similarity index 99% rename from clients/ctl/admin-ui/cypress/e2e/taxonomy.cy.ts rename to clients/admin-ui/cypress/e2e/taxonomy.cy.ts index 05209a6a53..2a4820f2e8 100644 --- a/clients/ctl/admin-ui/cypress/e2e/taxonomy.cy.ts +++ b/clients/admin-ui/cypress/e2e/taxonomy.cy.ts @@ -1,4 +1,8 @@ describe("Taxonomy management page", () => { + before(() => { + cy.login(); + }); + beforeEach(() => { cy.intercept("GET", "/api/v1/data_category", { fixture: "data_categories.json", diff --git a/clients/admin-ui/cypress/fixtures/classification/create.json b/clients/admin-ui/cypress/fixtures/classification/create.json new file mode 100644 index 0000000000..0ef5a016e1 --- /dev/null +++ b/clients/admin-ui/cypress/fixtures/classification/create.json @@ -0,0 +1,5 @@ +{ + "id": "classification-response", + "fides_key": "demo_users_dataset", + "status": "processing" +} diff --git a/clients/admin-ui/cypress/fixtures/classification/list.json b/clients/admin-ui/cypress/fixtures/classification/list.json new file mode 100644 index 0000000000..027ea4bca8 --- /dev/null +++ b/clients/admin-ui/cypress/fixtures/classification/list.json @@ -0,0 +1,45 @@ +[ + { + "id": "2", + "fides_key": "demo_users_dataset_2", + "status": "processing" + }, + { + "id": "3", + "fides_key": "demo_users_dataset_3", + "status": "review", + "classification": { + "data_categories": ["user"], + "collections": [ + { + "name": "users", + "fields": [ + { + "name": "device", + "data_categories": ["user.device"] + } + ] + } + ] + } + }, + { + "id": "4", + "fides_key": "demo_users_dataset_4", + "status": "classified", + "classification": { + "data_categories": ["user"], + "collections": [ + { + "name": "users", + "fields": [ + { + "name": "device", + "data_categories": ["user.device"] + } + ] + } + ] + } + } +] diff --git a/clients/ctl/admin-ui/cypress/fixtures/classify/create.json b/clients/admin-ui/cypress/fixtures/classify/create.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/classify/create.json rename to clients/admin-ui/cypress/fixtures/classify/create.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/classify/dataset-in-review.json b/clients/admin-ui/cypress/fixtures/classify/dataset-in-review.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/classify/dataset-in-review.json rename to clients/admin-ui/cypress/fixtures/classify/dataset-in-review.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/classify/get-in-review.json b/clients/admin-ui/cypress/fixtures/classify/get-in-review.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/classify/get-in-review.json rename to clients/admin-ui/cypress/fixtures/classify/get-in-review.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/classify/list.json b/clients/admin-ui/cypress/fixtures/classify/list.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/classify/list.json rename to clients/admin-ui/cypress/fixtures/classify/list.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/classify/update.json b/clients/admin-ui/cypress/fixtures/classify/update.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/classify/update.json rename to clients/admin-ui/cypress/fixtures/classify/update.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/data_categories.json b/clients/admin-ui/cypress/fixtures/data_categories.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/data_categories.json rename to clients/admin-ui/cypress/fixtures/data_categories.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/data_qualifiers.json b/clients/admin-ui/cypress/fixtures/data_qualifiers.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/data_qualifiers.json rename to clients/admin-ui/cypress/fixtures/data_qualifiers.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/data_subjects.json b/clients/admin-ui/cypress/fixtures/data_subjects.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/data_subjects.json rename to clients/admin-ui/cypress/fixtures/data_subjects.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/data_uses.json b/clients/admin-ui/cypress/fixtures/data_uses.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/data_uses.json rename to clients/admin-ui/cypress/fixtures/data_uses.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/dataset.json b/clients/admin-ui/cypress/fixtures/dataset.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/dataset.json rename to clients/admin-ui/cypress/fixtures/dataset.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/datasets.json b/clients/admin-ui/cypress/fixtures/datasets.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/datasets.json rename to clients/admin-ui/cypress/fixtures/datasets.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/generate/dataset.json b/clients/admin-ui/cypress/fixtures/generate/dataset.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/generate/dataset.json rename to clients/admin-ui/cypress/fixtures/generate/dataset.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/generate/system.json b/clients/admin-ui/cypress/fixtures/generate/system.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/generate/system.json rename to clients/admin-ui/cypress/fixtures/generate/system.json diff --git a/clients/admin-ui/cypress/fixtures/login.json b/clients/admin-ui/cypress/fixtures/login.json new file mode 100644 index 0000000000..d6db3817b0 --- /dev/null +++ b/clients/admin-ui/cypress/fixtures/login.json @@ -0,0 +1,12 @@ +{ + "user_data": { + "id": "123", + "username": "cypress-user@ethyca.com", + "created_at": "2022-09-28T16:15:30.994Z", + "first_name": "Cypress", + "last_name": "User" + }, + "token_data": { + "access_token": "super_secret" + } +} diff --git a/clients/ctl/admin-ui/cypress/fixtures/organization.json b/clients/admin-ui/cypress/fixtures/organization.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/organization.json rename to clients/admin-ui/cypress/fixtures/organization.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/system.json b/clients/admin-ui/cypress/fixtures/system.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/system.json rename to clients/admin-ui/cypress/fixtures/system.json diff --git a/clients/ctl/admin-ui/cypress/fixtures/systems.json b/clients/admin-ui/cypress/fixtures/systems.json similarity index 100% rename from clients/ctl/admin-ui/cypress/fixtures/systems.json rename to clients/admin-ui/cypress/fixtures/systems.json diff --git a/clients/ctl/admin-ui/cypress/support/commands.ts b/clients/admin-ui/cypress/support/commands.ts similarity index 61% rename from clients/ctl/admin-ui/cypress/support/commands.ts rename to clients/admin-ui/cypress/support/commands.ts index f3ff1d1212..0be9973e73 100644 --- a/clients/ctl/admin-ui/cypress/support/commands.ts +++ b/clients/admin-ui/cypress/support/commands.ts @@ -1,9 +1,24 @@ /// +import { STORAGE_ROOT_KEY } from "~/constants"; + Cypress.Commands.add("getByTestId", (selector, ...args) => cy.get(`[data-testid='${selector}']`, ...args) ); +Cypress.Commands.add("login", () => { + cy.fixture("login.json").then((body) => { + const authState = { + user_data: body.user_data, + token: body.token_data.access_token, + }; + window.localStorage.setItem( + STORAGE_ROOT_KEY, + JSON.stringify(authState) + ); + }); +}); + declare global { namespace Cypress { interface Chainable { @@ -20,6 +35,10 @@ declare global { Cypress.Shadow > ): Chainable>; + /** + * Programmatically login with a mock user + */ + login(): void; } } } diff --git a/clients/ctl/admin-ui/cypress/support/component-index.html b/clients/admin-ui/cypress/support/component-index.html similarity index 100% rename from clients/ctl/admin-ui/cypress/support/component-index.html rename to clients/admin-ui/cypress/support/component-index.html diff --git a/clients/ctl/admin-ui/cypress/support/component.ts b/clients/admin-ui/cypress/support/component.ts similarity index 100% rename from clients/ctl/admin-ui/cypress/support/component.ts rename to clients/admin-ui/cypress/support/component.ts diff --git a/clients/ctl/admin-ui/cypress/support/e2e.ts b/clients/admin-ui/cypress/support/e2e.ts similarity index 100% rename from clients/ctl/admin-ui/cypress/support/e2e.ts rename to clients/admin-ui/cypress/support/e2e.ts diff --git a/clients/ctl/admin-ui/cypress/support/stubs.ts b/clients/admin-ui/cypress/support/stubs.ts similarity index 100% rename from clients/ctl/admin-ui/cypress/support/stubs.ts rename to clients/admin-ui/cypress/support/stubs.ts diff --git a/clients/ctl/admin-ui/cypress/tsconfig.json b/clients/admin-ui/cypress/tsconfig.json similarity index 100% rename from clients/ctl/admin-ui/cypress/tsconfig.json rename to clients/admin-ui/cypress/tsconfig.json diff --git a/clients/ctl/admin-ui/jest.config.js b/clients/admin-ui/jest.config.js similarity index 74% rename from clients/ctl/admin-ui/jest.config.js rename to clients/admin-ui/jest.config.js index 515f0f6706..25d18dfc93 100644 --- a/clients/ctl/admin-ui/jest.config.js +++ b/clients/admin-ui/jest.config.js @@ -19,6 +19,13 @@ module.exports = { // Handle module aliases "^@/components/(.*)$": "/components/$1", + "^common/(.*)$": "/src/features/common/$1", + "^connection-type/(.*)$": "/src/features/connection-type/$1", + "^datastore-connections/(.*)$": + "/src/features/datastore-connections/$1", + "^privacy-requests/(.*)$": "/src/features/privacy-requests/$1", + "^subject-request/(.*)$": "/src/features/subject-request/$1", + "^user-management/(.*)$": "/src/features/user-management/$1", "^~/(.*)$": "/src/$1", }, // Add more setup options before each test is run @@ -27,6 +34,7 @@ module.exports = { "/node_modules/", "/.next/", "jest.setup.ts", + "test-utils.tsx", ], testEnvironment: "jsdom", transform: { diff --git a/clients/ctl/admin-ui/next-env.d.ts b/clients/admin-ui/next-env.d.ts similarity index 100% rename from clients/ctl/admin-ui/next-env.d.ts rename to clients/admin-ui/next-env.d.ts diff --git a/clients/admin-ui/next.config.js b/clients/admin-ui/next.config.js new file mode 100644 index 0000000000..5913b8d4cd --- /dev/null +++ b/clients/admin-ui/next.config.js @@ -0,0 +1,42 @@ +const path = require("path"); + +/** @type {import("next").NextConfig} */ +const withBundleAnalyzer = require("@next/bundle-analyzer")({ + enabled: process.env.ANALYZE === "true", +}); + +const nextConfig = { + reactStrictMode: true, + webpack(config) { + Object.assign(config.resolve.alias, { + react: path.resolve(__dirname, "node_modules", "react"), + "react-dom": path.resolve(__dirname, "node_modules", "react-dom"), + "@emotion/react": path.resolve( + __dirname, + "node_modules", + "@emotion/react" + ), + }); + + return config; + }, + async rewrites() { + // these paths are unnecessarily complicated due to our backend being + // picky about trailing slashes https://github.com/ethyca/fides/issues/690 + return [ + { + source: `/api/v1/:path`, + destination: `${process.env.NEXT_PUBLIC_FIDESCTL_API_SERVER}/api/v1/:path/`, + }, + { + source: `/api/v1/:first/:second*`, + destination: `${process.env.NEXT_PUBLIC_FIDESCTL_API_SERVER}/api/v1/:first/:second*`, + }, + ] + }, + images: { + loader: "custom", + }, +}; + +module.exports = withBundleAnalyzer(nextConfig); diff --git a/clients/ctl/admin-ui/package-lock.json b/clients/admin-ui/package-lock.json similarity index 91% rename from clients/ctl/admin-ui/package-lock.json rename to clients/admin-ui/package-lock.json index 83c4f67177..901a4d6d2f 100644 --- a/clients/ctl/admin-ui/package-lock.json +++ b/clients/admin-ui/package-lock.json @@ -1,23 +1,24 @@ { - "name": "ctl-admin-ui", + "name": "admin-ui", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "ctl-admin-ui", + "name": "admin-ui", "dependencies": { + "@chakra-ui/icons": "^1.1.7", "@chakra-ui/react": "^1.8.0", - "@chakra-ui/system": ">=1.0.0", - "@chakra-ui/utils": "^1.10.4", + "@chakra-ui/system": "^1.12.1", + "@chakra-ui/utils": "^2.0.9", "@emotion/react": "^11", "@emotion/styled": "^11", "@fidesui/react": "^0.0.12", "@fontsource/inter": "^4.5.4", + "@monaco-editor/react": "^4.4.5", "@reduxjs/toolkit": "^1.8.0", "chakra-react-select": "^3.3.7", "date-fns": "^2.28.0", "date-fns-tz": "^1.3.1", - "eslint-plugin-simple-import-sort": "^7.0.0", "formik": "^2.2.9", "framer-motion": "^5", "i18n-iso-countries": "^7.4.0", @@ -27,12 +28,13 @@ "msw": "^0.43.0", "narrow-minded": "^1.1.1", "next": "12.1.0", - "next-auth": "^4.10.3", "next-redux-wrapper": "^7.0.5", - "prettier": "^2.6.2", + "next-remove-imports": "^1.0.7", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-feature-flags": "^1.0.0", "react-redux": "^7.2.6", + "redux-persist": "^6.0.0", "whatwg-fetch": "^3.6.2", "yup": "^0.32.11" }, @@ -44,6 +46,7 @@ "@types/lodash.debounce": "^4.0.6", "@types/node": "17.0.10", "@types/react": "17.0.38", + "@types/react-redux": "^7.1.24", "@typescript-eslint/eslint-plugin": "^5.12.0", "@typescript-eslint/parser": "^5.12.0", "babel-jest": "^27.5.1", @@ -60,9 +63,11 @@ "eslint-plugin-no-only-tests": "^3.0.0", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "identity-obj-proxy": "^3.0.0", "jest": "^27.5.1", "openapi-typescript-codegen": "^0.20.1", + "prettier": "^2.6.2", "typescript": "4.5.5" } }, @@ -78,9 +83,8 @@ }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, + "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.6", @@ -339,7 +343,7 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", + "version": "7.19.0", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -558,6 +562,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "dev": true, @@ -653,7 +670,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.16.7", + "version": "7.19.0", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.4" @@ -945,19 +962,52 @@ } }, "node_modules/@chakra-ui/color-mode": { - "version": "1.4.1", + "version": "1.4.3", "license": "MIT", "dependencies": { - "@chakra-ui/hooks": "1.8.0", - "@chakra-ui/react-env": "1.1.2", - "@chakra-ui/utils": "1.10.0" + "@chakra-ui/hooks": "1.8.2", + "@chakra-ui/react-env": "1.1.4", + "@chakra-ui/utils": "1.10.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/color-mode/node_modules/@chakra-ui/hooks": { + "version": "1.8.2", + "license": "MIT", + "dependencies": { + "@chakra-ui/react-utils": "1.2.2", + "@chakra-ui/utils": "1.10.2", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/color-mode/node_modules/@chakra-ui/react-env": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/color-mode/node_modules/@chakra-ui/react-utils": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "^1.10.2" }, "peerDependencies": { "react": ">=16.8.6" } }, "node_modules/@chakra-ui/color-mode/node_modules/@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.2", "license": "MIT", "dependencies": { "@types/lodash.mergewith": "4.6.6", @@ -1138,6 +1188,39 @@ "lodash.mergewith": "4.6.2" } }, + "node_modules/@chakra-ui/icons": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@chakra-ui/icon": "2.0.5", + "@types/react": "^17.0.15" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/icons/node_modules/@chakra-ui/icon": { + "version": "2.0.5", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.4" + }, + "peerDependencies": { + "@chakra-ui/system": ">=1.0.0", + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/icons/node_modules/@chakra-ui/utils": { + "version": "1.10.4", + "license": "MIT", + "dependencies": { + "@types/lodash.mergewith": "4.6.6", + "css-box-model": "1.2.1", + "framesync": "5.3.0", + "lodash.mergewith": "4.6.2" + } + }, "node_modules/@chakra-ui/image": { "version": "1.1.3", "license": "MIT", @@ -1458,6 +1541,42 @@ "react-dom": ">=16.8.6" } }, + "node_modules/@chakra-ui/provider/node_modules/@chakra-ui/color-mode": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/provider/node_modules/@chakra-ui/styled-system": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "node_modules/@chakra-ui/provider/node_modules/@chakra-ui/system": { + "version": "1.10.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=16.8.6" + } + }, "node_modules/@chakra-ui/provider/node_modules/@chakra-ui/utils": { "version": "1.10.0", "license": "MIT", @@ -1583,6 +1702,52 @@ "react": ">=16.8.6" } }, + "node_modules/@chakra-ui/react-utils/node_modules/@chakra-ui/utils": { + "version": "1.10.4", + "license": "MIT", + "dependencies": { + "@types/lodash.mergewith": "4.6.6", + "css-box-model": "1.2.1", + "framesync": "5.3.0", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/react/node_modules/@chakra-ui/color-mode": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/react/node_modules/@chakra-ui/styled-system": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "node_modules/@chakra-ui/react/node_modules/@chakra-ui/system": { + "version": "1.10.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=16.8.6" + } + }, "node_modules/@chakra-ui/react/node_modules/@chakra-ui/utils": { "version": "1.10.0", "license": "MIT", @@ -1628,6 +1793,42 @@ "react": ">=16.8.6" } }, + "node_modules/@chakra-ui/skeleton/node_modules/@chakra-ui/color-mode": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/skeleton/node_modules/@chakra-ui/styled-system": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "node_modules/@chakra-ui/skeleton/node_modules/@chakra-ui/system": { + "version": "1.10.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=16.8.6" + } + }, "node_modules/@chakra-ui/skeleton/node_modules/@chakra-ui/utils": { "version": "1.10.0", "license": "MIT", @@ -1707,15 +1908,15 @@ } }, "node_modules/@chakra-ui/styled-system": { - "version": "1.17.0", + "version": "1.17.2", "license": "MIT", "dependencies": { - "@chakra-ui/utils": "1.10.0", + "@chakra-ui/utils": "1.10.2", "csstype": "^3.0.9" } }, "node_modules/@chakra-ui/styled-system/node_modules/@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.2", "license": "MIT", "dependencies": { "@types/lodash.mergewith": "4.6.6", @@ -1747,13 +1948,13 @@ } }, "node_modules/@chakra-ui/system": { - "version": "1.10.1", + "version": "1.12.1", "license": "MIT", "dependencies": { - "@chakra-ui/color-mode": "1.4.1", - "@chakra-ui/react-utils": "1.2.1", - "@chakra-ui/styled-system": "1.17.0", - "@chakra-ui/utils": "1.10.0", + "@chakra-ui/color-mode": "1.4.8", + "@chakra-ui/react-utils": "1.2.3", + "@chakra-ui/styled-system": "1.19.0", + "@chakra-ui/utils": "1.10.4", "react-fast-compare": "3.2.0" }, "peerDependencies": { @@ -1762,8 +1963,61 @@ "react": ">=16.8.6" } }, + "node_modules/@chakra-ui/system/node_modules/@chakra-ui/color-mode": { + "version": "1.4.8", + "license": "MIT", + "dependencies": { + "@chakra-ui/hooks": "1.9.1", + "@chakra-ui/react-env": "1.1.6", + "@chakra-ui/utils": "1.10.4" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/system/node_modules/@chakra-ui/hooks": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "@chakra-ui/react-utils": "1.2.3", + "@chakra-ui/utils": "1.10.4", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/system/node_modules/@chakra-ui/react-env": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.4" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/system/node_modules/@chakra-ui/react-utils": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "^1.10.4" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@chakra-ui/system/node_modules/@chakra-ui/styled-system": { + "version": "1.19.0", + "license": "MIT", + "dependencies": { + "@chakra-ui/utils": "1.10.4", + "csstype": "3.0.9" + } + }, "node_modules/@chakra-ui/system/node_modules/@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.4", "license": "MIT", "dependencies": { "@types/lodash.mergewith": "4.6.6", @@ -1772,6 +2026,10 @@ "lodash.mergewith": "4.6.2" } }, + "node_modules/@chakra-ui/system/node_modules/csstype": { + "version": "3.0.9", + "license": "MIT" + }, "node_modules/@chakra-ui/table": { "version": "1.3.2", "license": "MIT", @@ -1984,7 +2242,7 @@ } }, "node_modules/@chakra-ui/utils": { - "version": "1.10.4", + "version": "2.0.9", "license": "MIT", "dependencies": { "@types/lodash.mergewith": "4.6.6", @@ -2101,16 +2359,16 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.7.2", + "version": "11.10.2", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", + "@babel/helper-module-imports": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.0", + "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", @@ -2121,18 +2379,9 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.8.0", + "license": "MIT" }, "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { "version": "1.8.0", @@ -2149,20 +2398,24 @@ } }, "node_modules/@emotion/cache": { - "version": "11.9.3", + "version": "11.10.3", "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.1", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", "stylis": "4.0.13" } }, - "node_modules/@emotion/hash": { + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { "version": "0.8.0", "license": "MIT" }, + "node_modules/@emotion/hash": { + "version": "0.9.0", + "license": "MIT" + }, "node_modules/@emotion/is-prop-valid": { "version": "0.8.8", "license": "MIT", @@ -2181,15 +2434,16 @@ "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.9.3", + "version": "11.10.4", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.9.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.0", + "@emotion/cache": "^11.10.0", + "@emotion/serialize": "^1.1.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -2206,18 +2460,22 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.0.4", + "version": "1.1.0", "license": "MIT", "dependencies": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", "csstype": "^3.0.2" } }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.8.0", + "license": "MIT" + }, "node_modules/@emotion/sheet": { - "version": "1.1.1", + "version": "1.2.0", "license": "MIT" }, "node_modules/@emotion/styled": { @@ -2252,19 +2510,27 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.7.5", + "version": "0.8.0", "license": "MIT" }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@emotion/utils": { - "version": "1.1.0", + "version": "1.2.0", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { - "version": "0.2.5", + "version": "0.3.0", "license": "MIT" }, "node_modules/@eslint/eslintrc": { "version": "1.1.0", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -2283,6 +2549,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -2348,6 +2615,18 @@ "react-dom": "^17.0.2" } }, + "node_modules/@fidesui/react-button": { + "version": "0.0.6", + "license": "MIT", + "dependencies": { + "@chakra-ui/button": "^1.5.3" + }, + "peerDependencies": { + "@chakra-ui/system": "^1.10.3", + "react": "^17.0.2", + "react-dom": "^17.0.2" + } + }, "node_modules/@fidesui/react/node_modules/@chakra-ui/accordion": { "version": "1.4.6", "license": "MIT", @@ -2451,18 +2730,6 @@ "react": ">=16.8.6" } }, - "node_modules/@fidesui/react/node_modules/@chakra-ui/color-mode": { - "version": "1.4.3", - "license": "MIT", - "dependencies": { - "@chakra-ui/hooks": "1.8.2", - "@chakra-ui/react-env": "1.1.4", - "@chakra-ui/utils": "1.10.2" - }, - "peerDependencies": { - "react": ">=16.8.6" - } - }, "node_modules/@fidesui/react/node_modules/@chakra-ui/control-box": { "version": "1.1.4", "license": "MIT", @@ -2866,14 +3133,6 @@ "react": ">=16.8.6" } }, - "node_modules/@fidesui/react/node_modules/@chakra-ui/styled-system": { - "version": "1.17.2", - "license": "MIT", - "dependencies": { - "@chakra-ui/utils": "1.10.2", - "csstype": "^3.0.9" - } - }, "node_modules/@fidesui/react/node_modules/@chakra-ui/switch": { "version": "1.3.5", "license": "MIT", @@ -3045,18 +3304,6 @@ "react": ">=16.8.6" } }, - "node_modules/@fidesui/react/node_modules/@fidesui/react-button": { - "version": "0.0.6", - "license": "MIT", - "dependencies": { - "@chakra-ui/button": "^1.5.3" - }, - "peerDependencies": { - "@chakra-ui/system": "^1.10.3", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, "node_modules/@fidesui/react/node_modules/@fidesui/react-provider": { "version": "0.0.10", "license": "MIT", @@ -3089,6 +3336,7 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.3", + "dev": true, "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -3101,6 +3349,7 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3366,19 +3615,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "node_modules/@jest/reporters/node_modules/source-map": { "version": "0.6.1", "dev": true, @@ -3387,20 +3623,6 @@ "node": ">=0.10.0" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/@jest/source-map": { "version": "27.5.1", "dev": true, @@ -3498,6 +3720,19 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.5", "license": "MIT", @@ -3505,12 +3740,29 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.11", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", + "version": "0.3.15", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -3519,14 +3771,35 @@ }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@monaco-editor/loader": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.4.6", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.3.2", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } }, "node_modules/@mswjs/cookies": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", - "integrity": "sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==", + "version": "0.2.1", + "license": "MIT", "dependencies": { "@types/set-cookie-parser": "^2.4.0", "set-cookie-parser": "^2.4.6" @@ -3536,9 +3809,8 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.16.6.tgz", - "integrity": "sha512-7ax1sRx5s4ZWl0KvVhhcPOUoPbCCkVh8M8hYaqOyvoAQOiqLVzy+Z6Mh2ywPhYw4zudr5Mo/E8UT/zJBO/Wxrw==", + "version": "0.16.4", + "license": "MIT", "dependencies": { "@open-draft/until": "^1.0.3", "@xmldom/xmldom": "^0.7.5", @@ -3638,15 +3910,7 @@ }, "node_modules/@open-draft/until": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", - "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==" - }, - "node_modules/@panva/hkdf": { - "version": "1.0.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } + "license": "MIT" }, "node_modules/@polka/url": { "version": "1.0.0-next.21", @@ -3910,6 +4174,29 @@ "version": "0.4.1", "license": "MIT" }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "license": "MIT", + "peer": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "dev": true, @@ -3991,13 +4278,11 @@ }, "node_modules/@types/js-yaml": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.9", - "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -4010,7 +4295,7 @@ "license": "MIT" }, "node_modules/@types/lodash.debounce": { - "version": "4.0.6", + "version": "4.0.7", "dev": true, "license": "MIT", "dependencies": { @@ -4059,7 +4344,7 @@ } }, "node_modules/@types/react-redux": { - "version": "7.1.23", + "version": "7.1.24", "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", @@ -4069,7 +4354,7 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.4", + "version": "4.4.5", "license": "MIT", "dependencies": { "@types/react": "*" @@ -4081,8 +4366,7 @@ }, "node_modules/@types/set-cookie-parser": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", - "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -4360,21 +4644,161 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", - "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==", + "license": "MIT", "engines": { "node": ">=10.0.0" } }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0", + "peer": true + }, "node_modules/abab": { "version": "2.0.5", "dev": true, "license": "BSD-3-Clause" }, "node_modules/acorn": { - "version": "8.7.0", + "version": "8.8.0", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -4411,8 +4835,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", + "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -4463,6 +4896,13 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "dev": true, @@ -4737,6 +5177,23 @@ "@babel/core": "^7.8.0" } }, + "node_modules/babel-loader": { + "version": "8.2.5", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, @@ -4767,12 +5224,23 @@ } }, "node_modules/babel-plugin-macros": { - "version": "2.8.0", + "version": "3.1.0", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-transform-remove-imports": { + "version": "1.7.0", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -4814,6 +5282,7 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "node_modules/base64-js": { @@ -4842,6 +5311,13 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "license": "MIT", @@ -4870,6 +5346,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -4952,7 +5429,6 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "dev": true, "license": "MIT" }, "node_modules/cachedir": { @@ -4977,9 +5453,8 @@ }, "node_modules/call-me-maybe": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", @@ -4997,12 +5472,18 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001314", - "license": "CC-BY-4.0", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001414", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" }, "node_modules/caseless": { "version": "0.12.0", @@ -5010,7 +5491,7 @@ "license": "Apache-2.0" }, "node_modules/chakra-react-select": { - "version": "3.3.7", + "version": "3.3.8", "license": "MIT", "dependencies": { "@chakra-ui/form-control": "^1.0.0", @@ -5093,7 +5574,15 @@ "is-glob": "^4.0.1" }, "engines": { - "node": ">= 6" + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" } }, "node_modules/ci-info": { @@ -5246,12 +5735,17 @@ "node": ">=4.0.0" } }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, "node_modules/compute-scroll-into-view": { "version": "1.0.14", "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/confusing-browser-globals": { @@ -5296,17 +5790,17 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "6.0.0", + "version": "7.0.1", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/cross-env": { @@ -5328,6 +5822,7 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5394,7 +5889,7 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "10.3.0", + "version": "10.7.0", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5450,7 +5945,7 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.21", + "version": "14.18.28", "dev": true, "license": "MIT" }, @@ -5593,7 +6088,7 @@ } }, "node_modules/dayjs": { - "version": "1.11.3", + "version": "1.11.5", "dev": true, "license": "MIT" }, @@ -5636,6 +6131,7 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "dev": true, "license": "MIT" }, "node_modules/deepmerge": { @@ -5783,6 +6279,13 @@ "dev": true, "license": "MIT" }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "dev": true, @@ -5791,6 +6294,18 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", "dev": true, @@ -5842,6 +6357,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "license": "MIT", + "peer": true + }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, @@ -5953,6 +6473,7 @@ }, "node_modules/eslint": { "version": "8.9.0", + "dev": true, "license": "MIT", "dependencies": { "@eslint/eslintrc": "^1.1.0", @@ -6298,6 +6819,7 @@ }, "node_modules/eslint-plugin-simple-import-sort": { "version": "7.0.0", + "dev": true, "license": "MIT", "peerDependencies": { "eslint": ">=5.0.0" @@ -6305,6 +6827,7 @@ }, "node_modules/eslint-scope": { "version": "7.1.1", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -6316,6 +6839,7 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" @@ -6332,6 +6856,7 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10" @@ -6339,6 +6864,7 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.3.0", + "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6346,6 +6872,7 @@ }, "node_modules/eslint/node_modules/doctrine": { "version": "3.0.0", + "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -6356,6 +6883,7 @@ }, "node_modules/espree": { "version": "9.3.1", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.7.0", @@ -6380,6 +6908,7 @@ }, "node_modules/esquery": { "version": "1.4.0", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -6407,20 +6936,20 @@ }, "node_modules/esutils": { "version": "2.0.3", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/eventemitter2": { - "version": "6.4.5", + "version": "6.4.8", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -6573,6 +7102,7 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "dev": true, "license": "MIT" }, "node_modules/fastq": { @@ -6621,6 +7151,7 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" @@ -6639,6 +7170,21 @@ "node": ">=8" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-root": { "version": "1.1.0", "license": "MIT" @@ -6656,6 +7202,7 @@ }, "node_modules/flat-cache": { "version": "3.0.4", + "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.1.0", @@ -6667,6 +7214,7 @@ }, "node_modules/flatted": { "version": "3.2.5", + "dev": true, "license": "ISC" }, "node_modules/focus-lock": { @@ -6798,6 +7346,7 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -6817,6 +7366,7 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", + "dev": true, "license": "MIT" }, "node_modules/gensync": { @@ -6905,6 +7455,7 @@ }, "node_modules/glob": { "version": "7.2.0", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -6923,6 +7474,7 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -6931,6 +7483,11 @@ "node": ">=10.13.0" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause", + "peer": true + }, "node_modules/global-dirs": { "version": "3.0.0", "dev": true, @@ -6947,6 +7504,7 @@ }, "node_modules/globals": { "version": "13.12.1", + "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -6979,13 +7537,11 @@ }, "node_modules/graceful-fs": { "version": "4.2.9", - "dev": true, "license": "ISC" }, "node_modules/graphql": { "version": "16.5.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.5.0.tgz", - "integrity": "sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==", + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -7006,9 +7562,8 @@ }, "node_modules/handlebars": { "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -7027,9 +7582,8 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7090,9 +7644,8 @@ } }, "node_modules/headers-polyfill": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.9.tgz", - "integrity": "sha512-FFIXpxbA9HZJXofXqS4IBRa7Z8F1Y+/DwxHSEOOTswZxym8Kz+f6DNhrtnCRcjWcTN7LjjbE5stz0UnoUPNprQ==" + "version": "3.0.7", + "license": "MIT" }, "node_modules/hey-listen": { "version": "1.0.8", @@ -7168,7 +7721,7 @@ } }, "node_modules/i18n-iso-countries": { - "version": "7.4.0", + "version": "7.5.0", "license": "MIT", "dependencies": { "diacritics": "1.3.0" @@ -7218,6 +7771,7 @@ }, "node_modules/ignore": { "version": "5.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -7266,6 +7820,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" @@ -7281,6 +7836,7 @@ }, "node_modules/inflight": { "version": "1.0.6", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -7495,8 +8051,7 @@ }, "node_modules/is-node-process": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", - "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==" + "license": "MIT" }, "node_modules/is-number": { "version": "7.0.0", @@ -7622,6 +8177,7 @@ }, "node_modules/isexe": { "version": "2.0.0", + "dev": true, "license": "ISC" }, "node_modules/isstream": { @@ -8069,33 +8625,6 @@ "fsevents": "^2.3.2" } }, - "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-haste-map/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jest-jasmine2": { "version": "27.5.1", "dev": true, @@ -8384,33 +8913,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jest-runtime": { "version": "27.5.1", "dev": true, @@ -8627,11 +9129,29 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jose": { - "version": "4.5.0", + "node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/panva" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/js-levenshtein": { @@ -8726,9 +9246,8 @@ }, "node_modules/json-schema-ref-parser": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, + "license": "MIT", "dependencies": { "@apidevtools/json-schema-ref-parser": "9.0.9" }, @@ -8742,6 +9261,7 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { @@ -8844,6 +9364,7 @@ }, "node_modules/levn": { "version": "0.4.1", + "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -8883,6 +9404,36 @@ } } }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/locate-path": { "version": "2.0.0", "dev": true, @@ -8909,6 +9460,7 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "dev": true, "license": "MIT" }, "node_modules/lodash.mergewith": { @@ -8992,6 +9544,7 @@ }, "node_modules/lru-cache": { "version": "6.0.0", + "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -9010,7 +9563,6 @@ }, "node_modules/make-dir": { "version": "3.1.0", - "dev": true, "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -9036,7 +9588,6 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -9061,7 +9612,6 @@ }, "node_modules/mime-db": { "version": "1.51.0", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9069,7 +9619,6 @@ }, "node_modules/mime-types": { "version": "2.1.34", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.51.0" @@ -9095,6 +9644,7 @@ }, "node_modules/minimatch": { "version": "3.0.4", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -9107,6 +9657,11 @@ "version": "1.2.6", "license": "MIT" }, + "node_modules/monaco-editor": { + "version": "0.34.0", + "license": "MIT", + "peer": true + }, "node_modules/mrmime": { "version": "1.0.0", "dev": true, @@ -9121,9 +9676,8 @@ }, "node_modules/msw": { "version": "0.43.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-0.43.1.tgz", - "integrity": "sha512-wzhPpL6RsiYkyIUlTCg0aZY0aRZa4Eiubd6MOA5oJVgfuapDmvZrI8OMi4h4e+fpHD+Qsy+4unAjv3wpWia5yw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@mswjs/cookies": "^0.2.0", "@mswjs/interceptors": "^0.16.3", @@ -9167,8 +9721,7 @@ }, "node_modules/msw/node_modules/chalk": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9267,8 +9820,7 @@ }, "node_modules/narrow-minded": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/narrow-minded/-/narrow-minded-1.1.1.tgz", - "integrity": "sha512-X5wagoCtdl7kRn7vGgObAKDp447f5nuEi+kaa47gm5TGwnjTWaddMTI8FG06hdzZTtOCw8mQ+dSGT6MU+bhppg==", + "license": "MIT", "engines": { "node": ">12.0", "npm": ">6.0" @@ -9276,13 +9828,12 @@ }, "node_modules/natural-compare": { "version": "1.4.0", + "dev": true, "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "license": "MIT" }, "node_modules/next": { "version": "12.1.0", @@ -9332,44 +9883,25 @@ } } }, - "node_modules/next-auth": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.10.3.tgz", - "integrity": "sha512-7zc4aXYc/EEln7Pkcsn21V1IevaTZsMLJwapfbnKA4+JY0+jFzWbt5p/ljugesGIrN4VOZhpZIw50EaFZyghJQ==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@panva/hkdf": "^1.0.1", - "cookie": "^0.4.1", - "jose": "^4.3.7", - "oauth": "^0.9.15", - "openid-client": "^5.1.0", - "preact": "^10.6.3", - "preact-render-to-string": "^5.1.19", - "uuid": "^8.3.2" - }, - "engines": { - "node": "^12.19.0 || ^14.15.0 || ^16.13.0" - }, - "peerDependencies": { - "nodemailer": "^6.6.5", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - }, - "peerDependenciesMeta": { - "nodemailer": { - "optional": true - } - } - }, "node_modules/next-redux-wrapper": { "version": "7.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/next-redux-wrapper/-/next-redux-wrapper-7.0.5.tgz", + "integrity": "sha512-UFXdAWG5i+GFT8+Hoqpx3GArkPh34fVWF9YoA2VSHlBzsrPtnRd7NWM6FNSYUennpommTpWJ09mu+r/1UxyIkg==", "peerDependencies": { "next": ">=10.0.3", "react": "*", "react-redux": "*" } }, + "node_modules/next-remove-imports": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.14.3", + "babel-loader": "^8.2.2", + "babel-plugin-transform-remove-imports": "^1.5.4" + } + }, "node_modules/node-int64": { "version": "0.4.0", "dev": true, @@ -9402,10 +9934,6 @@ "dev": true, "license": "MIT" }, - "node_modules/oauth": { - "version": "0.9.15", - "license": "MIT" - }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", @@ -9413,13 +9941,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/object-inspect": { "version": "1.12.0", "dev": true, @@ -9510,15 +10031,9 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/oidc-token-hash": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, "node_modules/once": { "version": "1.4.0", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -9539,9 +10054,8 @@ }, "node_modules/openapi-typescript-codegen": { "version": "0.20.1", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.20.1.tgz", - "integrity": "sha512-07Fn/es5a3G696tyqkukmgOr/xH3vGnAp32dQO1mb4mSWmIEgtkMtjm+p7htphGhH0jLX1ruPaGfzU+WkdvIGw==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^6.3.0", "commander": "^9.0.0", @@ -9554,9 +10068,8 @@ }, "node_modules/openapi-typescript-codegen/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9565,10 +10078,9 @@ } }, "node_modules/openapi-typescript-codegen/node_modules/commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "version": "9.4.0", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || >=14" } @@ -9581,24 +10093,9 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/openid-client": { - "version": "5.1.3", - "license": "MIT", - "dependencies": { - "jose": "^4.1.4", - "lru-cache": "^6.0.0", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - }, - "engines": { - "node": "^12.19.0 || ^14.15.0 || ^16.13.0" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/optionator": { "version": "0.9.1", + "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", @@ -9647,8 +10144,7 @@ }, "node_modules/outvariant": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", - "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==" + "license": "MIT" }, "node_modules/p-limit": { "version": "1.3.0", @@ -9735,6 +10231,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9742,6 +10239,7 @@ }, "node_modules/path-key": { "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9753,8 +10251,7 @@ }, "node_modules/path-to-regexp": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -9805,7 +10302,6 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" @@ -9816,7 +10312,6 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -9828,7 +10323,6 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -9839,7 +10333,6 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -9853,7 +10346,6 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -9864,7 +10356,6 @@ }, "node_modules/pkg-dir/node_modules/p-try": { "version": "2.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -9872,7 +10363,6 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9911,26 +10401,9 @@ "url": "https://opencollective.com/postcss/" } }, - "node_modules/preact": { - "version": "10.6.6", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "5.1.19", - "license": "MIT", - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=10" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -9938,6 +10411,7 @@ }, "node_modules/prettier": { "version": "2.6.2", + "dev": true, "license": "MIT", "bin": { "prettier": "bin-prettier.js" @@ -9960,10 +10434,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pretty-format": { - "version": "3.8.0", - "license": "MIT" - }, "node_modules/prompts": { "version": "2.4.2", "dev": true, @@ -10042,6 +10512,14 @@ ], "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react": { "version": "17.0.2", "license": "MIT", @@ -10079,6 +10557,15 @@ "version": "3.2.0", "license": "MIT" }, + "node_modules/react-feature-flags": { + "version": "1.0.0", + "license": "MIT", + "peerDependencies": { + "prop-types": "^15.5.4", + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, "node_modules/react-focus-lock": { "version": "2.5.2", "license": "MIT", @@ -10185,7 +10672,7 @@ "license": "0BSD" }, "node_modules/react-select": { - "version": "5.3.2", + "version": "5.4.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.0", @@ -10227,7 +10714,7 @@ "license": "0BSD" }, "node_modules/react-transition-group": { - "version": "4.4.2", + "version": "4.4.5", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", @@ -10292,6 +10779,13 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/redux-persist": { + "version": "6.0.0", + "license": "MIT", + "peerDependencies": { + "redux": ">4.0.0" + } + }, "node_modules/redux-thunk": { "version": "2.4.1", "license": "MIT", @@ -10320,6 +10814,7 @@ }, "node_modules/regexpp": { "version": "3.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10423,6 +10918,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -10497,6 +10993,22 @@ "object-assign": "^4.1.1" } }, + "node_modules/schema-utils": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/semver": { "version": "6.3.0", "license": "ISC", @@ -10504,13 +11016,21 @@ "semver": "bin/semver.js" } }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-cookie-parser": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz", - "integrity": "sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w==" + "version": "2.4.8", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -10521,6 +11041,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10608,7 +11129,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -10617,7 +11137,6 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -10671,6 +11190,10 @@ "node": ">=8" } }, + "node_modules/state-local": { + "version": "1.0.7", + "license": "MIT" + }, "node_modules/statuses": { "version": "2.0.1", "license": "MIT", @@ -10680,8 +11203,7 @@ }, "node_modules/strict-event-emitter": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.4.tgz", - "integrity": "sha512-xIqTLS5azUH1djSUsLH9DbP6UnM/nI18vu8d43JigCQEoVsnY+mrlE+qv6kYqs6/1OkMnMIiL6ffedQSZStuoQ==", + "license": "MIT", "dependencies": { "events": "^3.3.0" } @@ -10820,6 +11342,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10895,6 +11418,14 @@ "dev": true, "license": "MIT" }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "dev": true, @@ -10910,6 +11441,78 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/terser": { + "version": "5.15.0", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT", + "peer": true + }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -10925,6 +11528,7 @@ }, "node_modules/text-table": { "version": "0.2.0", + "dev": true, "license": "MIT" }, "node_modules/throat": { @@ -11073,6 +11677,7 @@ }, "node_modules/type-check": { "version": "0.4.0", + "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -11091,6 +11696,7 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -11120,10 +11726,9 @@ } }, "node_modules/uglify-js": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.2.tgz", - "integrity": "sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==", + "version": "3.17.0", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -11219,6 +11824,7 @@ }, "node_modules/uuid": { "version": "8.3.2", + "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" @@ -11226,6 +11832,7 @@ }, "node_modules/v8-compile-cache": { "version": "2.3.0", + "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { @@ -11288,6 +11895,18 @@ "loose-envify": "^1.0.0" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "license": "MIT", @@ -11303,6 +11922,52 @@ "node": ">=10.4" } }, + "node_modules/webpack": { + "version": "5.74.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, "node_modules/webpack-bundle-analyzer": { "version": "4.3.0", "dev": true, @@ -11325,6 +11990,51 @@ "node": ">= 10.13.0" } }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/whatwg-encoding": { "version": "1.0.5", "dev": true, @@ -11357,6 +12067,7 @@ }, "node_modules/which": { "version": "2.0.2", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -11385,6 +12096,7 @@ }, "node_modules/word-wrap": { "version": "1.2.3", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11392,9 +12104,8 @@ }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -11413,6 +12124,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -11465,6 +12177,7 @@ }, "node_modules/yallist": { "version": "4.0.0", + "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -11534,8 +12247,6 @@ }, "@apidevtools/json-schema-ref-parser": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", "dev": true, "requires": { "@jsdevtools/ono": "^7.1.3", @@ -11717,7 +12428,7 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.16.7" + "version": "7.19.0" }, "@babel/helper-simple-access": { "version": "7.16.7", @@ -11855,6 +12566,12 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "dev": true, @@ -11912,7 +12629,7 @@ } }, "@babel/runtime": { - "version": "7.16.7", + "version": "7.19.0", "requires": { "regenerator-runtime": "^0.13.4" } @@ -12142,15 +12859,36 @@ } }, "@chakra-ui/color-mode": { - "version": "1.4.1", + "version": "1.4.3", "requires": { - "@chakra-ui/hooks": "1.8.0", - "@chakra-ui/react-env": "1.1.2", - "@chakra-ui/utils": "1.10.0" + "@chakra-ui/hooks": "1.8.2", + "@chakra-ui/react-env": "1.1.4", + "@chakra-ui/utils": "1.10.2" }, "dependencies": { + "@chakra-ui/hooks": { + "version": "1.8.2", + "requires": { + "@chakra-ui/react-utils": "1.2.2", + "@chakra-ui/utils": "1.10.2", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + } + }, + "@chakra-ui/react-env": { + "version": "1.1.4", + "requires": { + "@chakra-ui/utils": "1.10.2" + } + }, + "@chakra-ui/react-utils": { + "version": "1.2.2", + "requires": { + "@chakra-ui/utils": "^1.10.2" + } + }, "@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.2", "requires": { "@types/lodash.mergewith": "4.6.6", "css-box-model": "1.2.1", @@ -12299,6 +13037,30 @@ } } }, + "@chakra-ui/icons": { + "version": "1.1.7", + "requires": { + "@chakra-ui/icon": "2.0.5", + "@types/react": "^17.0.15" + }, + "dependencies": { + "@chakra-ui/icon": { + "version": "2.0.5", + "requires": { + "@chakra-ui/utils": "1.10.4" + } + }, + "@chakra-ui/utils": { + "version": "1.10.4", + "requires": { + "@types/lodash.mergewith": "4.6.6", + "css-box-model": "1.2.1", + "framesync": "5.3.0", + "lodash.mergewith": "4.6.2" + } + } + } + }, "@chakra-ui/image": { "version": "1.1.3", "requires": { @@ -12556,6 +13318,31 @@ "@chakra-ui/utils": "1.10.0" }, "dependencies": { + "@chakra-ui/color-mode": { + "version": "1.4.1", + "requires": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + } + }, + "@chakra-ui/styled-system": { + "version": "1.17.0", + "requires": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "@chakra-ui/system": { + "version": "1.10.1", + "requires": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + } + }, "@chakra-ui/utils": { "version": "1.10.0", "requires": { @@ -12640,6 +13427,31 @@ "@chakra-ui/visually-hidden": "1.1.2" }, "dependencies": { + "@chakra-ui/color-mode": { + "version": "1.4.1", + "requires": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + } + }, + "@chakra-ui/styled-system": { + "version": "1.17.0", + "requires": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "@chakra-ui/system": { + "version": "1.10.1", + "requires": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + } + }, "@chakra-ui/utils": { "version": "1.10.0", "requires": { @@ -12654,11 +13466,28 @@ "@chakra-ui/react-env": { "version": "1.1.2", "requires": { - "@chakra-ui/utils": "1.10.0" + "@chakra-ui/utils": "1.10.0" + }, + "dependencies": { + "@chakra-ui/utils": { + "version": "1.10.0", + "requires": { + "@types/lodash.mergewith": "4.6.6", + "css-box-model": "1.2.1", + "framesync": "5.3.0", + "lodash.mergewith": "4.6.2" + } + } + } + }, + "@chakra-ui/react-utils": { + "version": "1.2.1", + "requires": { + "@chakra-ui/utils": "^1.9.1" }, "dependencies": { "@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.4", "requires": { "@types/lodash.mergewith": "4.6.6", "css-box-model": "1.2.1", @@ -12668,12 +13497,6 @@ } } }, - "@chakra-ui/react-utils": { - "version": "1.2.1", - "requires": { - "@chakra-ui/utils": "^1.9.1" - } - }, "@chakra-ui/select": { "version": "1.2.4", "requires": { @@ -12701,6 +13524,31 @@ "@chakra-ui/utils": "1.10.0" }, "dependencies": { + "@chakra-ui/color-mode": { + "version": "1.4.1", + "requires": { + "@chakra-ui/hooks": "1.8.0", + "@chakra-ui/react-env": "1.1.2", + "@chakra-ui/utils": "1.10.0" + } + }, + "@chakra-ui/styled-system": { + "version": "1.17.0", + "requires": { + "@chakra-ui/utils": "1.10.0", + "csstype": "^3.0.9" + } + }, + "@chakra-ui/system": { + "version": "1.10.1", + "requires": { + "@chakra-ui/color-mode": "1.4.1", + "@chakra-ui/react-utils": "1.2.1", + "@chakra-ui/styled-system": "1.17.0", + "@chakra-ui/utils": "1.10.0", + "react-fast-compare": "3.2.0" + } + }, "@chakra-ui/utils": { "version": "1.10.0", "requires": { @@ -12769,14 +13617,14 @@ } }, "@chakra-ui/styled-system": { - "version": "1.17.0", + "version": "1.17.2", "requires": { - "@chakra-ui/utils": "1.10.0", + "@chakra-ui/utils": "1.10.2", "csstype": "^3.0.9" }, "dependencies": { "@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.2", "requires": { "@types/lodash.mergewith": "4.6.6", "css-box-model": "1.2.1", @@ -12805,23 +13653,62 @@ } }, "@chakra-ui/system": { - "version": "1.10.1", + "version": "1.12.1", "requires": { - "@chakra-ui/color-mode": "1.4.1", - "@chakra-ui/react-utils": "1.2.1", - "@chakra-ui/styled-system": "1.17.0", - "@chakra-ui/utils": "1.10.0", + "@chakra-ui/color-mode": "1.4.8", + "@chakra-ui/react-utils": "1.2.3", + "@chakra-ui/styled-system": "1.19.0", + "@chakra-ui/utils": "1.10.4", "react-fast-compare": "3.2.0" }, "dependencies": { + "@chakra-ui/color-mode": { + "version": "1.4.8", + "requires": { + "@chakra-ui/hooks": "1.9.1", + "@chakra-ui/react-env": "1.1.6", + "@chakra-ui/utils": "1.10.4" + } + }, + "@chakra-ui/hooks": { + "version": "1.9.1", + "requires": { + "@chakra-ui/react-utils": "1.2.3", + "@chakra-ui/utils": "1.10.4", + "compute-scroll-into-view": "1.0.14", + "copy-to-clipboard": "3.3.1" + } + }, + "@chakra-ui/react-env": { + "version": "1.1.6", + "requires": { + "@chakra-ui/utils": "1.10.4" + } + }, + "@chakra-ui/react-utils": { + "version": "1.2.3", + "requires": { + "@chakra-ui/utils": "^1.10.4" + } + }, + "@chakra-ui/styled-system": { + "version": "1.19.0", + "requires": { + "@chakra-ui/utils": "1.10.4", + "csstype": "3.0.9" + } + }, "@chakra-ui/utils": { - "version": "1.10.0", + "version": "1.10.4", "requires": { "@types/lodash.mergewith": "4.6.6", "css-box-model": "1.2.1", "framesync": "5.3.0", "lodash.mergewith": "4.6.2" } + }, + "csstype": { + "version": "3.0.9" } } }, @@ -12999,7 +13886,7 @@ } }, "@chakra-ui/utils": { - "version": "1.10.4", + "version": "2.0.9", "requires": { "@types/lodash.mergewith": "4.6.6", "css-box-model": "1.2.1", @@ -13093,15 +13980,15 @@ } }, "@emotion/babel-plugin": { - "version": "11.7.2", + "version": "11.10.2", "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", + "@babel/helper-module-imports": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.17.12", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.0", + "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", @@ -13109,11 +13996,8 @@ "stylis": "4.0.13" }, "dependencies": { - "@babel/plugin-syntax-jsx": { - "version": "7.16.7", - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } + "@emotion/memoize": { + "version": "0.8.0" }, "convert-source-map": { "version": "1.8.0", @@ -13127,17 +14011,22 @@ } }, "@emotion/cache": { - "version": "11.9.3", + "version": "11.10.3", "requires": { - "@emotion/memoize": "^0.7.4", - "@emotion/sheet": "^1.1.1", - "@emotion/utils": "^1.0.0", - "@emotion/weak-memoize": "^0.2.5", + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", "stylis": "4.0.13" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.0" + } } }, "@emotion/hash": { - "version": "0.8.0" + "version": "0.9.0" }, "@emotion/is-prop-valid": { "version": "0.8.8", @@ -13156,29 +14045,35 @@ "version": "0.7.5" }, "@emotion/react": { - "version": "11.9.3", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.9.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", + "version": "11.10.4", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.0", + "@emotion/cache": "^11.10.0", + "@emotion/serialize": "^1.1.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.0.4", + "version": "1.1.0", "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.0" + } } }, "@emotion/sheet": { - "version": "1.1.1" + "version": "1.2.0" }, "@emotion/styled": { "version": "11.6.0", @@ -13199,16 +14094,21 @@ } }, "@emotion/unitless": { - "version": "0.7.5" + "version": "0.8.0" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "requires": {} }, "@emotion/utils": { - "version": "1.1.0" + "version": "1.2.0" }, "@emotion/weak-memoize": { - "version": "0.2.5" + "version": "0.3.0" }, "@eslint/eslintrc": { "version": "1.1.0", + "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -13222,7 +14122,8 @@ }, "dependencies": { "ignore": { - "version": "4.0.6" + "version": "4.0.6", + "dev": true } } }, @@ -13343,14 +14244,6 @@ "@chakra-ui/utils": "1.10.2" } }, - "@chakra-ui/color-mode": { - "version": "1.4.3", - "requires": { - "@chakra-ui/hooks": "1.8.2", - "@chakra-ui/react-env": "1.1.4", - "@chakra-ui/utils": "1.10.2" - } - }, "@chakra-ui/control-box": { "version": "1.1.4", "requires": { @@ -13599,13 +14492,6 @@ "@chakra-ui/visually-hidden": "1.1.4" } }, - "@chakra-ui/styled-system": { - "version": "1.17.2", - "requires": { - "@chakra-ui/utils": "1.10.2", - "csstype": "^3.0.9" - } - }, "@chakra-ui/switch": { "version": "1.3.5", "requires": { @@ -13712,12 +14598,6 @@ "@chakra-ui/utils": "1.10.2" } }, - "@fidesui/react-button": { - "version": "0.0.6", - "requires": { - "@chakra-ui/button": "^1.5.3" - } - }, "@fidesui/react-provider": { "version": "0.0.10", "requires": { @@ -13734,11 +14614,18 @@ } } }, + "@fidesui/react-button": { + "version": "0.0.6", + "requires": { + "@chakra-ui/button": "^1.5.3" + } + }, "@fontsource/inter": { "version": "4.5.4" }, "@humanwhocodes/config-array": { "version": "0.9.3", + "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -13746,7 +14633,8 @@ } }, "@humanwhocodes/object-schema": { - "version": "1.2.1" + "version": "1.2.1", + "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -13929,25 +14817,9 @@ "v8-to-istanbul": "^8.1.0" }, "dependencies": { - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, "source-map": { "version": "0.6.1", "dev": true - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } } } }, @@ -14024,14 +14896,35 @@ "chalk": "^4.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "peer": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/resolve-uri": { "version": "3.0.5" }, + "@jridgewell/set-array": { + "version": "1.1.2", + "peer": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.11" }, "@jridgewell/trace-mapping": { - "version": "0.3.4", + "version": "0.3.15", "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -14039,23 +14932,30 @@ }, "@jsdevtools/ono": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true }, + "@monaco-editor/loader": { + "version": "1.3.2", + "requires": { + "state-local": "^1.0.6" + } + }, + "@monaco-editor/react": { + "version": "4.4.6", + "requires": { + "@monaco-editor/loader": "^1.3.2", + "prop-types": "^15.7.2" + } + }, "@mswjs/cookies": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", - "integrity": "sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g==", + "version": "0.2.1", "requires": { "@types/set-cookie-parser": "^2.4.0", "set-cookie-parser": "^2.4.6" } }, "@mswjs/interceptors": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.16.6.tgz", - "integrity": "sha512-7ax1sRx5s4ZWl0KvVhhcPOUoPbCCkVh8M8hYaqOyvoAQOiqLVzy+Z6Mh2ywPhYw4zudr5Mo/E8UT/zJBO/Wxrw==", + "version": "0.16.4", "requires": { "@open-draft/until": "^1.0.3", "@xmldom/xmldom": "^0.7.5", @@ -14121,12 +15021,7 @@ } }, "@open-draft/until": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-1.0.3.tgz", - "integrity": "sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==" - }, - "@panva/hkdf": { - "version": "1.0.1" + "version": "1.0.3" }, "@polka/url": { "version": "1.0.0-next.21", @@ -14305,6 +15200,26 @@ "@types/cookie": { "version": "0.4.1" }, + "@types/eslint": { + "version": "8.4.6", + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "peer": true + }, "@types/graceful-fs": { "version": "4.1.5", "dev": true, @@ -14369,13 +15284,10 @@ }, "@types/js-yaml": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", "dev": true }, "@types/json-schema": { - "version": "7.0.9", - "dev": true + "version": "7.0.9" }, "@types/json5": { "version": "0.0.29", @@ -14385,7 +15297,7 @@ "version": "4.14.178" }, "@types/lodash.debounce": { - "version": "4.0.6", + "version": "4.0.7", "dev": true, "requires": { "@types/lodash": "*" @@ -14426,7 +15338,7 @@ } }, "@types/react-redux": { - "version": "7.1.23", + "version": "7.1.24", "requires": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -14435,7 +15347,7 @@ } }, "@types/react-transition-group": { - "version": "4.4.4", + "version": "4.4.5", "requires": { "@types/react": "*" } @@ -14445,8 +15357,6 @@ }, "@types/set-cookie-parser": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz", - "integrity": "sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w==", "requires": { "@types/node": "*" } @@ -14603,17 +15513,139 @@ "eslint-visitor-keys": "^3.0.0" } }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, "@xmldom/xmldom": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.5.tgz", - "integrity": "sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==" + "version": "0.7.5" + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "peer": true }, "abab": { "version": "2.0.5", "dev": true }, "acorn": { - "version": "8.7.0" + "version": "8.8.0" }, "acorn-globals": { "version": "6.0.0", @@ -14633,8 +15665,14 @@ } } }, + "acorn-import-assertions": { + "version": "1.8.0", + "peer": true, + "requires": {} + }, "acorn-jsx": { "version": "5.3.2", + "dev": true, "requires": {} }, "acorn-walk": { @@ -14665,6 +15703,10 @@ "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "requires": {} + }, "ansi-colors": { "version": "4.1.3", "dev": true @@ -14820,6 +15862,15 @@ "slash": "^3.0.0" } }, + "babel-loader": { + "version": "8.2.5", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, "babel-plugin-istanbul": { "version": "6.1.1", "dev": true, @@ -14842,13 +15893,17 @@ } }, "babel-plugin-macros": { - "version": "2.8.0", + "version": "3.1.0", "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" } }, + "babel-plugin-transform-remove-imports": { + "version": "1.7.0", + "requires": {} + }, "babel-preset-current-node-syntax": { "version": "1.0.1", "dev": true, @@ -14876,7 +15931,8 @@ } }, "balanced-match": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "base64-js": { "version": "1.5.1" @@ -14888,6 +15944,9 @@ "tweetnacl": "^0.14.3" } }, + "big.js": { + "version": "5.2.2" + }, "binary-extensions": { "version": "2.2.0" }, @@ -14909,6 +15968,7 @@ }, "brace-expansion": { "version": "1.1.11", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14953,8 +16013,7 @@ "dev": true }, "buffer-from": { - "version": "1.1.2", - "dev": true + "version": "1.1.2" }, "cachedir": { "version": "2.3.0", @@ -14970,8 +16029,6 @@ }, "call-me-maybe": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, "callsites": { @@ -14982,14 +16039,14 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001314" + "version": "1.0.30001414" }, "caseless": { "version": "0.12.0", "dev": true }, "chakra-react-select": { - "version": "3.3.7", + "version": "3.3.8", "requires": { "@chakra-ui/form-control": "^1.0.0", "@chakra-ui/icon": "^2.0.0", @@ -15039,6 +16096,10 @@ } } }, + "chrome-trace-event": { + "version": "1.0.3", + "peer": true + }, "ci-info": { "version": "3.3.0", "dev": true @@ -15126,11 +16187,15 @@ "version": "1.8.2", "dev": true }, + "commondir": { + "version": "1.0.1" + }, "compute-scroll-into-view": { "version": "1.0.14" }, "concat-map": { - "version": "0.0.1" + "version": "0.0.1", + "dev": true }, "confusing-browser-globals": { "version": "1.0.11", @@ -15160,13 +16225,13 @@ "dev": true }, "cosmiconfig": { - "version": "6.0.0", + "version": "7.0.1", "requires": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" } }, "cross-env": { @@ -15178,6 +16243,7 @@ }, "cross-spawn": { "version": "7.0.3", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -15230,7 +16296,7 @@ "version": "3.0.10" }, "cypress": { - "version": "10.3.0", + "version": "10.7.0", "dev": true, "requires": { "@cypress/request": "^2.88.10", @@ -15278,7 +16344,7 @@ }, "dependencies": { "@types/node": { - "version": "14.18.21", + "version": "14.18.28", "dev": true }, "commander": { @@ -15362,7 +16428,7 @@ "requires": {} }, "dayjs": { - "version": "1.11.3", + "version": "1.11.5", "dev": true }, "debounce": { @@ -15387,7 +16453,8 @@ "dev": true }, "deep-is": { - "version": "0.1.4" + "version": "0.1.4", + "dev": true }, "deepmerge": { "version": "2.2.1" @@ -15484,6 +16551,9 @@ "version": "9.2.2", "dev": true }, + "emojis-list": { + "version": "3.0.0" + }, "end-of-stream": { "version": "1.4.4", "dev": true, @@ -15491,6 +16561,14 @@ "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.10.0", + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", "dev": true, @@ -15530,6 +16608,10 @@ "unbox-primitive": "^1.0.1" } }, + "es-module-lexer": { + "version": "0.9.3", + "peer": true + }, "es-to-primitive": { "version": "1.2.1", "dev": true, @@ -15596,6 +16678,7 @@ }, "eslint": { "version": "8.9.0", + "dev": true, "requires": { "@eslint/eslintrc": "^1.1.0", "@humanwhocodes/config-array": "^0.9.2", @@ -15636,6 +16719,7 @@ "dependencies": { "doctrine": { "version": "3.0.0", + "dev": true, "requires": { "esutils": "^2.0.2" } @@ -15847,10 +16931,12 @@ }, "eslint-plugin-simple-import-sort": { "version": "7.0.0", + "dev": true, "requires": {} }, "eslint-scope": { "version": "7.1.1", + "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -15858,20 +16944,24 @@ }, "eslint-utils": { "version": "3.0.0", + "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.1.0" + "version": "2.1.0", + "dev": true } } }, "eslint-visitor-keys": { - "version": "3.3.0" + "version": "3.3.0", + "dev": true }, "espree": { "version": "9.3.1", + "dev": true, "requires": { "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", @@ -15884,6 +16974,7 @@ }, "esquery": { "version": "1.4.0", + "dev": true, "requires": { "estraverse": "^5.1.0" } @@ -15898,16 +16989,15 @@ "version": "5.3.0" }, "esutils": { - "version": "2.0.3" + "version": "2.0.3", + "dev": true }, "eventemitter2": { - "version": "6.4.5", + "version": "6.4.8", "dev": true }, "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + "version": "3.3.0" }, "execa": { "version": "5.1.1", @@ -16007,7 +17097,8 @@ "version": "2.1.0" }, "fast-levenshtein": { - "version": "2.0.6" + "version": "2.0.6", + "dev": true }, "fastq": { "version": "1.13.0", @@ -16043,6 +17134,7 @@ }, "file-entry-cache": { "version": "6.0.1", + "dev": true, "requires": { "flat-cache": "^3.0.4" } @@ -16053,6 +17145,14 @@ "to-regex-range": "^5.0.1" } }, + "find-cache-dir": { + "version": "3.3.2", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-root": { "version": "1.1.0" }, @@ -16065,13 +17165,15 @@ }, "flat-cache": { "version": "3.0.4", + "dev": true, "requires": { "flatted": "^3.1.0", "rimraf": "^3.0.2" } }, "flatted": { - "version": "3.2.5" + "version": "3.2.5", + "dev": true }, "focus-lock": { "version": "0.9.2", @@ -16156,7 +17258,8 @@ } }, "fs.realpath": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "fsevents": { "version": "2.3.2", @@ -16166,7 +17269,8 @@ "version": "1.1.1" }, "functional-red-black-tree": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "gensync": { "version": "1.0.0-beta.2" @@ -16218,6 +17322,7 @@ }, "glob": { "version": "7.2.0", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16229,10 +17334,15 @@ }, "glob-parent": { "version": "6.0.2", + "dev": true, "requires": { "is-glob": "^4.0.3" } }, + "glob-to-regexp": { + "version": "0.4.1", + "peer": true + }, "global-dirs": { "version": "3.0.0", "dev": true, @@ -16242,6 +17352,7 @@ }, "globals": { "version": "13.12.1", + "dev": true, "requires": { "type-fest": "^0.20.2" } @@ -16259,13 +17370,10 @@ } }, "graceful-fs": { - "version": "4.2.9", - "dev": true + "version": "4.2.9" }, "graphql": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.5.0.tgz", - "integrity": "sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==" + "version": "16.5.0" }, "gzip-size": { "version": "6.0.0", @@ -16276,8 +17384,6 @@ }, "handlebars": { "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -16289,8 +17395,6 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -16324,9 +17428,7 @@ } }, "headers-polyfill": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-3.0.9.tgz", - "integrity": "sha512-FFIXpxbA9HZJXofXqS4IBRa7Z8F1Y+/DwxHSEOOTswZxym8Kz+f6DNhrtnCRcjWcTN7LjjbE5stz0UnoUPNprQ==" + "version": "3.0.7" }, "hey-listen": { "version": "1.0.8" @@ -16379,7 +17481,7 @@ "dev": true }, "i18n-iso-countries": { - "version": "7.4.0", + "version": "7.5.0", "requires": { "diacritics": "1.3.0" } @@ -16401,7 +17503,8 @@ "version": "1.2.1" }, "ignore": { - "version": "5.2.0" + "version": "5.2.0", + "dev": true }, "immer": { "version": "9.0.15", @@ -16424,7 +17527,8 @@ } }, "imurmurhash": { - "version": "0.1.4" + "version": "0.1.4", + "dev": true }, "indent-string": { "version": "4.0.0", @@ -16432,6 +17536,7 @@ }, "inflight": { "version": "1.0.6", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -16558,9 +17663,7 @@ "dev": true }, "is-node-process": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", - "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==" + "version": "1.0.1" }, "is-number": { "version": "7.0.0" @@ -16625,7 +17728,8 @@ } }, "isexe": { - "version": "2.0.0" + "version": "2.0.0", + "dev": true }, "isstream": { "version": "0.1.2", @@ -16923,24 +18027,6 @@ "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-jasmine2": { @@ -17142,24 +18228,6 @@ "jest-worker": "^27.5.1", "source-map-support": "^0.5.6", "throat": "^6.0.1" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "jest-runtime": { @@ -17318,8 +18386,21 @@ "string-length": "^4.0.1" } }, - "jose": { - "version": "4.5.0" + "jest-worker": { + "version": "27.5.1", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "requires": { + "has-flag": "^4.0.0" + } + } + } }, "js-levenshtein": { "version": "1.1.6" @@ -17382,8 +18463,6 @@ }, "json-schema-ref-parser": { "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", "dev": true, "requires": { "@apidevtools/json-schema-ref-parser": "9.0.9" @@ -17393,7 +18472,8 @@ "version": "0.4.1" }, "json-stable-stringify-without-jsonify": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", @@ -17463,6 +18543,7 @@ }, "levn": { "version": "0.4.1", + "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -17485,6 +18566,23 @@ "wrap-ansi": "^7.0.0" } }, + "loader-runner": { + "version": "4.3.0", + "peer": true + }, + "loader-utils": { + "version": "2.0.2", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "dependencies": { + "json5": { + "version": "2.2.1" + } + } + }, "locate-path": { "version": "2.0.0", "dev": true, @@ -17503,7 +18601,8 @@ "version": "4.0.8" }, "lodash.merge": { - "version": "4.6.2" + "version": "4.6.2", + "dev": true }, "lodash.mergewith": { "version": "4.6.2" @@ -17557,6 +18656,7 @@ }, "lru-cache": { "version": "6.0.0", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -17567,7 +18667,6 @@ }, "make-dir": { "version": "3.1.0", - "dev": true, "requires": { "semver": "^6.0.0" } @@ -17583,8 +18682,7 @@ "version": "5.2.1" }, "merge-stream": { - "version": "2.0.0", - "dev": true + "version": "2.0.0" }, "merge2": { "version": "1.4.1", @@ -17599,12 +18697,10 @@ } }, "mime-db": { - "version": "1.51.0", - "dev": true + "version": "1.51.0" }, "mime-types": { "version": "2.1.34", - "dev": true, "requires": { "mime-db": "1.51.0" } @@ -17618,6 +18714,7 @@ }, "minimatch": { "version": "3.0.4", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -17625,6 +18722,10 @@ "minimist": { "version": "1.2.6" }, + "monaco-editor": { + "version": "0.34.0", + "peer": true + }, "mrmime": { "version": "1.0.0", "dev": true @@ -17634,8 +18735,6 @@ }, "msw": { "version": "0.43.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-0.43.1.tgz", - "integrity": "sha512-wzhPpL6RsiYkyIUlTCg0aZY0aRZa4Eiubd6MOA5oJVgfuapDmvZrI8OMi4h4e+fpHD+Qsy+4unAjv3wpWia5yw==", "requires": { "@mswjs/cookies": "^0.2.0", "@mswjs/interceptors": "^0.16.3", @@ -17661,8 +18760,6 @@ "dependencies": { "chalk": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17717,18 +18814,14 @@ "version": "3.3.2" }, "narrow-minded": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/narrow-minded/-/narrow-minded-1.1.1.tgz", - "integrity": "sha512-X5wagoCtdl7kRn7vGgObAKDp447f5nuEi+kaa47gm5TGwnjTWaddMTI8FG06hdzZTtOCw8mQ+dSGT6MU+bhppg==" + "version": "1.1.1" }, "natural-compare": { - "version": "1.4.0" + "version": "1.4.0", + "dev": true }, "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "version": "2.6.2" }, "next": { "version": "12.1.0", @@ -17751,26 +18844,20 @@ "use-subscription": "1.5.1" } }, - "next-auth": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.10.3.tgz", - "integrity": "sha512-7zc4aXYc/EEln7Pkcsn21V1IevaTZsMLJwapfbnKA4+JY0+jFzWbt5p/ljugesGIrN4VOZhpZIw50EaFZyghJQ==", - "requires": { - "@babel/runtime": "^7.16.3", - "@panva/hkdf": "^1.0.1", - "cookie": "^0.4.1", - "jose": "^4.3.7", - "oauth": "^0.9.15", - "openid-client": "^5.1.0", - "preact": "^10.6.3", - "preact-render-to-string": "^5.1.19", - "uuid": "^8.3.2" - } - }, "next-redux-wrapper": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/next-redux-wrapper/-/next-redux-wrapper-7.0.5.tgz", + "integrity": "sha512-UFXdAWG5i+GFT8+Hoqpx3GArkPh34fVWF9YoA2VSHlBzsrPtnRd7NWM6FNSYUennpommTpWJ09mu+r/1UxyIkg==", "requires": {} }, + "next-remove-imports": { + "version": "1.0.7", + "requires": { + "@babel/core": "^7.14.3", + "babel-loader": "^8.2.2", + "babel-plugin-transform-remove-imports": "^1.5.4" + } + }, "node-int64": { "version": "0.4.0", "dev": true @@ -17792,15 +18879,9 @@ "version": "2.2.0", "dev": true }, - "oauth": { - "version": "0.9.15" - }, "object-assign": { "version": "4.1.1" }, - "object-hash": { - "version": "2.2.0" - }, "object-inspect": { "version": "1.12.0", "dev": true @@ -17854,11 +18935,9 @@ "es-abstract": "^1.19.1" } }, - "oidc-token-hash": { - "version": "5.0.1" - }, "once": { "version": "1.4.0", + "dev": true, "requires": { "wrappy": "1" } @@ -17871,8 +18950,6 @@ }, "openapi-typescript-codegen": { "version": "0.20.1", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.20.1.tgz", - "integrity": "sha512-07Fn/es5a3G696tyqkukmgOr/xH3vGnAp32dQO1mb4mSWmIEgtkMtjm+p7htphGhH0jLX1ruPaGfzU+WkdvIGw==", "dev": true, "requires": { "camelcase": "^6.3.0", @@ -17883,14 +18960,10 @@ "dependencies": { "camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true }, "commander": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", - "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", + "version": "9.4.0", "dev": true } } @@ -17899,17 +18972,9 @@ "version": "1.5.2", "dev": true }, - "openid-client": { - "version": "5.1.3", - "requires": { - "jose": "^4.1.4", - "lru-cache": "^6.0.0", - "object-hash": "^2.0.1", - "oidc-token-hash": "^5.0.1" - } - }, "optionator": { "version": "0.9.1", + "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -17941,9 +19006,7 @@ "dev": true }, "outvariant": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", - "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==" + "version": "1.3.0" }, "p-limit": { "version": "1.3.0", @@ -17994,18 +19057,18 @@ "dev": true }, "path-is-absolute": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "path-key": { - "version": "3.1.1" + "version": "3.1.1", + "dev": true }, "path-parse": { "version": "1.0.7" }, "path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" + "version": "6.2.1" }, "path-type": { "version": "4.0.0" @@ -18034,14 +19097,12 @@ }, "pkg-dir": { "version": "4.2.0", - "dev": true, "requires": { "find-up": "^4.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -18049,32 +19110,27 @@ }, "locate-path": { "version": "5.0.0", - "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", - "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", - "dev": true, "requires": { "p-limit": "^2.2.0" } }, "p-try": { - "version": "2.2.0", - "dev": true + "version": "2.2.0" }, "path-exists": { - "version": "4.0.0", - "dev": true + "version": "4.0.0" } } }, @@ -18103,28 +19159,18 @@ "source-map-js": "^1.0.1" } }, - "preact": { - "version": "10.6.6" - }, - "preact-render-to-string": { - "version": "5.1.19", - "requires": { - "pretty-format": "^3.8.0" - } - }, "prelude-ls": { - "version": "1.2.1" + "version": "1.2.1", + "dev": true }, "prettier": { - "version": "2.6.2" + "version": "2.6.2", + "dev": true }, "pretty-bytes": { "version": "5.6.0", "dev": true }, - "pretty-format": { - "version": "3.8.0" - }, "prompts": { "version": "2.4.2", "dev": true, @@ -18171,6 +19217,13 @@ "version": "1.2.3", "dev": true }, + "randombytes": { + "version": "2.1.0", + "peer": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react": { "version": "17.0.2", "requires": { @@ -18195,6 +19248,10 @@ "react-fast-compare": { "version": "3.2.0" }, + "react-feature-flags": { + "version": "1.0.0", + "requires": {} + }, "react-focus-lock": { "version": "2.5.2", "requires": { @@ -18256,7 +19313,7 @@ } }, "react-select": { - "version": "5.3.2", + "version": "5.4.0", "requires": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -18281,7 +19338,7 @@ } }, "react-transition-group": { - "version": "4.4.2", + "version": "4.4.5", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -18323,6 +19380,10 @@ "@babel/runtime": "^7.9.2" } }, + "redux-persist": { + "version": "6.0.0", + "requires": {} + }, "redux-thunk": { "version": "2.4.1", "requires": {} @@ -18339,7 +19400,8 @@ } }, "regexpp": { - "version": "3.2.0" + "version": "3.2.0", + "dev": true }, "request-progress": { "version": "3.0.0", @@ -18399,6 +19461,7 @@ }, "rimraf": { "version": "3.0.2", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -18439,22 +19502,37 @@ "object-assign": "^4.1.1" } }, + "schema-utils": { + "version": "2.7.1", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "6.3.0" }, + "serialize-javascript": { + "version": "6.0.0", + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "set-cookie-parser": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz", - "integrity": "sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w==" + "version": "2.4.8" }, "shebang-command": { "version": "2.0.0", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "3.0.0" + "version": "3.0.0", + "dev": true }, "side-channel": { "version": "1.0.4", @@ -18511,15 +19589,13 @@ }, "source-map-support": { "version": "0.5.21", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.6.1", - "dev": true + "version": "0.6.1" } } }, @@ -18555,13 +19631,14 @@ } } }, + "state-local": { + "version": "1.0.7" + }, "statuses": { "version": "2.0.1" }, "strict-event-emitter": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.2.4.tgz", - "integrity": "sha512-xIqTLS5azUH1djSUsLH9DbP6UnM/nI18vu8d43JigCQEoVsnY+mrlE+qv6kYqs6/1OkMnMIiL6ffedQSZStuoQ==", "requires": { "events": "^3.3.0" } @@ -18650,7 +19727,8 @@ } }, "strip-json-comments": { - "version": "3.1.1" + "version": "3.1.1", + "dev": true }, "style-value-types": { "version": "5.0.0", @@ -18687,6 +19765,10 @@ "version": "3.2.4", "dev": true }, + "tapable": { + "version": "2.2.1", + "peer": true + }, "terminal-link": { "version": "2.1.1", "dev": true, @@ -18695,6 +19777,44 @@ "supports-hyperlinks": "^2.0.0" } }, + "terser": { + "version": "5.15.0", + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "peer": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "test-exclude": { "version": "6.0.0", "dev": true, @@ -18705,7 +19825,8 @@ } }, "text-table": { - "version": "0.2.0" + "version": "0.2.0", + "dev": true }, "throat": { "version": "6.0.1", @@ -18808,6 +19929,7 @@ }, "type-check": { "version": "0.4.0", + "dev": true, "requires": { "prelude-ls": "^1.2.1" } @@ -18817,7 +19939,8 @@ "dev": true }, "type-fest": { - "version": "0.20.2" + "version": "0.20.2", + "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", @@ -18831,9 +19954,7 @@ "devOptional": true }, "uglify-js": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.2.tgz", - "integrity": "sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg==", + "version": "3.17.0", "dev": true, "optional": true }, @@ -18887,10 +20008,12 @@ "version": "1.0.2" }, "uuid": { - "version": "8.3.2" + "version": "8.3.2", + "dev": true }, "v8-compile-cache": { - "version": "2.3.0" + "version": "2.3.0", + "dev": true }, "v8-to-istanbul": { "version": "8.1.1", @@ -18937,6 +20060,14 @@ "loose-envify": "^1.0.0" } }, + "watchpack": { + "version": "2.4.0", + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "wcwidth": { "version": "1.0.1", "requires": { @@ -18947,6 +20078,59 @@ "version": "6.1.0", "dev": true }, + "webpack": { + "version": "5.74.0", + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "peer": true + }, + "schema-utils": { + "version": "3.1.1", + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "webpack-bundle-analyzer": { "version": "4.3.0", "dev": true, @@ -18962,6 +20146,10 @@ "ws": "^7.3.1" } }, + "webpack-sources": { + "version": "3.2.3", + "peer": true + }, "whatwg-encoding": { "version": "1.0.5", "dev": true, @@ -18987,6 +20175,7 @@ }, "which": { "version": "2.0.2", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -19003,12 +20192,11 @@ } }, "word-wrap": { - "version": "1.2.3" + "version": "1.2.3", + "dev": true }, "wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "wrap-ansi": { @@ -19020,7 +20208,8 @@ } }, "wrappy": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "write-file-atomic": { "version": "3.0.3", @@ -19049,7 +20238,8 @@ "version": "5.0.8" }, "yallist": { - "version": "4.0.0" + "version": "4.0.0", + "dev": true }, "yaml": { "version": "1.10.2" diff --git a/clients/ctl/admin-ui/package.json b/clients/admin-ui/package.json similarity index 78% rename from clients/ctl/admin-ui/package.json rename to clients/admin-ui/package.json index 9aab7955f3..2ede6c5d7f 100644 --- a/clients/ctl/admin-ui/package.json +++ b/clients/admin-ui/package.json @@ -1,39 +1,43 @@ { - "name": "ctl-admin-ui", + "name": "admin-ui", "private": true, "scripts": { - "dev": "next dev", - "dev-docker": "test -d node_modules || npm install && npm run dev", - "dev:mock": "echo '🚨 Running with mock API'; NEXT_PUBLIC_MOCK_API=true next dev", - "build": "next build", - "start": "next start", - "lint": "eslint . --ext .ts,.tsx", - "test": "jest --watch", - "test:ci": "jest", "analyze": "cross-env ANALYZE=true next build", - "analyze:server": "cross-env BUNDLE_ANALYZE=server next build", "analyze:browser": "cross-env BUNDLE_ANALYZE=browser next build", - "export": "next build && next export", - "copy-export": "mkdir -p ../../../src/fidesctl/ui-build/static/admin/ && rsync -a --delete out/ ../../../src/fidesctl/ui-build/static/admin/", - "prod-export": "npm run export && npm run copy-export", + "analyze:server": "cross-env BUNDLE_ANALYZE=server next build", + "build": "next build", + "chrome:debug": "BROWSER='google chrome' BROWSER_ARGS='--remote-debugging-port=9222' npm run dev", + "copy-export": "mkdir -p ../../src/fides/ui-build/static/admin/ && rsync -a --delete out/ ../../src/fides/ui-build/static/admin/", "cy:open": "cypress open", "cy:run": "cypress run", "cy:start": "next build && NODE_ENV=test next start", - "openapi:generate": "openapi --input http://localhost:8080/openapi.json --output ./src/types/api --exportCore false --exportServices false --indent 2" + "dev": "next dev", + "dev:mock": "echo '🚨 Running with mock API'; NEXT_PUBLIC_MOCK_API=true next dev", + "export": "next build && next export", + "prod-export": "npm run export && npm run copy-export", + "format": "prettier --write src __tests__/", + "format:ci": "prettier --check src __tests__/", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "eslint . --fix --ext .ts,.tsx", + "openapi:generate": "openapi --input http://localhost:8080/openapi.json --output ./src/types/api --exportCore false --exportServices false --indent 2", + "start": "next start", + "test": "jest --watch", + "test:ci": "jest" }, "dependencies": { + "@chakra-ui/icons": "^1.1.7", "@chakra-ui/react": "^1.8.0", - "@chakra-ui/system": ">=1.0.0", - "@chakra-ui/utils": "^1.10.4", + "@chakra-ui/system": "^1.12.1", + "@chakra-ui/utils": "^2.0.9", "@emotion/react": "^11", "@emotion/styled": "^11", "@fidesui/react": "^0.0.12", "@fontsource/inter": "^4.5.4", + "@monaco-editor/react": "^4.4.5", "@reduxjs/toolkit": "^1.8.0", "chakra-react-select": "^3.3.7", "date-fns": "^2.28.0", "date-fns-tz": "^1.3.1", - "eslint-plugin-simple-import-sort": "^7.0.0", "formik": "^2.2.9", "framer-motion": "^5", "i18n-iso-countries": "^7.4.0", @@ -43,12 +47,13 @@ "msw": "^0.43.0", "narrow-minded": "^1.1.1", "next": "12.1.0", - "next-auth": "^4.10.3", + "next-remove-imports": "^1.0.7", "next-redux-wrapper": "^7.0.5", - "prettier": "^2.6.2", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-feature-flags": "^1.0.0", "react-redux": "^7.2.6", + "redux-persist": "^6.0.0", "whatwg-fetch": "^3.6.2", "yup": "^0.32.11" }, @@ -60,6 +65,7 @@ "@types/lodash.debounce": "^4.0.6", "@types/node": "17.0.10", "@types/react": "17.0.38", + "@types/react-redux": "^7.1.24", "@typescript-eslint/eslint-plugin": "^5.12.0", "@typescript-eslint/parser": "^5.12.0", "babel-jest": "^27.5.1", @@ -76,9 +82,11 @@ "eslint-plugin-no-only-tests": "^3.0.0", "eslint-plugin-react": "^7.28.0", "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-simple-import-sort": "^7.0.0", "identity-obj-proxy": "^3.0.0", "jest": "^27.5.1", "openapi-typescript-codegen": "^0.20.1", + "prettier": "^2.6.2", "typescript": "4.5.5" }, "msw": { diff --git a/clients/ctl/admin-ui/public/favicon.ico b/clients/admin-ui/public/favicon.ico similarity index 100% rename from clients/ctl/admin-ui/public/favicon.ico rename to clients/admin-ui/public/favicon.ico diff --git a/clients/admin-ui/public/images/connector-logos/adobe.svg b/clients/admin-ui/public/images/connector-logos/adobe.svg new file mode 100644 index 0000000000..fadef181c6 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/adobe.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/ethyca.svg b/clients/admin-ui/public/images/connector-logos/ethyca.svg new file mode 100644 index 0000000000..32e4384dbe --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/ethyca.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/hubspot.svg b/clients/admin-ui/public/images/connector-logos/hubspot.svg new file mode 100644 index 0000000000..e7afe860e6 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/hubspot.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/mailchimp.svg b/clients/admin-ui/public/images/connector-logos/mailchimp.svg new file mode 100644 index 0000000000..28edc6cf3e --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/mailchimp.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/manual_webhook.svg b/clients/admin-ui/public/images/connector-logos/manual_webhook.svg new file mode 100644 index 0000000000..d608862606 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/manual_webhook.svg @@ -0,0 +1,3 @@ + + + diff --git a/clients/admin-ui/public/images/connector-logos/mariadb.svg b/clients/admin-ui/public/images/connector-logos/mariadb.svg new file mode 100644 index 0000000000..858b783897 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/mariadb.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/mongodb.svg b/clients/admin-ui/public/images/connector-logos/mongodb.svg new file mode 100644 index 0000000000..e77df3fa46 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/mongodb.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/mysql.svg b/clients/admin-ui/public/images/connector-logos/mysql.svg new file mode 100644 index 0000000000..d173889369 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/mysql.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/outreach.svg b/clients/admin-ui/public/images/connector-logos/outreach.svg new file mode 100644 index 0000000000..769fbb2c5e --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/outreach.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/postgres.svg b/clients/admin-ui/public/images/connector-logos/postgres.svg new file mode 100644 index 0000000000..65080d8212 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/postgres.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/redshift.svg b/clients/admin-ui/public/images/connector-logos/redshift.svg new file mode 100644 index 0000000000..1d9993f6e0 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/redshift.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/salesforce.svg b/clients/admin-ui/public/images/connector-logos/salesforce.svg new file mode 100644 index 0000000000..d10da329dc --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/salesforce.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/segment.svg b/clients/admin-ui/public/images/connector-logos/segment.svg new file mode 100644 index 0000000000..a84f3677d0 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/segment.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/sentry.svg b/clients/admin-ui/public/images/connector-logos/sentry.svg new file mode 100644 index 0000000000..e2e3be20ed --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/sentry.svg @@ -0,0 +1,4 @@ + + + + diff --git a/clients/admin-ui/public/images/connector-logos/snowflake.svg b/clients/admin-ui/public/images/connector-logos/snowflake.svg new file mode 100644 index 0000000000..8b2c3c25c0 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/snowflake.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/sqlserver.svg b/clients/admin-ui/public/images/connector-logos/sqlserver.svg new file mode 100644 index 0000000000..a6bea42b26 --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/sqlserver.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/stripe.svg b/clients/admin-ui/public/images/connector-logos/stripe.svg new file mode 100644 index 0000000000..e41146fffe --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/stripe.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/clients/admin-ui/public/images/connector-logos/zendesk.svg b/clients/admin-ui/public/images/connector-logos/zendesk.svg new file mode 100644 index 0000000000..198243423a --- /dev/null +++ b/clients/admin-ui/public/images/connector-logos/zendesk.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/clients/ctl/admin-ui/public/logo-icon.svg b/clients/admin-ui/public/logo-icon.svg similarity index 100% rename from clients/ctl/admin-ui/public/logo-icon.svg rename to clients/admin-ui/public/logo-icon.svg diff --git a/clients/admin-ui/public/logo.svg b/clients/admin-ui/public/logo.svg new file mode 100644 index 0000000000..9b705e2bf7 --- /dev/null +++ b/clients/admin-ui/public/logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/clients/admin-ui/src/app/hooks.ts b/clients/admin-ui/src/app/hooks.ts new file mode 100644 index 0000000000..9951e807dd --- /dev/null +++ b/clients/admin-ui/src/app/hooks.ts @@ -0,0 +1,7 @@ +import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux"; + +import type { AppDispatch, RootState } from "./store"; + +export const useAppDispatch: () => AppDispatch = useDispatch; +// eslint-disable-next-line import/prefer-default-export +export const useAppSelector: TypedUseSelectorHook = useSelector; diff --git a/clients/admin-ui/src/app/store.ts b/clients/admin-ui/src/app/store.ts new file mode 100644 index 0000000000..9a19e15355 --- /dev/null +++ b/clients/admin-ui/src/app/store.ts @@ -0,0 +1,206 @@ +import { + AnyAction, + combineReducers, + configureStore, + StateFromReducersMapObject, +} from "@reduxjs/toolkit"; +import { setupListeners } from "@reduxjs/toolkit/query/react"; +import { + connectionTypeApi, + reducer as connectionTypeReducer, +} from "connection-type/index"; +import { + datastoreConnectionApi, + reducer as datastoreConnectionReducer, +} from "datastore-connections/index"; +import { + privacyRequestApi, + reducer as privacyRequestsReducer, +} from "privacy-requests/index"; +import { + FLUSH, + PAUSE, + PERSIST, + persistReducer, + persistStore, + PURGE, + REGISTER, + REHYDRATE, +} from "redux-persist"; +import createWebStorage from "redux-persist/lib/storage/createWebStorage"; +import { + reducer as userManagementReducer, + userApi, +} from "user-management/index"; + +import { STORAGE_ROOT_KEY } from "~/constants"; +import { plusApi } from "~/features/common/plus.slice"; +import { reducer as configWizardReducer } from "~/features/config-wizard/config-wizard.slice"; +import { scannerApi } from "~/features/config-wizard/scanner.slice"; +import { + dataQualifierApi, + reducer as dataQualifierReducer, +} from "~/features/data-qualifier/data-qualifier.slice"; +import { + dataSubjectsApi, + reducer as dataSubjectsReducer, +} from "~/features/data-subjects/data-subject.slice"; +import { + dataUseApi, + reducer as dataUseReducer, +} from "~/features/data-use/data-use.slice"; +import { datasetApi, reducer as datasetReducer } from "~/features/dataset"; +import { + organizationApi, + reducer as organizationReducer, +} from "~/features/organization"; +import { reducer as systemReducer, systemApi } from "~/features/system"; +import { reducer as taxonomyReducer, taxonomyApi } from "~/features/taxonomy"; +import { reducer as userReducer } from "~/features/user"; + +// import { createWrapper } from "next-redux-wrapper"; +import { authApi, AuthState, reducer as authReducer } from "../features/auth"; + +/** + * To prevent the "redux-perist failed to create sync storage. falling back to noop storage" + * console message within Next.js, the following snippet is required. + * {@https://mightycoders.xyz/redux-persist-failed-to-create-sync-storage-falling-back-to-noop-storage} + */ +const createNoopStorage = () => ({ + getItem() { + return Promise.resolve(null); + }, + setItem(_key: any, value: any) { + return Promise.resolve(value); + }, + removeItem() { + return Promise.resolve(); + }, +}); + +const storage = + typeof window !== "undefined" + ? createWebStorage("local") + : createNoopStorage(); + +const reducer = { + [privacyRequestApi.reducerPath]: privacyRequestApi.reducer, + subjectRequests: privacyRequestsReducer, + [userApi.reducerPath]: userApi.reducer, + [authApi.reducerPath]: authApi.reducer, + userManagement: userManagementReducer, + [datastoreConnectionApi.reducerPath]: datastoreConnectionApi.reducer, + datastoreConnections: datastoreConnectionReducer, + auth: authReducer, + [connectionTypeApi.reducerPath]: connectionTypeApi.reducer, + connectionType: connectionTypeReducer, + configWizard: configWizardReducer, + user: userReducer, + dataset: datasetReducer, + taxonomy: taxonomyReducer, + dataQualifier: dataQualifierReducer, + dataSubjects: dataSubjectsReducer, + dataUse: dataUseReducer, + organization: organizationReducer, + system: systemReducer, + [datasetApi.reducerPath]: datasetApi.reducer, + [organizationApi.reducerPath]: organizationApi.reducer, + [scannerApi.reducerPath]: scannerApi.reducer, + [systemApi.reducerPath]: systemApi.reducer, + [taxonomyApi.reducerPath]: taxonomyApi.reducer, + [dataQualifierApi.reducerPath]: dataQualifierApi.reducer, + [dataSubjectsApi.reducerPath]: dataSubjectsApi.reducer, + [dataUseApi.reducerPath]: dataUseApi.reducer, + [plusApi.reducerPath]: plusApi.reducer, + [datastoreConnectionApi.reducerPath]: datastoreConnectionApi.reducer, + [userApi.reducerPath]: userApi.reducer, +}; + +const allReducers = combineReducers(reducer); + +const rootReducer = (state: any, action: AnyAction) => { + let newState = { ...state }; + if (action.type === "auth/logout") { + storage.removeItem(STORAGE_ROOT_KEY); + newState = undefined; + } + return allReducers(newState, action); +}; + +const persistConfig = { + key: "root", + storage, + /* + NOTE: It is also strongly recommended to blacklist any api(s) that you have configured with RTK Query. + If the api slice reducer is not blacklisted, the api cache will be automatically persisted + and restored which could leave you with phantom subscriptions from components that do not exist any more. + (https://redux-toolkit.js.org/usage/usage-guide#use-with-redux-persist) + */ + blacklist: [ + authApi.reducerPath, + connectionTypeApi.reducerPath, + datastoreConnectionApi.reducerPath, + privacyRequestApi.reducerPath, + userApi.reducerPath, + ], +}; + +const persistedReducer = persistReducer(persistConfig, rootReducer); + +export type RootState = StateFromReducersMapObject; + +export const makeStore = (preloadedState?: Partial) => + configureStore({ + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + }, + }).concat( + privacyRequestApi.middleware, + userApi.middleware, + authApi.middleware, + datastoreConnectionApi.middleware, + connectionTypeApi.middleware, + datasetApi.middleware, + organizationApi.middleware, + scannerApi.middleware, + systemApi.middleware, + taxonomyApi.middleware, + dataQualifierApi.middleware, + dataSubjectsApi.middleware, + dataUseApi.middleware, + plusApi.middleware + ), + devTools: true, + preloadedState, + }); + +let storedAuthState: AuthState | undefined; +if (typeof window !== "undefined" && "localStorage" in window) { + const storedAuthStateString = localStorage.getItem(STORAGE_ROOT_KEY); + if (storedAuthStateString) { + try { + storedAuthState = JSON.parse(storedAuthStateString); + } catch (error) { + // TODO: build in formal error logging system + // eslint-disable-next-line no-console + console.error(error); + } + } +} + +const store = makeStore({ + auth: storedAuthState, +}); + +type AppStore = ReturnType; +export type AppDispatch = AppStore["dispatch"]; + +export const persistor = persistStore(store); + +setupListeners(store.dispatch); + +export default store; +// export const wrapper = createWrapper(makeStore); diff --git a/clients/admin-ui/src/constants.ts b/clients/admin-ui/src/constants.ts new file mode 100644 index 0000000000..a19b532f95 --- /dev/null +++ b/clients/admin-ui/src/constants.ts @@ -0,0 +1,117 @@ +import { UserPrivileges } from "user-management/types"; + +export const BASE_API_URN = "/api/v1"; +const API_URL = process.env.NEXT_PUBLIC_FIDESOPS_API + ? process.env.NEXT_PUBLIC_FIDESOPS_API + : ""; +export const BASE_URL = API_URL + BASE_API_URN; + +/** + * Redux-persist storage root key + */ +export const STORAGE_ROOT_KEY = "persist:root"; + +export const USER_PRIVILEGES: UserPrivileges[] = [ + { + privilege: "View subject requests", + scope: "privacy-request:read", + }, + { + privilege: "Approve subject requests", + scope: "privacy-request:review", + }, + { + privilege: "Resume subject requests", + scope: "privacy-request:resume", + }, + { + privilege: "View datastore connections", + scope: "connection:read", + }, + { + privilege: "Create or Update datastore connections", + scope: "connection:create_or_update", + }, + { + privilege: "Instantiate connections to SaaS datastores", + scope: "connection:instantiate", + }, + { + privilege: "Read connection types", + scope: "connection_type:read", + }, + { + privilege: "Delete datastore connections", + scope: "connection:delete", + }, + { + privilege: "View user consent preferences", + scope: "consent:read", + }, + { + privilege: "View Datasets", + scope: "dataset:read", + }, + { + privilege: "Create or Update Datasets", + scope: "dataset:create_or_update", + }, + { + privilege: "Delete Datasets", + scope: "dataset:delete", + }, + { + privilege: "View policies", + scope: "policy:read", + }, + { + privilege: "Create policies", + scope: "policy:create_or_update", + }, + { + privilege: "View users", + scope: "user:read", + }, + { + privilege: "Create users", + scope: "user:create", + }, + { + privilege: "Create roles", + scope: "user-permission:create", + }, + { + privilege: "View roles", + scope: "user-permission:read", + }, + { + privilege: "Upload privacy request data", + scope: "privacy-request:upload_data", + }, + { + privilege: "View privacy request data", + scope: "privacy-request:view_data", + }, + { + privilege: "Create manual webhooks", + scope: "webhook:create_or_update", + }, + { + privilege: "Read manual webhooks", + scope: "webhook:read", + }, + { + privilege: "Delete manual webhooks", + scope: "webhook:delete", + }, +]; + +// API ROUTES +export const INDEX_ROUTE = "/"; +export const LOGIN_ROUTE = "/login"; +export const USER_MANAGEMENT_ROUTE = "/user-management"; +export const CONNECTION_ROUTE = "/connection"; +export const CONNECTION_TYPE_ROUTE = "/connection_type"; + +// UI ROUTES +export const DATASTORE_CONNECTION_ROUTE = "/datastore-connection"; diff --git a/clients/ctl/admin-ui/src/features/YamlForm.tsx b/clients/admin-ui/src/features/YamlForm.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/YamlForm.tsx rename to clients/admin-ui/src/features/YamlForm.tsx diff --git a/clients/admin-ui/src/features/auth/ProtectedRoute.tsx b/clients/admin-ui/src/features/auth/ProtectedRoute.tsx new file mode 100644 index 0000000000..8c6dddc948 --- /dev/null +++ b/clients/admin-ui/src/features/auth/ProtectedRoute.tsx @@ -0,0 +1,40 @@ +import { useRouter } from "next/router"; +import { useSelector } from "react-redux"; + +import { LOGIN_ROUTE } from "../../constants"; +import { selectToken } from "./auth.slice"; + +const useProtectedRoute = (redirectUrl: string) => { + const router = useRouter(); + const token = useSelector(selectToken); + + // TODO: check for token invalidation + if (!token && typeof window !== "undefined") { + router.push(redirectUrl); + return false; + } + + return true; +}; + +interface ProtectedRouteProps { + redirectUrl: string; + authenticatedBlock: JSX.Element; + children: JSX.Element; +} + +const ProtectedRoute = ({ + children, + redirectUrl, + authenticatedBlock, +}: ProtectedRouteProps) => { + const authenticated = useProtectedRoute(redirectUrl); + return authenticated ? children : authenticatedBlock; +}; + +ProtectedRoute.defaultProps = { + authenticatedBlock: null, + redirectUrl: LOGIN_ROUTE, +}; + +export default ProtectedRoute; diff --git a/clients/admin-ui/src/features/auth/__tests__/ProtectedRoute.test.tsx b/clients/admin-ui/src/features/auth/__tests__/ProtectedRoute.test.tsx new file mode 100644 index 0000000000..4799786b52 --- /dev/null +++ b/clients/admin-ui/src/features/auth/__tests__/ProtectedRoute.test.tsx @@ -0,0 +1,110 @@ +import { render, screen } from "../../../../__tests__/test-utils"; +import { LOGIN_ROUTE } from "../../../constants"; +import ProtectedRoute from "../ProtectedRoute"; + +const useRouter = jest.spyOn(require("next/router"), "useRouter"); + +const preloadedLoginState = { + auth: { + user: { + username: "Test", + }, + token: "Valid Token", + }, +}; + +describe("ProtectedRoute", () => { + describe("when user is not logged in", () => { + it("should render provided fallback component before redirecting", () => { + useRouter.mockImplementationOnce(() => ({ + push: () => {}, + })); + render( + Not Authorized}> +
Protected Page
+
, + { + preloadedState: {}, + } + ); + + const unauthorizedMessage = screen.getByText("Not Authorized"); + const protectedContent = screen.queryByText("Protected Page"); + expect(unauthorizedMessage).toBeInTheDocument(); + expect(protectedContent).toBeNull(); + }); + + it(`should default to redirecting to ${LOGIN_ROUTE}`, () => { + const push = jest.fn(); + useRouter.mockImplementationOnce(() => ({ + push, + })); + + render( + +
Protected Page
+
, + { + preloadedState: {}, + } + ); + + expect(push).toHaveBeenCalledWith(LOGIN_ROUTE); + }); + + it("should redirect to specified route", () => { + const push = jest.fn(); + useRouter.mockImplementationOnce(() => ({ + push, + })); + + render( + +
Protected Page
+
, + { + preloadedState: {}, + } + ); + + expect(push).toHaveBeenCalledWith("some/other/page"); + }); + }); + + describe("when the user is logged in", () => { + it("should not redirect", () => { + const push = jest.fn(); + useRouter.mockImplementationOnce(() => ({ + push, + })); + render( + +
Protected Page
+
, + { + preloadedState: preloadedLoginState, + } + ); + expect(push).toBeCalledTimes(0); + }); + + it("should render passed children", () => { + const push = jest.fn(); + useRouter.mockImplementationOnce(() => ({ + push, + })); + + render( + +
Protected Page
+
, + { + preloadedState: preloadedLoginState, + } + ); + + const protectedContent = screen.getByText("Protected Page"); + expect(protectedContent).toBeInTheDocument(); + }); + }); +}); diff --git a/clients/admin-ui/src/features/auth/auth.slice.ts b/clients/admin-ui/src/features/auth/auth.slice.ts new file mode 100644 index 0000000000..3486f0b969 --- /dev/null +++ b/clients/admin-ui/src/features/auth/auth.slice.ts @@ -0,0 +1,112 @@ +import { + createListenerMiddleware, + createSlice, + PayloadAction, +} from "@reduxjs/toolkit"; +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import { addCommonHeaders } from "common/CommonHeaders"; +import { utf8ToB64 } from "common/utils"; +import { User } from "user-management/types"; + +import type { RootState } from "../../app/store"; +import { BASE_URL, STORAGE_ROOT_KEY } from "../../constants"; +import { + LoginRequest, + LoginResponse, + LogoutRequest, + LogoutResponse, +} from "./types"; + +export interface AuthState { + user: User | null; + token: string | null; +} + +const initialState: AuthState = { + token: null, + user: null, +}; + +// Auth slice +export const authSlice = createSlice({ + name: "auth", + initialState, + reducers: { + login( + state, + { payload: { user_data, token_data } }: PayloadAction + ) { + return Object.assign(state, { + user: user_data, + token: token_data.access_token, + }); + }, + logout(state) { + return Object.assign(state, { + user: null, + token: null, + }); + }, + }, +}); + +export const selectAuth = (state: RootState) => state.auth; +export const selectUser = (state: RootState) => selectAuth(state).user; +export const selectToken = (state: RootState) => selectAuth(state).token; + +export const { login, logout } = authSlice.actions; + +export const credentialStorage = createListenerMiddleware(); +credentialStorage.startListening({ + actionCreator: login, + effect: (action, { getState }) => { + if (window && window.localStorage) { + localStorage.setItem( + STORAGE_ROOT_KEY, + JSON.stringify(selectAuth(getState() as RootState)) + ); + } + }, +}); +credentialStorage.startListening({ + actionCreator: logout, + effect: () => { + if (window && window.localStorage) { + localStorage.removeItem(STORAGE_ROOT_KEY); + } + }, +}); + +// Auth API +export const authApi = createApi({ + reducerPath: "authApi", + baseQuery: fetchBaseQuery({ + baseUrl: BASE_URL, + prepareHeaders: (headers, { getState }) => { + const token: string | null = selectToken(getState() as RootState); + addCommonHeaders(headers, token); + return headers; + }, + }), + tagTypes: ["Auth"], + endpoints: (build) => ({ + login: build.mutation({ + query: (credentials) => ({ + url: "login", + method: "POST", + body: { ...credentials, password: utf8ToB64(credentials.password) }, + }), + invalidatesTags: () => ["Auth"], + }), + logout: build.mutation({ + query: () => ({ + url: "logout", + method: "POST", + }), + invalidatesTags: () => ["Auth"], + }), + }), +}); + +export const { useLoginMutation, useLogoutMutation } = authApi; +export const { reducer } = authSlice; diff --git a/clients/admin-ui/src/features/auth/index.ts b/clients/admin-ui/src/features/auth/index.ts new file mode 100644 index 0000000000..900c0f587e --- /dev/null +++ b/clients/admin-ui/src/features/auth/index.ts @@ -0,0 +1 @@ +export * from "./auth.slice"; diff --git a/clients/admin-ui/src/features/auth/types.ts b/clients/admin-ui/src/features/auth/types.ts new file mode 100644 index 0000000000..4490b63ce9 --- /dev/null +++ b/clients/admin-ui/src/features/auth/types.ts @@ -0,0 +1,16 @@ +import { User } from "user-management/types"; + +export interface LoginRequest { + username: string; + password: string; +} + +export interface LoginResponse { + user_data: User; + token_data: { + access_token: string; + }; +} + +export interface LogoutRequest {} +export interface LogoutResponse {} diff --git a/clients/ctl/admin-ui/src/features/common/AccordionTree.tsx b/clients/admin-ui/src/features/common/AccordionTree.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/AccordionTree.tsx rename to clients/admin-ui/src/features/common/AccordionTree.tsx diff --git a/clients/admin-ui/src/features/common/BorderGrid.module.css b/clients/admin-ui/src/features/common/BorderGrid.module.css new file mode 100644 index 0000000000..993e6c26ec --- /dev/null +++ b/clients/admin-ui/src/features/common/BorderGrid.module.css @@ -0,0 +1,15 @@ +.grid-row { + border-top-width: 0.5px; + border-color: var(--chakra-colors-blackAlpha-300); + box-sizing: border-box; +} + +.grid-item { + border-right-width: 0.5px; + border-color: var(--chakra-colors-blackAlpha-300); + box-sizing: border-box; +} + +.grid-item:nth-child(3n) { + border-right-width: 0px; +} diff --git a/clients/ctl/admin-ui/src/features/common/BorderGrid.tsx b/clients/admin-ui/src/features/common/BorderGrid.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/BorderGrid.tsx rename to clients/admin-ui/src/features/common/BorderGrid.tsx diff --git a/clients/ctl/admin-ui/src/features/common/CheckboxTree.tsx b/clients/admin-ui/src/features/common/CheckboxTree.tsx similarity index 99% rename from clients/ctl/admin-ui/src/features/common/CheckboxTree.tsx rename to clients/admin-ui/src/features/common/CheckboxTree.tsx index e6c2ea9400..4bd1b701d5 100644 --- a/clients/ctl/admin-ui/src/features/common/CheckboxTree.tsx +++ b/clients/admin-ui/src/features/common/CheckboxTree.tsx @@ -8,9 +8,9 @@ */ import { Box, Checkbox, IconButton } from "@fidesui/react"; +import { ArrowDownLineIcon, ArrowUpLineIcon } from "common/Icon"; import { Fragment, ReactNode, useEffect, useState } from "react"; -import { ArrowDownLineIcon, ArrowUpLineIcon } from "./Icon"; import { TreeNode } from "./types"; export const getAncestorsAndCurrent = (nodeName: string) => { diff --git a/clients/admin-ui/src/features/common/ClipboardButton.tsx b/clients/admin-ui/src/features/common/ClipboardButton.tsx new file mode 100644 index 0000000000..58e3a4a2db --- /dev/null +++ b/clients/admin-ui/src/features/common/ClipboardButton.tsx @@ -0,0 +1,90 @@ +import { Icon, Tooltip, useClipboard } from "@fidesui/react"; +import React, { useState } from "react"; + +enum TooltipText { + COPY = "Copy", + COPIED = "Copied", +} + +const useClipboardButton = (copyText: string) => { + const { onCopy } = useClipboard(copyText); + + const [highlighted, setHighlighted] = useState(false); + const [tooltipText, setTooltipText] = useState(TooltipText.COPY); + + const handleMouseDown = () => { + setTooltipText(TooltipText.COPIED); + onCopy(); + }; + const handleMouseUp = () => { + setHighlighted(false); + }; + + const handleMouseEnter = () => { + setHighlighted(true); + }; + const handleMouseLeave = () => { + setHighlighted(false); + }; + + return { + tooltipText, + highlighted, + handleMouseDown, + handleMouseUp, + handleMouseEnter, + handleMouseLeave, + setTooltipText, + }; +}; + +type ClipboardButtonProps = { + copyText: string; +}; + +const ClipboardButton = ({ copyText }: ClipboardButtonProps) => { + const { + tooltipText, + highlighted, + handleMouseDown, + handleMouseUp, + handleMouseEnter, + handleMouseLeave, + setTooltipText, + } = useClipboardButton(copyText); + + const iconColor = !highlighted ? "gray.600" : "complimentary.500"; + + return ( + { + setTooltipText(TooltipText.COPY); + }} + onClose={() => { + setTooltipText(TooltipText.COPY); + }} + > + + + + + ); +}; + +export default ClipboardButton; diff --git a/clients/admin-ui/src/features/common/CommonHeaders.ts b/clients/admin-ui/src/features/common/CommonHeaders.ts new file mode 100644 index 0000000000..bad68afe0a --- /dev/null +++ b/clients/admin-ui/src/features/common/CommonHeaders.ts @@ -0,0 +1,11 @@ +/** + * Adds common headers to all api calls to fidesops + */ +export function addCommonHeaders(headers: Headers, token: string | null) { + headers.set("Access-Control-Allow-Origin", "*"); + headers.set("X-Fides-Source", "fidesops-admin-ui"); + if (token) { + headers.set("authorization", `Bearer ${token}`); + } + return headers; +} diff --git a/clients/ctl/admin-ui/src/features/common/ConfirmationModal.tsx b/clients/admin-ui/src/features/common/ConfirmationModal.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/ConfirmationModal.tsx rename to clients/admin-ui/src/features/common/ConfirmationModal.tsx diff --git a/clients/ctl/admin-ui/src/features/common/DataTabs.tsx b/clients/admin-ui/src/features/common/DataTabs.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/DataTabs.tsx rename to clients/admin-ui/src/features/common/DataTabs.tsx diff --git a/clients/admin-ui/src/features/common/DaysLeftTag.tsx b/clients/admin-ui/src/features/common/DaysLeftTag.tsx new file mode 100644 index 0000000000..fd739c74de --- /dev/null +++ b/clients/admin-ui/src/features/common/DaysLeftTag.tsx @@ -0,0 +1,42 @@ +import { Tag } from "@fidesui/react"; +import React from "react"; + +type DaysLeftTagProps = { + daysLeft?: number; + includeText: boolean; +}; + +const DaysLeftTag = ({ daysLeft, includeText }: DaysLeftTagProps) => { + if (!daysLeft) { + return null; + } + + let backgroundColor = ""; + + switch (true) { + case daysLeft >= 10: + backgroundColor = "green.500"; + break; + + case daysLeft < 10 && daysLeft > 4: + backgroundColor = "orange.500"; + break; + + case daysLeft < 5: + backgroundColor = "red.400"; + break; + + default: + break; + } + + const text = includeText ? `${daysLeft} days left` : daysLeft; + + return ( + + {text} + + ); +}; + +export default DaysLeftTag; diff --git a/clients/ctl/admin-ui/src/features/common/DocsLink.tsx b/clients/admin-ui/src/features/common/DocsLink.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/DocsLink.tsx rename to clients/admin-ui/src/features/common/DocsLink.tsx diff --git a/clients/admin-ui/src/features/common/Head.tsx b/clients/admin-ui/src/features/common/Head.tsx new file mode 100644 index 0000000000..7b1985aba8 --- /dev/null +++ b/clients/admin-ui/src/features/common/Head.tsx @@ -0,0 +1,12 @@ +import Head from "next/head"; +import React from "react"; + +const FidesHead = () => ( + + Fides + + + +); + +export default FidesHead; diff --git a/clients/ctl/admin-ui/src/features/common/Header.tsx b/clients/admin-ui/src/features/common/Header.tsx similarity index 63% rename from clients/ctl/admin-ui/src/features/common/Header.tsx rename to clients/admin-ui/src/features/common/Header.tsx index 9679ccb49a..b09e72c53f 100644 --- a/clients/ctl/admin-ui/src/features/common/Header.tsx +++ b/clients/admin-ui/src/features/common/Header.tsx @@ -11,15 +11,29 @@ import { Text, } from "@fidesui/react"; import NextLink from "next/link"; -import { signOut, useSession } from "next-auth/react"; import React from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { INDEX_ROUTE } from "../../constants"; +import { logout, selectUser, useLogoutMutation } from "../auth"; import { QuestionIcon, UserIcon } from "./Icon"; +import Image from "./Image"; -const Header = () => { - const { data: session } = useSession(); - // TODO: what should be displayed if there is no user name? - const username = session?.user?.name ?? ""; +const useHeader = () => { + const { username } = useSelector(selectUser) ?? { username: "" }; + return { username }; +}; + +const Header: React.FC = () => { + const { username } = useHeader(); + const [logoutMutation] = useLogoutMutation(); + const dispatch = useDispatch(); + + const handleLogout = async () => { + logoutMutation({}) + .unwrap() + .then(() => dispatch(logout())); + }; return (
@@ -31,10 +45,10 @@ const Header = () => { justifyContent="space-between" alignItems="center" > - + {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */} - Fidesctl Logo + Fides Logo @@ -43,19 +57,19 @@ const Header = () => { - {username} - - Administrator - + {/* This text should only show if actually an admin */} + {/* + Administrator + */} signOut()} + onClick={handleLogout} > Sign out diff --git a/clients/ctl/admin-ui/src/features/common/HorizontalStepper.tsx b/clients/admin-ui/src/features/common/HorizontalStepper.tsx similarity index 94% rename from clients/ctl/admin-ui/src/features/common/HorizontalStepper.tsx rename to clients/admin-ui/src/features/common/HorizontalStepper.tsx index ccf969d0b4..ac407a441a 100644 --- a/clients/ctl/admin-ui/src/features/common/HorizontalStepper.tsx +++ b/clients/admin-ui/src/features/common/HorizontalStepper.tsx @@ -1,8 +1,7 @@ import { Stack, Text } from "@fidesui/react"; +import { HorizontalLineIcon } from "common/Icon"; import React from "react"; -import { HorizontalLineIcon } from "./Icon/index"; - interface Props { activeStep: number | null; steps: { number: number; name: string }[]; diff --git a/clients/ctl/admin-ui/src/features/common/Icon/AWSLogo.tsx b/clients/admin-ui/src/features/common/Icon/AWSLogo.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/AWSLogo.tsx rename to clients/admin-ui/src/features/common/Icon/AWSLogo.tsx diff --git a/clients/admin-ui/src/features/common/Icon/Add.tsx b/clients/admin-ui/src/features/common/Icon/Add.tsx new file mode 100644 index 0000000000..2b9ad62802 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/Add.tsx @@ -0,0 +1,32 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "AddIcon", + viewBox: "0 0 40 40", + path: ( + + + + + + + + + + + ), +}); diff --git a/clients/admin-ui/src/features/common/Icon/ArrowDownLine.tsx b/clients/admin-ui/src/features/common/Icon/ArrowDownLine.tsx new file mode 100644 index 0000000000..acbd0f62c9 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/ArrowDownLine.tsx @@ -0,0 +1,11 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "ArrowDownLineIcon", + viewBox: "0 0 24 24", + defaultProps: { + width: "20px", + height: "20px", + }, + d: "M12 13.1719L16.95 8.22192L18.364 9.63592L12 15.9999L5.63599 9.63592L7.04999 8.22192L12 13.1719Z", +}); diff --git a/clients/ctl/admin-ui/src/features/common/Icon/ArrowDownLine.tsx b/clients/admin-ui/src/features/common/Icon/ArrowDownLineCtl.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/ArrowDownLine.tsx rename to clients/admin-ui/src/features/common/Icon/ArrowDownLineCtl.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/ArrowUpLine.tsx b/clients/admin-ui/src/features/common/Icon/ArrowUpLine.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/ArrowUpLine.tsx rename to clients/admin-ui/src/features/common/Icon/ArrowUpLine.tsx diff --git a/clients/admin-ui/src/features/common/Icon/CircleHelp.tsx b/clients/admin-ui/src/features/common/Icon/CircleHelp.tsx new file mode 100644 index 0000000000..90c09e5ad0 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/CircleHelp.tsx @@ -0,0 +1,16 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "CircleHelpIcon", + viewBox: "0 0 18 18", + defaultProps: { + width: "18px", + height: "18px", + }, + path: ( + + ), +}); diff --git a/clients/admin-ui/src/features/common/Icon/CloseSolid.tsx b/clients/admin-ui/src/features/common/Icon/CloseSolid.tsx new file mode 100644 index 0000000000..6a4dee4bb4 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/CloseSolid.tsx @@ -0,0 +1,13 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "CloseSolidIcon", + defaultProps: { + style: { + width: "17px", + paddingLeft: "2px", + }, + }, + viewBox: "0 0 24 24", + d: "M19.1841 17.5875C19.9562 18.3687 19.9562 19.6343 19.1841 20.4156C18.8012 20.8062 18.2947 21 17.7882 21C17.2818 21 16.7765 20.8047 16.3911 20.414L9.88235 13.8312L3.37421 20.4125C2.98818 20.8062 2.48232 21 1.97647 21C1.47062 21 0.965382 20.8062 0.579044 20.4125C-0.193015 19.6312 -0.193015 18.3656 0.579044 17.5843L7.08904 10.9968L0.579044 4.41248C-0.193015 3.63123 -0.193015 2.3656 0.579044 1.58435C1.3511 0.803101 2.60184 0.803101 3.3739 1.58435L9.88235 8.17497L16.3924 1.58748C17.1644 0.806226 18.4151 0.806226 19.1872 1.58748C19.9593 2.36873 19.9593 3.63435 19.1872 4.4156L12.6772 11.0031L19.1841 17.5875Z", +}); diff --git a/clients/ctl/admin-ui/src/features/common/Icon/CloseSolid.tsx b/clients/admin-ui/src/features/common/Icon/CloseSolidCtl.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/CloseSolid.tsx rename to clients/admin-ui/src/features/common/Icon/CloseSolidCtl.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/DownloadSolid.tsx b/clients/admin-ui/src/features/common/Icon/DownloadSolid.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/DownloadSolid.tsx rename to clients/admin-ui/src/features/common/Icon/DownloadSolid.tsx diff --git a/clients/admin-ui/src/features/common/Icon/ErrorWarning.tsx b/clients/admin-ui/src/features/common/Icon/ErrorWarning.tsx new file mode 100644 index 0000000000..2f489d03d6 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/ErrorWarning.tsx @@ -0,0 +1,16 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "ErrorWarningIcon", + viewBox: "0 0 20 20", + defaultProps: { + width: "20px", + height: "20px", + }, + path: ( + + ), +}); diff --git a/clients/ctl/admin-ui/src/features/common/Icon/Eye.tsx b/clients/admin-ui/src/features/common/Icon/Eye.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/Eye.tsx rename to clients/admin-ui/src/features/common/Icon/Eye.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/Gear.tsx b/clients/admin-ui/src/features/common/Icon/Gear.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/Gear.tsx rename to clients/admin-ui/src/features/common/Icon/Gear.tsx diff --git a/clients/admin-ui/src/features/common/Icon/GreenCheckCircle.tsx b/clients/admin-ui/src/features/common/Icon/GreenCheckCircle.tsx new file mode 100644 index 0000000000..3cb414d0b4 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/GreenCheckCircle.tsx @@ -0,0 +1,16 @@ +import { createIcon } from "@chakra-ui/react"; + +export default createIcon({ + displayName: "GreenCheckCircleIcon", + viewBox: "0 0 16 16", + defaultProps: { + width: "16px", + height: "16px", + }, + path: ( + + ), +}); diff --git a/clients/ctl/admin-ui/src/features/common/Icon/HorizontalLine.tsx b/clients/admin-ui/src/features/common/Icon/HorizontalLine.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/HorizontalLine.tsx rename to clients/admin-ui/src/features/common/Icon/HorizontalLine.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/ManualSetup.tsx b/clients/admin-ui/src/features/common/Icon/ManualSetup.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/ManualSetup.tsx rename to clients/admin-ui/src/features/common/Icon/ManualSetup.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/More.tsx b/clients/admin-ui/src/features/common/Icon/More.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/More.tsx rename to clients/admin-ui/src/features/common/Icon/More.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/OktaLogo.tsx b/clients/admin-ui/src/features/common/Icon/OktaLogo.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/OktaLogo.tsx rename to clients/admin-ui/src/features/common/Icon/OktaLogo.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/Question.tsx b/clients/admin-ui/src/features/common/Icon/Question.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/Question.tsx rename to clients/admin-ui/src/features/common/Icon/Question.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/SearchLine.tsx b/clients/admin-ui/src/features/common/Icon/SearchLine.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/SearchLine.tsx rename to clients/admin-ui/src/features/common/Icon/SearchLine.tsx diff --git a/clients/admin-ui/src/features/common/Icon/SortArrow.tsx b/clients/admin-ui/src/features/common/Icon/SortArrow.tsx new file mode 100644 index 0000000000..fd87d19745 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/SortArrow.tsx @@ -0,0 +1,171 @@ +import { Icon } from "@fidesui/react"; +import React from "react"; + +type SortArrowProps = { + up?: boolean; +}; + +const SortArrow: React.FC = ({ up }) => { + if (up === undefined) { + return ( + + + + + + + ); + } + + if (up) { + return ( + + + + + + + + + + + + + + + + + + + + + + ); + } + + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default SortArrow; diff --git a/clients/ctl/admin-ui/src/features/common/Icon/StepperCircle.tsx b/clients/admin-ui/src/features/common/Icon/StepperCircle.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/StepperCircle.tsx rename to clients/admin-ui/src/features/common/Icon/StepperCircle.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/StepperCircleCheckmark.tsx b/clients/admin-ui/src/features/common/Icon/StepperCircleCheckmark.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/StepperCircleCheckmark.tsx rename to clients/admin-ui/src/features/common/Icon/StepperCircleCheckmark.tsx diff --git a/clients/admin-ui/src/features/common/Icon/TrashCanSolid.tsx b/clients/admin-ui/src/features/common/Icon/TrashCanSolid.tsx new file mode 100644 index 0000000000..b663e40946 --- /dev/null +++ b/clients/admin-ui/src/features/common/Icon/TrashCanSolid.tsx @@ -0,0 +1,16 @@ +import { createIcon } from "@fidesui/react"; + +export default createIcon({ + displayName: "TrashCanSolidIcon", + viewBox: "0 0 24 24", + defaultProps: { + width: "24px", + height: "24px", + }, + path: ( + + ), +}); diff --git a/clients/ctl/admin-ui/src/features/common/Icon/User.tsx b/clients/admin-ui/src/features/common/Icon/User.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/User.tsx rename to clients/admin-ui/src/features/common/Icon/User.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/VerticalLine.tsx b/clients/admin-ui/src/features/common/Icon/VerticalLine.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Icon/VerticalLine.tsx rename to clients/admin-ui/src/features/common/Icon/VerticalLine.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Icon/index.tsx b/clients/admin-ui/src/features/common/Icon/index.tsx similarity index 74% rename from clients/ctl/admin-ui/src/features/common/Icon/index.tsx rename to clients/admin-ui/src/features/common/Icon/index.tsx index e8d54620a8..9dd9a786ff 100644 --- a/clients/ctl/admin-ui/src/features/common/Icon/index.tsx +++ b/clients/admin-ui/src/features/common/Icon/index.tsx @@ -1,17 +1,23 @@ export { default as AddIcon } from "./Add"; export { default as ArrowDownLineIcon } from "./ArrowDownLine"; +export { default as ArrowDownLineIconCtl } from "./ArrowDownLineCtl"; export { default as ArrowUpLineIcon } from "./ArrowUpLine"; export { default as AWSLogoIcon } from "./AWSLogo"; +export { default as CircleHelpIcon } from "./CircleHelp"; export { default as CloseSolidIcon } from "./CloseSolid"; +export { default as CloseSolidIconCtl } from "./CloseSolidCtl"; export { default as DownloadSolidIcon } from "./DownloadSolid"; +export { default as ErrorWarningIcon } from "./ErrorWarning"; export { default as EyeIcon } from "./Eye"; export { default as GearIcon } from "./Gear"; +export { default as GreenCheckCircleIcon } from "./GreenCheckCircle"; export { default as HorizontalLineIcon } from "./HorizontalLine"; export { default as ManualSetupIcon } from "./ManualSetup"; export { default as MoreIcon } from "./More"; export { default as OktaLogoIcon } from "./OktaLogo"; export { default as QuestionIcon } from "./Question"; export { default as SearchLineIcon } from "./SearchLine"; +export { default as SortArrowIcon } from "./SortArrow"; export { default as StepperCircleIcon } from "./StepperCircle"; export { default as StepperCircleCheckmarkIcon } from "./StepperCircleCheckmark"; export { default as TrashCanSolidIcon } from "./TrashCanSolid"; diff --git a/clients/admin-ui/src/features/common/Image.tsx b/clients/admin-ui/src/features/common/Image.tsx new file mode 100644 index 0000000000..76873231d8 --- /dev/null +++ b/clients/admin-ui/src/features/common/Image.tsx @@ -0,0 +1,11 @@ +// components/Image.js +import NextImage from "next/image"; + +// opt-out of image optimization, no-op +const customLoader = ({ src }: { src: string }) => src; + +const Image: typeof NextImage = (props) => ( + +); + +export default Image; diff --git a/clients/ctl/admin-ui/src/features/common/Layout.tsx b/clients/admin-ui/src/features/common/Layout.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/Layout.tsx rename to clients/admin-ui/src/features/common/Layout.tsx diff --git a/clients/admin-ui/src/features/common/NavBar.tsx b/clients/admin-ui/src/features/common/NavBar.tsx new file mode 100644 index 0000000000..f439417c8f --- /dev/null +++ b/clients/admin-ui/src/features/common/NavBar.tsx @@ -0,0 +1,87 @@ +import { Button, Flex } from "@fidesui/react"; +import NextLink from "next/link"; +import { useRouter } from "next/router"; +import React from "react"; + +import { + DATASTORE_CONNECTION_ROUTE, + INDEX_ROUTE, + USER_MANAGEMENT_ROUTE, +} from "../../constants"; +import Header from "./Header"; +import { ArrowDownLineIcon } from "./Icon"; + +const NavBar = () => { + const router = useRouter(); + + return ( + <> +
+ + + + + + + + + + + + + + + + + + + ); +}; + +export default NavBar; diff --git a/clients/admin-ui/src/features/common/PII.tsx b/clients/admin-ui/src/features/common/PII.tsx new file mode 100644 index 0000000000..f7079fe2d6 --- /dev/null +++ b/clients/admin-ui/src/features/common/PII.tsx @@ -0,0 +1,8 @@ +import { useObscuredPII } from "privacy-requests/helpers"; +import React from "react"; + +const PII: React.FC<{ data: string }> = ({ data }) => ( + <>{useObscuredPII(data)} +); + +export default PII; diff --git a/clients/admin-ui/src/features/common/PIIToggle.tsx b/clients/admin-ui/src/features/common/PIIToggle.tsx new file mode 100644 index 0000000000..c3f98e1ccf --- /dev/null +++ b/clients/admin-ui/src/features/common/PIIToggle.tsx @@ -0,0 +1,13 @@ +import { Switch } from "@fidesui/react"; +import { setRevealPII } from "privacy-requests/privacy-requests.slice"; +import React, { ChangeEvent } from "react"; +import { useDispatch } from "react-redux"; + +const PIIToggle: React.FC = () => { + const dispatch = useDispatch(); + const handleToggle = (event: ChangeEvent) => + dispatch(setRevealPII(event.target.checked)); + return ; +}; + +export default PIIToggle; diff --git a/clients/admin-ui/src/features/common/PaginationFooter.tsx b/clients/admin-ui/src/features/common/PaginationFooter.tsx new file mode 100644 index 0000000000..0ebbc2d82f --- /dev/null +++ b/clients/admin-ui/src/features/common/PaginationFooter.tsx @@ -0,0 +1,54 @@ +import { Button, Flex, Text } from "@fidesui/react"; + +type PaginationFooterProps = { + page: number; + size: number; + total: number; + handleNextPage: () => void; + handlePreviousPage: () => void; +}; + +const PaginationFooter: React.FC = ({ + page, + size, + total, + handleNextPage, + handlePreviousPage, +}) => { + const startingItem = (page - 1) * size + 1; + const endingItem = Math.min(total, page * size); + return ( + + + {total > 0 ? ( + <> + Showing {Number.isNaN(startingItem) ? 0 : startingItem} to{" "} + {Number.isNaN(endingItem) ? 0 : endingItem} of{" "} + {Number.isNaN(total) ? 0 : total} results + + ) : ( + "0 results" + )} + +
+ + +
+
+ ); +}; + +export default PaginationFooter; diff --git a/clients/ctl/admin-ui/src/features/common/QuestionTooltip.tsx b/clients/admin-ui/src/features/common/QuestionTooltip.tsx similarity index 58% rename from clients/ctl/admin-ui/src/features/common/QuestionTooltip.tsx rename to clients/admin-ui/src/features/common/QuestionTooltip.tsx index e0d8842c40..e477f2cac0 100644 --- a/clients/ctl/admin-ui/src/features/common/QuestionTooltip.tsx +++ b/clients/admin-ui/src/features/common/QuestionTooltip.tsx @@ -1,7 +1,6 @@ -import { TooltipProps } from "@chakra-ui/react"; -import { Tooltip } from "@fidesui/react"; - -import { QuestionIcon } from "./Icon"; +import { Tooltip, TooltipProps } from "@chakra-ui/react"; +// import { Tooltip } from "@fidesui/react"; +import { QuestionIcon } from "common/Icon"; const QuestionTooltip = ({ ...props }: Omit) => ( diff --git a/clients/admin-ui/src/features/common/RequestStatusBadge.tsx b/clients/admin-ui/src/features/common/RequestStatusBadge.tsx new file mode 100644 index 0000000000..e175bee606 --- /dev/null +++ b/clients/admin-ui/src/features/common/RequestStatusBadge.tsx @@ -0,0 +1,66 @@ +import { Badge } from "@fidesui/react"; +import { PrivacyRequestStatus } from "privacy-requests/types"; +import { ComponentProps } from "react"; + +export const statusPropMap: { + [key in PrivacyRequestStatus]: ComponentProps; +} = { + approved: { + bg: "yellow.500", + label: "Approved", + }, + complete: { + bg: "green.500", + label: "Completed", + }, + denied: { + bg: "red.500", + label: "Denied", + }, + canceled: { + bg: "red.600", + label: "Canceled", + }, + error: { + bg: "red.800", + label: "Error", + }, + in_processing: { + bg: "orange.500", + label: "In Progress", + }, + paused: { + bg: "gray.400", + label: "Paused", + }, + pending: { + bg: "blue.400", + label: "New", + }, + identity_unverified: { + bg: "red.400", + label: "Unverified", + }, + requires_input: { + bg: "yellow.400", + label: "Requires Input", + }, +}; + +interface RequestBadgeProps { + status: keyof typeof statusPropMap; +} + +const RequestStatusBadge: React.FC = ({ status }) => ( + + {statusPropMap[status].label} + +); + +export default RequestStatusBadge; diff --git a/clients/admin-ui/src/features/common/RequestType.tsx b/clients/admin-ui/src/features/common/RequestType.tsx new file mode 100644 index 0000000000..6f2eab7853 --- /dev/null +++ b/clients/admin-ui/src/features/common/RequestType.tsx @@ -0,0 +1,36 @@ +import { Box, Tag } from "@fidesui/react"; +import { ActionType, Rule } from "privacy-requests/types"; +import React from "react"; + +type RequestTypeProps = { + rules: Rule[]; +}; + +const RequestType = ({ rules }: RequestTypeProps) => { + const actions = Array.from( + new Set( + rules + .filter((d) => Object.values(ActionType).includes(d.action_type)) + .map((d) => + d.action_type === ActionType.ACCESS ? "Download" : "Delete" + ) + ) + ); + const tags = actions.map((action_type) => ( + + {action_type} + + )); + + return {tags}; +}; + +export default RequestType; diff --git a/clients/ctl/admin-ui/src/features/common/SearchBar.tsx b/clients/admin-ui/src/features/common/SearchBar.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/SearchBar.tsx rename to clients/admin-ui/src/features/common/SearchBar.tsx diff --git a/clients/ctl/admin-ui/src/features/common/Stepper.tsx b/clients/admin-ui/src/features/common/Stepper.tsx similarity index 98% rename from clients/ctl/admin-ui/src/features/common/Stepper.tsx rename to clients/admin-ui/src/features/common/Stepper.tsx index 4a10ffa615..0b6850dfeb 100644 --- a/clients/ctl/admin-ui/src/features/common/Stepper.tsx +++ b/clients/admin-ui/src/features/common/Stepper.tsx @@ -1,11 +1,10 @@ import { Box, Stack, Text } from "@fidesui/react"; -import React from "react"; - import { StepperCircleCheckmarkIcon, StepperCircleIcon, VerticalLineIcon, -} from "./Icon"; +} from "common/Icon"; +import React from "react"; interface Props { activeStep: number | null; diff --git a/clients/ctl/admin-ui/src/features/common/constants.tsx b/clients/admin-ui/src/features/common/constants.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/constants.tsx rename to clients/admin-ui/src/features/common/constants.tsx diff --git a/clients/ctl/admin-ui/src/features/common/countries.ts b/clients/admin-ui/src/features/common/countries.ts similarity index 100% rename from clients/ctl/admin-ui/src/features/common/countries.ts rename to clients/admin-ui/src/features/common/countries.ts diff --git a/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdown.tsx b/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdown.tsx new file mode 100644 index 0000000000..2273588642 --- /dev/null +++ b/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdown.tsx @@ -0,0 +1,146 @@ +import { PlacementWithLogical } from "@chakra-ui/react"; +import { + Box, + Button, + HStack, + Menu, + MenuButton, + Text, + Tooltip, +} from "@fidesui/react"; +import React, { useState } from "react"; + +import { ArrowDownLineIcon } from "../Icon"; +import MultiSelectDropdownList from "./MultiSelectDropdownList"; + +type MultiSelectDropdwonProps = { + /** + * Boolean to determine if the dropdown is to be immediately close on a user selection + */ + closeOnSelect?: boolean; + /** + * List of key/value pairs to be rendered as a checkbox list + */ + list: Map; + /** + * Parent callback event handler invoked when list of selection values have changed + */ + onChange: (values: string[]) => void; + /** + * List of key/value pairs which are marked for selection + */ + selectedList: Map; + /** + * Placeholder + */ + label: string; + /** + * Disable showing a tooltip + */ + tooltipDisabled?: boolean; + /** + * Position of the tooltip + */ + tooltipPlacement?: PlacementWithLogical; + /** + * Fixed Width of the textbox within the Menu Button component + */ + width?: string; +}; + +const MultiSelectDropdown: React.FC = ({ + closeOnSelect = false, + list, + onChange, + selectedList, + label, + tooltipDisabled = false, + tooltipPlacement = "auto", + width, +}) => { + const defaultItems = new Map(list); + + // Hooks + const [isOpen, setIsOpen] = useState(false); + + // Listeners + const handleClose = () => { + setIsOpen(false); + }; + const handleOpen = () => { + setIsOpen(true); + }; + const handleSelection = (items: Map) => { + const temp = new Map([...items].filter(([, v]) => v === true)); + onChange([...temp.keys()]); + handleClose(); + }; + + const getMenuButtonText = () => { + if (!tooltipDisabled) { + return selectedList.size > 0 + ? [...selectedList.keys()].sort().join(", ") + : label; + } + return label; + }; + + return ( + + + 0)} + placement={tooltipPlacement} + > + } + size="sm" + variant="outline" + _active={{ + bg: "none", + }} + _hover={{ + bg: "none", + }} + > + {!tooltipDisabled && ( + + {getMenuButtonText()} + + )} + {tooltipDisabled && ( + + {getMenuButtonText()} + {selectedList.size > 0 && ( + {selectedList.size} + )} + + )} + + + {isOpen ? ( + + ) : null} + + + ); +}; + +export default MultiSelectDropdown; diff --git a/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdownList.tsx b/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdownList.tsx new file mode 100644 index 0000000000..e6e8561b85 --- /dev/null +++ b/clients/admin-ui/src/features/common/dropdown/MultiSelectDropdownList.tsx @@ -0,0 +1,111 @@ +import { + Button, + Checkbox, + CheckboxGroup, + Flex, + MenuItem, + MenuList, + Spacer, + Text, +} from "@fidesui/react"; +import React, { useState } from "react"; + +type MultiSelectDropdownListProps = { + /** + * List of default item values + */ + defaultValues?: string[]; + /** + * List of key/value pair items + */ + items: Map; + /** + * Event handler invoked when user item selections are applied + */ + onSelection: (items: Map) => void; +}; + +const MultiSelectDropdownList: React.FC = ({ + defaultValues, + items, + onSelection, +}) => { + const [pendingItems, setPendingItems] = useState(items); + + // Listeners + const handleChange = (values: string[]) => { + // Copy items + const temp = new Map(pendingItems); + + // Uncheck all items + temp.forEach((_value, key) => { + temp.set(key, false); + }); + + // Check the selected items + values.forEach((v) => { + temp.set(v, true); + }); + + setPendingItems(temp); + }; + const handleClear = () => { + setPendingItems(items); + onSelection(new Map()); + }; + const handleDone = () => { + onSelection(pendingItems); + }; + + return ( + + + + + + + {/* MenuItems are not rendered unless Menu is open */} + + {[...items].sort().map(([key]) => ( + + + {key} + + + ))} + + + ); +}; + +export default MultiSelectDropdownList; diff --git a/clients/admin-ui/src/features/common/dropdown/SelectDropdown.tsx b/clients/admin-ui/src/features/common/dropdown/SelectDropdown.tsx new file mode 100644 index 0000000000..cdbebbb9e8 --- /dev/null +++ b/clients/admin-ui/src/features/common/dropdown/SelectDropdown.tsx @@ -0,0 +1,151 @@ +import { + Box, + Button, + Flex, + Menu, + MenuButton, + MenuItem, + MenuList, + Text, + Tooltip, +} from "@fidesui/react"; +import { useState } from "react"; + +import { ArrowDownLineIcon } from "../Icon"; +import { ItemOption } from "./types"; + +type SelectDropdownProps = { + /** + * List of key/value pair items + */ + list: Map; + /** + * Parent callback event handler invoked when selected value has changed + */ + onChange: (value: string | undefined) => void; + /** + * Placeholder + */ + label: string; + /** + * Sort the list items before rendering + */ + enableSorting?: boolean; + /** + * Display the Clear button. Default value is true. + */ + hasClear?: boolean; + /** + * Default value marked for selection + */ + selectedValue?: string; + /** + * Width of an element + */ + width?: string; +}; + +const SelectDropdown: React.FC = ({ + enableSorting = true, + hasClear = true, + label, + list, + onChange, + selectedValue, + width, +}) => { + // Hooks + const [isOpen, setIsOpen] = useState(false); + + // Listeners + const handleClose = () => { + setIsOpen(false); + }; + const handleClear = () => { + onChange(undefined); + handleClose(); + }; + const handleOpen = () => { + setIsOpen(true); + }; + + const selectedText = [...list].find( + ([, option]) => option.value === selectedValue + )?.[0]; + + return ( + + + } + size="sm" + variant="outline" + width={width} + _active={{ + bg: "none", + }} + _hover={{ + bg: "none", + }} + > + {selectedText ?? label} + + {isOpen ? ( + + {hasClear && ( + + + + )} + {/* MenuItems are not rendered unless Menu is open */} + {(enableSorting ? [...list].sort() : [...list]).map( + ([key, option]) => ( + + onChange(option.value)} + paddingTop="10px" + paddingRight="8.5px" + paddingBottom="10px" + paddingLeft="8.5px" + _focus={{ + bg: "gray.100", + }} + > + {key} + + + ) + )} + + ) : null} + + + ); +}; + +export default SelectDropdown; diff --git a/clients/admin-ui/src/features/common/dropdown/types.ts b/clients/admin-ui/src/features/common/dropdown/types.ts new file mode 100644 index 0000000000..1e4b265d8c --- /dev/null +++ b/clients/admin-ui/src/features/common/dropdown/types.ts @@ -0,0 +1,14 @@ +export type ItemOption = { + /** + * Specifies the value to be sent + */ + value: string; + /** + * Specifies that an option should be disabled + */ + isDisabled?: boolean; + /** + * Specifies a toolTip should be dislayed when the user hovers over an option + */ + toolTip?: string; +}; diff --git a/clients/ctl/admin-ui/src/features/common/features.slice.ts b/clients/admin-ui/src/features/common/features.slice.ts similarity index 100% rename from clients/ctl/admin-ui/src/features/common/features.slice.ts rename to clients/admin-ui/src/features/common/features.slice.ts diff --git a/clients/ctl/admin-ui/src/features/common/form/inputs.tsx b/clients/admin-ui/src/features/common/form/inputs.tsx similarity index 100% rename from clients/ctl/admin-ui/src/features/common/form/inputs.tsx rename to clients/admin-ui/src/features/common/form/inputs.tsx diff --git a/clients/ctl/admin-ui/src/features/common/helpers.ts b/clients/admin-ui/src/features/common/helpers.ts similarity index 57% rename from clients/ctl/admin-ui/src/features/common/helpers.ts rename to clients/admin-ui/src/features/common/helpers.ts index 293a938899..2ee7962bcf 100644 --- a/clients/ctl/admin-ui/src/features/common/helpers.ts +++ b/clients/admin-ui/src/features/common/helpers.ts @@ -1,3 +1,7 @@ +/** + * Taken from https://redux-toolkit.js.org/rtk-query/usage-with-typescript#inline-error-handling-example + */ +import { FetchBaseQueryError } from "@reduxjs/toolkit/query"; import { YAMLException } from "js-yaml"; import { narrow } from "narrow-minded"; @@ -13,9 +17,6 @@ import { export { isErrorResult } from "~/types/errors/api"; -export const isYamlException = (error: unknown): error is YAMLException => - narrow({ name: "string" }, error) && error.name === "YAMLException"; - const DEFAULT_ERROR_MESSAGE = "An unexpected error occurred. Please try again."; export const getErrorMessage = ( @@ -41,6 +42,76 @@ export const getErrorMessage = ( return defaultMsg; }; +export const isYamlException = (error: unknown): error is YAMLException => + narrow({ name: "string" }, error) && error.name === "YAMLException"; + +/** + * Type predicate to narrow an unknown error to `FetchBaseQueryError` + */ +export function isFetchBaseQueryError( + error: unknown +): error is FetchBaseQueryError { + return typeof error === "object" && error != null && "status" in error; +} + +/** + * Type predicate to narrow an unknown error to an object with a string 'message' property + */ +export function isErrorWithMessage( + error: unknown +): error is { message: string } { + return ( + typeof error === "object" && + error != null && + "message" in error && + typeof (error as any).message === "string" + ); +} + +// generic error of the structure we expect from the Fidesops backend +interface ResponseError { + data: { + detail: string; + }; +} + +interface ErrorDetail { + loc: string[]; + msg: string; + type: string; +} + +interface ValidationError { + data: { + detail: ErrorDetail[]; + }; +} + +/** + * Custom type predicate to see if the error has details as returned by the Fidesops API + * @param error + * @returns + */ +export function isErrorWithDetail(error: unknown): error is ResponseError { + return ( + typeof error === "object" && + error != null && + "data" in error && + typeof (error as any).data.detail === "string" + ); +} + +export function isErrorWithDetailArray( + error: unknown +): error is ValidationError { + return ( + typeof error === "object" && + error != null && + "data" in error && + Array.isArray((error as any).data.detail) + ); +} + export interface ParsedError { status: number; message: string; diff --git a/clients/admin-ui/src/features/common/hooks/index.ts b/clients/admin-ui/src/features/common/hooks/index.ts new file mode 100644 index 0000000000..845cf6af9b --- /dev/null +++ b/clients/admin-ui/src/features/common/hooks/index.ts @@ -0,0 +1,3 @@ +export * from "./useAlert"; +export * from "./useAPIHelper"; +export * from "./useOutsideClick"; diff --git a/clients/admin-ui/src/features/common/hooks/useAPIHelper.ts b/clients/admin-ui/src/features/common/hooks/useAPIHelper.ts new file mode 100644 index 0000000000..bf66e393d6 --- /dev/null +++ b/clients/admin-ui/src/features/common/hooks/useAPIHelper.ts @@ -0,0 +1,27 @@ +import { isErrorWithDetail, isErrorWithDetailArray } from "common/helpers"; + +import { useAlert } from "./useAlert"; + +/** + * Custom hook for API helper methods + * @returns + */ +export const useAPIHelper = () => { + const { errorAlert } = useAlert(); + + /** + * Display custom error toast notification as a result of an API exception + * @param error + */ + const handleError = (error: any) => { + let errorMsg = "An unexpected error occurred. Please try again."; + if (isErrorWithDetail(error)) { + errorMsg = error.data.detail; + } else if (isErrorWithDetailArray(error)) { + errorMsg = error.data.detail[0].msg; + } + errorAlert(errorMsg); + }; + + return { handleError }; +}; diff --git a/clients/admin-ui/src/features/common/hooks/useAlert.tsx b/clients/admin-ui/src/features/common/hooks/useAlert.tsx new file mode 100644 index 0000000000..f048548788 --- /dev/null +++ b/clients/admin-ui/src/features/common/hooks/useAlert.tsx @@ -0,0 +1,54 @@ +import { + Alert, + AlertDescription, + AlertIcon, + Box, + useToast, +} from "@fidesui/react"; + +/** + * Custom hook for toast notifications + * @returns + */ +export const useAlert = () => { + const toast = useToast(); + const DEFAULT_POSITION = "top"; + + /** + * Display custom error toast notification + * @param description + */ + const errorAlert = (description: string | JSX.Element) => { + toast({ + isClosable: true, + position: DEFAULT_POSITION, + render: () => ( + + + + {description} + + + ), + }); + }; + + /** + * Display custom success toast notification + * @param description + */ + const successAlert = (description: string) => { + toast({ + isClosable: true, + position: DEFAULT_POSITION, + render: () => ( + + + {description} + + ), + }); + }; + + return { errorAlert, successAlert }; +}; diff --git a/clients/admin-ui/src/features/common/hooks/useOutsideClick.ts b/clients/admin-ui/src/features/common/hooks/useOutsideClick.ts new file mode 100644 index 0000000000..d69c90955a --- /dev/null +++ b/clients/admin-ui/src/features/common/hooks/useOutsideClick.ts @@ -0,0 +1,22 @@ +import { LegacyRef, useEffect, useRef } from "react"; + +// eslint-disable-next-line import/prefer-default-export +export const useOutsideClick = (handleClick: () => void) => { + const ref = useRef(undefined) as + | LegacyRef + | undefined; + useEffect(() => { + const handleOutsideClick = (event: MouseEvent) => { + // @ts-ignore + if (!ref.current?.contains(event.target)) { + handleClick(); + } + }; + document.addEventListener("mousedown", handleOutsideClick); + return () => { + document.removeEventListener("mousedown", handleOutsideClick); + }; + }, [ref, handleClick]); + + return { ref }; +}; diff --git a/clients/ctl/admin-ui/src/features/common/nav/NavBar.tsx b/clients/admin-ui/src/features/common/nav/NavBar.tsx similarity index 75% rename from clients/ctl/admin-ui/src/features/common/nav/NavBar.tsx rename to clients/admin-ui/src/features/common/nav/NavBar.tsx index da778c5675..c952265769 100644 --- a/clients/ctl/admin-ui/src/features/common/nav/NavBar.tsx +++ b/clients/admin-ui/src/features/common/nav/NavBar.tsx @@ -2,6 +2,11 @@ import { Flex } from "@fidesui/react"; import dynamic from "next/dynamic"; import React from "react"; +import { + DATASTORE_CONNECTION_ROUTE, + INDEX_ROUTE, + USER_MANAGEMENT_ROUTE, +} from "~/constants"; import { useFeatures } from "~/features/common/features.slice"; // Cross-zone navigation requires building URLs from the current `window.location` @@ -20,6 +25,12 @@ const NavBar = () => { borderColor="gray.100" >