SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 884f39ce authored by Jean-Sébastien Caux's avatar Jean-Sébastien Caux
Browse files

Put secure storage directly in apimail, for reusability's sake

parent cd574112
No related branches found
No related tags found
No related merge requests found
...@@ -44,7 +44,6 @@ class Command(BaseCommand): ...@@ -44,7 +44,6 @@ class Command(BaseCommand):
orphan.save() orphan.save()
except StoredMessage.DoesNotExist: except StoredMessage.DoesNotExist:
# Need to get and create the message # Need to get and create the message
try: try:
storage_url = orphan.data['storage']['url'] storage_url = orphan.data['storage']['url']
......
# Generated by Django 2.2.16 on 2020-10-17 14:58
import apimail.storage
import apimail.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('apimail', '0023_domain_status'),
]
operations = [
migrations.AlterField(
model_name='attachmentfile',
name='file',
field=models.FileField(storage=apimail.storage.APIMailSecureFileStorage(), upload_to='uploads/mail/attachments/%Y/%m/%d/', validators=[apimail.validators.validate_max_email_attachment_file_size]),
),
]
...@@ -8,7 +8,7 @@ from django.contrib.postgres.fields import JSONField ...@@ -8,7 +8,7 @@ from django.contrib.postgres.fields import JSONField
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from scipost.storage import SecureFileStorage from ..storage import APIMailSecureFileStorage
from ..validators import validate_max_email_attachment_file_size from ..validators import validate_max_email_attachment_file_size
...@@ -27,7 +27,7 @@ class AttachmentFile(models.Model): ...@@ -27,7 +27,7 @@ class AttachmentFile(models.Model):
file = models.FileField( file = models.FileField(
upload_to='uploads/mail/attachments/%Y/%m/%d/', upload_to='uploads/mail/attachments/%Y/%m/%d/',
validators=[validate_max_email_attachment_file_size,], validators=[validate_max_email_attachment_file_size,],
storage=SecureFileStorage()) storage=APIMailSecureFileStorage())
def __str__(self): def __str__(self):
return '%s (%s, %s)' % (self.data['name'], self.data['content-type'], self.file.size) return '%s (%s, %s)' % (self.data['name'], self.data['content-type'], self.file.size)
......
...@@ -10,10 +10,7 @@ from django.db import models ...@@ -10,10 +10,7 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from scipost.storage import SecureFileStorage
from ..managers import ComposedMessageQuerySet from ..managers import ComposedMessageQuerySet
from ..validators import validate_max_email_attachment_file_size
class ComposedMessage(models.Model): class ComposedMessage(models.Model):
......
...@@ -10,10 +10,7 @@ from django.db import models ...@@ -10,10 +10,7 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from scipost.storage import SecureFileStorage
from ..managers import StoredMessageQuerySet from ..managers import StoredMessageQuerySet
from ..validators import validate_max_email_attachment_file_size
class StoredMessage(models.Model): class StoredMessage(models.Model):
......
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.utils.functional import cached_property
class APIMailSecureFileStorage(FileSystemStorage):
"""
Inherit default FileStorage system to prevent files from being publicly accessible
from a server location that is opened without this permission having been explicitly given.
"""
@cached_property
def location(self):
"""
This method determines the storage location for a new file. To secure the file from
public access, it is stored outside the default MEDIA_ROOT folder.
This also means you need to explicitly handle the file reading/opening!
"""
if hasattr(settings, 'APIMAIL_MEDIA_ROOT_SECURE'):
return self._value_or_setting(self._location, settings.APIMAIL_MEDIA_ROOT_SECURE)
return super().location
@cached_property
def base_url(self):
return settings.APIMAIL_MEDIA_URL_SECURE
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment