def get_tip_export(session, tid, user_id, rtip_id, language): rtip, itip = db_access_rtip(session, tid, user_id, rtip_id) user, context = session.query(models.User, models.Context) \ .filter(models.User.id == rtip.receiver_id, models.Context.id == models.InternalTip.context_id, models.InternalTip.id == rtip.internaltip_id, models.UserTenant.user_id == models.User.id, models.UserTenant.tenant_id == tid).one() rtip_dict = serialize_rtip(session, rtip, itip, language) export_dict = { 'type': u'export_template', 'node': db_admin_serialize_node(session, tid, language), 'notification': db_get_notification(session, tid, language), 'tip': rtip_dict, 'user': user_serialize_user(session, user, language), 'context': admin_serialize_context(session, context, language), 'comments': rtip_dict['comments'], 'messages': rtip_dict['messages'], 'files': [] } export_template = Templating().format_template( export_dict['notification']['export_template'], export_dict).encode('utf-8') export_template = msdos_encode(text_type(export_template, 'utf-8')).encode('utf-8') export_dict['files'].append({ 'fo': BytesIO(export_template), 'name': "data.txt" }) for rfile in session.query(models.ReceiverFile).filter( models.ReceiverFile.receivertip_id == rtip_id): rfile.last_access = datetime_now() rfile.downloads += 1 file_dict = models.serializers.serialize_rfile(session, tid, rfile) file_dict['name'] = 'files/' + file_dict['name'] file_dict['path'] = os.path.join(Settings.attachments_path, file_dict['filename']) export_dict['files'].append(file_dict) for wf in session.query(models.WhistleblowerFile).filter( models.WhistleblowerFile.receivertip_id == models.ReceiverTip.id, models.ReceiverTip.internaltip_id == rtip.internaltip_id, models.InternalTip.id == rtip.internaltip_id): file_dict = models.serializers.serialize_wbfile(session, tid, wf) file_dict['name'] = 'files_from_recipients/' + file_dict['name'] file_dict['path'] = os.path.join(Settings.attachments_path, file_dict['filename']) export_dict['files'].append(file_dict) return export_dict
def get(self, rtip_id): tip_export = yield get_tip_export(self.request.tid, self.current_user.user_id, rtip_id, self.request.language) if tip_export['crypto_tip_prv_key']: tip_export['tip'] = yield deferToThread( decrypt_tip, self.current_user.cc, tip_export['crypto_tip_prv_key'], tip_export['tip']) for file_dict in tip_export['tip']['rfiles'] + tip_export['tip'][ 'wbfiles']: if file_dict.get('status', '') == 'encrypted' or file_dict.get('forged'): continue tip_prv_key = GCE.asymmetric_decrypt( self.current_user.cc, tip_export['crypto_tip_prv_key']) file_dict['fo'] = GCE.streaming_encryption_open( 'DECRYPT', tip_prv_key, file_dict['path']) del file_dict['path'] for file_dict in tip_export['tip']['rfiles']: file_dict['name'] = 'files/' + file_dict['name'] if file_dict.get('status', '') == 'encrypted': file_dict['name'] += '.pgp' for file_dict in tip_export['tip']['wbfiles']: file_dict[ 'name'] = 'files_attached_from_recipients/' + file_dict['name'] tip_export['comments'] = tip_export['tip']['comments'] tip_export['messages'] = tip_export['tip']['messages'] files = tip_export['tip']['rfiles'] + tip_export['tip']['wbfiles'] del tip_export['tip']['rfiles'], tip_export['tip']['wbfiles'] export_template = Templating().format_template( tip_export['notification']['export_template'], tip_export).encode() export_template = msdos_encode(export_template.decode()).encode() files.append({ 'fo': BytesIO(export_template), 'name': 'data.txt', 'forged': True }) self.request.setHeader(b'X-Download-Options', b'noopen') self.request.setHeader(b'Content-Type', b'application/octet-stream') self.request.setHeader(b'Content-Disposition', b'attachment; filename="submission.zip"') self.zip_stream = iter(ZipStream(files)) yield ZipStreamProducer(self, self.zip_stream).start()
def test_msdos_encode(self): strs = [ ('This is \n news', 'This is \r\n news'), ('No\r\nreplace', 'No\r\nreplace'), ('No\r\n\nreplace', 'No\r\n\r\nreplace'), ('No', 'No'), ('\nNo\n\n', '\r\nNo\r\n\r\n'), ('\r\nNo\n\n', '\r\nNo\r\n\r\n'), ] for (i, o) in strs: self.assertEqual(utility.msdos_encode(i), o)
def get_tip_export(store, user_id, rtip_id, language): rtip = db_access_rtip(store, user_id, rtip_id) receiver = rtip.receiver rtip_dict = serialize_rtip(store, rtip, language) export_dict = { 'type': u'export_template', 'node': db_admin_serialize_node(store, language), 'notification': db_get_notification(store, language), 'tip': serialize_rtip(store, rtip, language), 'context': admin_serialize_context(store, rtip.internaltip.context, language), 'receiver': admin_serialize_receiver(store, receiver, language), 'comments': rtip_dict['comments'], 'messages': rtip_dict['messages'], 'files': [] } export_template = Templating().format_template( export_dict['notification']['export_template'], export_dict).encode('utf-8') export_template = msdos_encode(export_template) export_dict['files'].append({'buf': export_template, 'name': "data.txt"}) for rf in store.find(models.ReceiverFile, models.ReceiverFile.receivertip_id == rtip_id): rf.downloads += 1 file_dict = models.serializers.serialize_rfile(rf) file_dict['name'] = 'files/' + file_dict['name'] export_dict['files'].append(file_dict) rtips_ids = [rt.id for rt in rtip.internaltip.receivertips] wfs = store.find(models.WhistleblowerFile, In(models.WhistleblowerFile.receivertip_id, rtips_ids)) for wf in wfs: file_dict = models.serializers.serialize_wbfile(wf) file_dict['name'] = 'files_from_recipients/' + file_dict['name'] export_dict['files'].append(file_dict) return export_dict
def get_tip_export(store, user_id, rtip_id, language): rtip = db_access_rtip(store, user_id, rtip_id) receiver = rtip.receiver rtip_dict = serialize_rtip(store, rtip, language) export_dict = { 'type': u'export_template', 'node': db_admin_serialize_node(store, language), 'notification': db_get_notification(store, language), 'tip': serialize_rtip(store, rtip, language), 'context': admin_serialize_context(store, rtip.internaltip.context, language), 'receiver': admin_serialize_receiver(receiver, language), 'comments': rtip_dict['comments'], 'messages': rtip_dict['messages'], 'files': [] } export_template = Templating().format_template(export_dict['notification']['export_template'], export_dict).encode('utf-8') export_template = msdos_encode(export_template) export_dict['files'].append({'buf': export_template, 'name': "data.txt"}) for rf in store.find(models.ReceiverFile, models.ReceiverFile.receivertip_id == rtip_id): rf.downloads += 1 file_dict = models.serializers.serialize_rfile(rf) file_dict['name'] = 'files/' + file_dict['name'] export_dict['files'].append(copy.deepcopy(file_dict)) rtips_ids = [rt.id for rt in rtip.internaltip.receivertips] wfs = store.find(models.WhistleblowerFile, In(models.WhistleblowerFile.receivertip_id, rtips_ids)) for wf in wfs: file_dict = models.serializers.serialize_wbfile(wf) file_dict['name'] = 'files_from_recipients/' + file_dict['name'] export_dict['files'].append(copy.deepcopy(file_dict)) return export_dict