Exemple #1
0
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
Exemple #2
0
    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()
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
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
Exemple #6
0
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