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):
orphan.save()
except StoredMessage.DoesNotExist:
# Need to get and create the message
try:
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
from django.db import models
from django.urls import reverse
from scipost.storage import SecureFileStorage
from ..storage import APIMailSecureFileStorage
from ..validators import validate_max_email_attachment_file_size
......@@ -27,7 +27,7 @@ class AttachmentFile(models.Model):
file = models.FileField(
upload_to='uploads/mail/attachments/%Y/%m/%d/',
validators=[validate_max_email_attachment_file_size,],
storage=SecureFileStorage())
storage=APIMailSecureFileStorage())
def __str__(self):
return '%s (%s, %s)' % (self.data['name'], self.data['content-type'], self.file.size)
......
......@@ -10,10 +10,7 @@ from django.db import models
from django.urls import reverse
from django.utils import timezone
from scipost.storage import SecureFileStorage
from ..managers import ComposedMessageQuerySet
from ..validators import validate_max_email_attachment_file_size
class ComposedMessage(models.Model):
......
......@@ -10,10 +10,7 @@ from django.db import models
from django.urls import reverse
from django.utils import timezone
from scipost.storage import SecureFileStorage
from ..managers import StoredMessageQuerySet
from ..validators import validate_max_email_attachment_file_size
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