Skip to content

Commit

Permalink
fix(dav): don't create new file if errors were raised
Browse files Browse the repository at this point in the history
Follow-up from #747
  • Loading branch information
anehx committed Jan 22, 2025
1 parent bc31c73 commit 564e484
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 32 deletions.
18 changes: 16 additions & 2 deletions alexandria/core/tests/test_dav.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,10 +228,24 @@ def test_dav_url_schemes_unconfigured(db, file_factory, manabi, settings):
def test_dav_without_content(db, manabi, settings, file_factory):
settings.ALEXANDRIA_MANABI_DAV_URI_SCHEMES = {"text/plain": "ms-word:ofe|u|"}

file = file_factory(name="test.txt", mime_type="text/plain")
file = file_factory(
name="test.txt",
mime_type="text/plain",
modified_by_user="some-user",
modified_by_group="some-group",
)

dav_app = TestApp(get_dav())

with pytest.raises(AppError) as e:
dav_app.put(get_webdav_url_without_uri_scheme(file, "admin", "admin"), b"")
dav_app.put(
get_webdav_url_without_uri_scheme(
file,
"some-other-user",
"some-other-group",
),
b"",
)

assert "400 Bad Request" in str(e)
assert file.document.files.filter(variant=File.Variant.ORIGINAL).count() == 1
61 changes: 31 additions & 30 deletions alexandria/dav_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,36 +98,37 @@ def begin_write(self, *, content_type=None):
return self.memory_file

def end_write(self, *, with_errors):
file = self.file
if (
self.file.modified_by_user != self.user
or self.file.modified_by_group != self.group
):
file = File(
variant=self.file.variant,
original=self.file.original,
name=self.file.name,
document=self.file.document,
encryption_status=self.file.encryption_status,
mime_type=self.file.mime_type,
created_by_user=self.user,
created_by_group=self.group,
modified_by_user=self.user,
modified_by_group=self.group,
)
file.size = self.memory_file.getbuffer().nbytes
self.memory_file.seek(0)
django_file = DjangoFile(name=file.name, file=self.memory_file)
file.content = django_file

try:
validate_file(file)
except ValidationError:
raise DAVError(HTTP_FORBIDDEN)

file.save()
self.file = file
self.memory_file.do_close()
if not with_errors:
file = self.file
if (
self.file.modified_by_user != self.user
or self.file.modified_by_group != self.group
):
file = File(
variant=self.file.variant,
original=self.file.original,
name=self.file.name,
document=self.file.document,
encryption_status=self.file.encryption_status,
mime_type=self.file.mime_type,
created_by_user=self.user,
created_by_group=self.group,
modified_by_user=self.user,
modified_by_group=self.group,
)
file.size = self.memory_file.getbuffer().nbytes
self.memory_file.seek(0)
django_file = DjangoFile(name=file.name, file=self.memory_file)
file.content = django_file

try:
validate_file(file)
except ValidationError:
raise DAVError(HTTP_FORBIDDEN)

file.save()
self.file = file
self.memory_file.do_close()
super().end_write(with_errors=with_errors)


Expand Down

0 comments on commit 564e484

Please sign in to comment.