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 |
|