Projet

Général

Profil

cryptor-interdiff.patch

Thomas Noël, 03 mars 2020 01:02

Télécharger (2,1 ko)

Voir les différences:


  

passerelle/apps/cryptor/models.py
35 35

  
36 36
from passerelle.base.models import BaseResource
37 37
from passerelle.utils.api import endpoint
38
from passerelle.utils.files import atomic_write
38 39
from passerelle.utils.jsonresponse import APIError
39 40

  
40 41

  
......
143 144
        filename = os.path.join(dirname, uuid)
144 145
        return filename
145 146

  
146
    @contextlib.contextmanager
147
    def named_tempfile(self, *args, **kwargs):
148
        tmp_dir = os.path.join(default_storage.path(self.get_connector_slug()),
149
                               self.slug, 'tmp')
150
        makedir(tmp_dir)
151
        with tempfile.NamedTemporaryFile(dir=tmp_dir, suffix='.tmp', delete=False,
152
                                         *args, **kwargs) as tpf:
153
            yield tpf
154 147

  
155 148
    @endpoint(name='file-encrypt', perm='can_encrypt',
156 149
              description=_('Encrypt a file'),
......
189 182
            'redirect_url': redirect_url,
190 183
        }
191 184

  
192
        # atomic writes (tmp file + move)
193
        with self.named_tempfile() as tpf:
194
            write_encrypt(tpf, data, self.public_key)
195
            tpf.flush()
196
            os.fsync(tpf.file.fileno())
197
            tempfile_name = tpf.name
198
        os.rename(tempfile_name, content_filename)
199
        with self.named_tempfile(mode='w') as tpf:
200
            json.dump(metadata, tpf, indent=2)
201
            tpf.flush()
202
            os.fsync(tpf.file.fileno())
203
            tempfile_name = tpf.name
204
        os.rename(tempfile_name, metadata_filename)
185
        tmp_dir = os.path.join(default_storage.path(self.get_connector_slug()), self.slug, 'tmp')
186
        with atomic_write(content_filename, dir=tmp_dir) as fd:
187
            write_encrypt(fd, data, self.public_key)
188
        with atomic_write(metadata_filename, dir=tmp_dir, mode='w') as fd:
189
            json.dump(metadata, fd, indent=2)
205 190

  
206 191
        return {'data': metadata}
207 192