diff --git a/.circleci/config.yml b/.circleci/config.yml index 1387007549a..7c516beceb0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,10 +2,6 @@ version: 2 defaults: init_environemnt: &init_environment run: | - # SOLR config - cp ~/project/ckan/config/solr/schema.xml /etc/solr/conf/schema.xml - service jetty9 restart || true # erroring out but does seem to work - # Database Creation psql --host=ckan-postgres --username=ckan --command="CREATE USER ${CKAN_POSTGRES_USER} WITH PASSWORD '${CKAN_POSTGRES_PWD}' NOSUPERUSER NOCREATEDB NOCREATEROLE;" createdb --encoding=utf-8 --host=ckan-postgres --username=ckan --owner=${CKAN_POSTGRES_USER} ${CKAN_POSTGRES_DB} @@ -29,7 +25,7 @@ defaults: npm install ;; esac - apt install -y postgresql-client solr-jetty openjdk-8-jdk + apt install -y postgresql-client run_tests: &run_tests # Tests Backend, split across containers by segments run: | @@ -86,41 +82,19 @@ defaults: redis_image: &redis_image image: redis:3 name: ckan-redis -jobs: - test-python-2: - docker: - - image: python:2-stretch - <<: *ckan_env - - <<: *pg_image - - <<: *redis_image - parallelism: 4 + solr_image: &solr_image + image: ckan/ckan-solr:2.9 + name: ckan-solr - steps: - - checkout - - - <<: *install_deps - - run: | - # Python Dependencies - pip install -r requirement-setuptools.txt - pip install -r requirements-py2.txt - pip install -r dev-requirements.txt - python setup.py develop - pip check - - <<: *init_environment - - <<: *run_tests - - store_test_results: - path: ~/junit - - <<: *start_test_server - - <<: *run_front_tests - - store_artifacts: - path: ~/project/cypress/screenshots +jobs: test-python-3: docker: - - image: python:3-stretch + - image: python:3.9-buster <<: *ckan_env - <<: *pg_image - <<: *redis_image + - <<: *solr_image parallelism: 4 @@ -150,5 +124,4 @@ workflows: version: 2 build_and_test: jobs: - - test-python-2 - test-python-3 diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e23e048230a..7f649e949c0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,8 @@ Bugfixes - `CVE-2023-32321 `_: fix potential path traversal, remote code execution, information disclosure and DOS vulnerabilities via crafted resource ids. +- Names are now quoted in From and To addresses in emails, meaning that site titles with + commas no longer break email clients. (`#7508 `_) Migration notes --------------- diff --git a/ckan/__init__.py b/ckan/__init__.py index 968c1567d94..6411ce74d89 100644 --- a/ckan/__init__.py +++ b/ckan/__init__.py @@ -1,6 +1,6 @@ # encoding: utf-8 -__version__ = '2.9.9b' +__version__ = '2.9.9' __description__ = 'CKAN Software' __long_description__ = \ diff --git a/ckan/lib/uploader.py b/ckan/lib/uploader.py index e8e68e58ca0..ec4a6dfd0b1 100644 --- a/ckan/lib/uploader.py +++ b/ckan/lib/uploader.py @@ -294,7 +294,8 @@ def get_directory(self, id): real_storage = os.path.realpath(self.storage_path) directory = os.path.join(real_storage, id[0:3], id[3:6]) if directory != os.path.realpath(directory): - raise logic.ValidationError({'upload': ['Invalid storage directory']}) + raise logic.ValidationError( + {'upload': ['Invalid storage directory']}) return directory def get_path(self, id): diff --git a/ckan/tests/logic/auth/test_delete.py b/ckan/tests/logic/auth/test_delete.py index 1226c1c80e9..52b110d526e 100644 --- a/ckan/tests/logic/auth/test_delete.py +++ b/ckan/tests/logic/auth/test_delete.py @@ -26,7 +26,7 @@ def test_no_org_user_cant_delete(self): user = factories.User() org = factories.Organization() dataset = factories.Dataset( - owner_org=org["id"], resources=[factories.Resource()] + owner_org=org["id"], resources=[{"url": "https://example.com/data.csv"}] ) response = auth_delete.resource_delete( @@ -41,7 +41,7 @@ def test_org_user_can_delete(self): org_users = [{"name": user["name"], "capacity": "editor"}] org = factories.Organization(users=org_users) dataset = factories.Dataset( - owner_org=org["id"], resources=[factories.Resource()], user=user + owner_org=org["id"], resources=[{"url": "https://example.com/data.csv"}], user=user ) response = auth_delete.resource_delete( @@ -67,7 +67,7 @@ def test_no_org_user_cant_delete_2(self): user = factories.User() org = factories.Organization() dataset = factories.Dataset( - owner_org=org["id"], resources=[factories.Resource()] + owner_org=org["id"], resources=[{"url": "https://example.com/data.csv"}] ) resource_view = factories.ResourceView( @@ -88,7 +88,7 @@ def test_org_user_can_delete_2(self): org_users = [{"name": user["name"], "capacity": "editor"}] org = factories.Organization(users=org_users) dataset = factories.Dataset( - owner_org=org["id"], resources=[factories.Resource()], user=user + owner_org=org["id"], resources=[{"url": "https://example.com/data.csv"}], user=user ) resource_view = factories.ResourceView( diff --git a/ckanext/datapusher/tests/test_interfaces.py b/ckanext/datapusher/tests/test_interfaces.py index cc39a5c65f6..c8fa2d8b02d 100644 --- a/ckanext/datapusher/tests/test_interfaces.py +++ b/ckanext/datapusher/tests/test_interfaces.py @@ -41,8 +41,10 @@ def setup_class(self, clean_db, test_request_context): if not tests.is_datastore_supported(): pytest.skip("Datastore not supported") - resource = factories.Resource(url_type="datastore") - self.dataset = factories.Dataset(resources=[resource]) + self.dataset = factories.Dataset( + resources=[ + {"url_type": "datastore"} + ]) with test_request_context(): self.sysadmin_user = factories.User( name="testsysadmin", sysadmin=True diff --git a/test-core-circle-ci.ini b/test-core-circle-ci.ini index a558853e415..70c9d0f7801 100644 --- a/test-core-circle-ci.ini +++ b/test-core-circle-ci.ini @@ -11,7 +11,7 @@ ckan.redis.url = redis://ckan-redis:6379/1 sqlalchemy.url = postgresql://ckan_default:pass@ckan-postgres/ckan_test -solr_url = http://localhost:8080/solr +solr_url = http://ckan-solr:8983/solr/ckan [loggers] keys = root, ckan, sqlalchemy