예제 #1
0
def process_id(upload_id):
    from run import config
    # Fetch upload id
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    if queued_sample is not None:
        if queued_sample.user_id == g.user.id:
            # Allowed to process
            versions = CCExtractorVersion.query.all()
            form = FinishQueuedSampleForm(request.form)
            form.version.choices = [(v.id, v.version) for v in versions]
            if form.validate_on_submit():
                # Store in DB
                db_committed = False
                temp_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''),
                                         'QueuedFiles', queued_sample.filename)
                final_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''),
                                          'TestFiles', queued_sample.filename)
                try:
                    extension = queued_sample.extension[1:] if len(
                        queued_sample.extension) > 0 else ""
                    sample = Sample(queued_sample.sha, extension,
                                    queued_sample.original_name)
                    g.db.add(sample)
                    g.db.flush([sample])
                    uploaded = Upload(g.user.id, sample.id, form.version.data,
                                      Platform.from_string(form.platform.data),
                                      form.parameters.data, form.notes.data)
                    g.db.add(uploaded)
                    g.db.delete(queued_sample)
                    g.db.commit()
                    db_committed = True
                except:
                    traceback.print_exc()
                    g.db.rollback()
                # Move file
                if db_committed:
                    os.rename(temp_path, final_path)
                    return redirect(
                        url_for('sample.sample_by_id', sample_id=sample.id))

            return {'form': form, 'queued_sample': queued_sample}

    # Raise error
    raise QueuedSampleNotFoundException()
예제 #2
0
def process_id(upload_id):
    """
    Process the sample that is uploaded to the platform

    :param upload_id: The identity of uploaded file that will be processed
    :type upload_id: str
    :return: Process progress in form and queue the sample
    :rtype: str
    """
    from run import config, log
    # Fetch upload id
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    if queued_sample is not None:
        if queued_sample.user_id == g.user.id:
            # Allowed to process
            versions = CCExtractorVersion.query.all()
            form = FinishQueuedSampleForm(request.form)
            form.version.choices = [(v.id, v.version) for v in versions]
            if form.validate_on_submit():
                # Store in DB
                db_committed = False
                repo_folder = config.get('SAMPLE_REPOSITORY', '')
                temp_path = os.path.join(repo_folder, 'QueuedFiles',
                                         queued_sample.filename)
                final_path = os.path.join(repo_folder, 'TestFiles',
                                          queued_sample.filename)
                try:
                    extension = queued_sample.extension[1:] if len(
                        queued_sample.extension) > 0 else ""
                    sample = Sample(queued_sample.sha, extension,
                                    queued_sample.original_name)
                    g.db.add(sample)
                    g.db.flush([sample])
                    uploaded = Upload(g.user.id, sample.id, form.version.data,
                                      Platform.from_string(form.platform.data),
                                      form.parameters.data, form.notes.data)
                    g.db.add(uploaded)
                    g.db.delete(queued_sample)
                    g.db.commit()
                    db_committed = True
                except Exception:
                    traceback.print_exc()
                    g.db.rollback()
                # Move file
                if db_committed:
                    if form.report.data == 'y':
                        data = ""
                        try:
                            kvm_name = config.get('KVM_LINUX_NAME', '')
                            repo = Repo(
                                os.path.join(repo_folder, 'vm_data', kvm_name,
                                             'unsafe-ccextractor'))
                            data = repo.git.show('{branch}:{file}'.format(
                                branch=repo.heads.master,
                                file='.github/ISSUE_TEMPLATE.md'))
                        except InvalidGitRepositoryError:
                            log.critical(
                                " Could not open CCExtractor's repository ")

                        version = CCExtractorVersion.query.filter(
                            CCExtractorVersion.id ==
                            form.version.data).first()
                        data = data.replace('**X.X**', version.version)
                        data = data.replace('[ ] I have read',
                                            '[X] I have read')
                        data = data.replace('[ ] I have checked',
                                            '[X] I have checked')
                        data = data.replace('[ ] I have used',
                                            '[X] I have used')
                        data = data.replace(
                            '[ ] I am an active contributor to CCExtractor.',
                            '[X] I used the platform to submit this issue!')
                        data = data.replace(
                            '`-autoprogram`',
                            '`{param}`'.format(param=form.parameters.data,
                                               version=form.version.data))
                        platform = form.platform.data.title()
                        data = data.replace('[ ] ' + platform,
                                            '[X] ' + platform)
                        # Remove everything starting from the video links
                        data = data[:data.find('**Video links**')]
                        # Append our own content here
                        sample_link = url_for('sample.sample_by_id',
                                              sample_id=sample.id,
                                              _external=True)
                        data += '**Sample**\n\n[Sample {id}]({link}) was uploaded on the sample platform.\n'.format(
                            id=sample.id, link=sample_link)
                        data += '**Extra information**\n\n*Notes:*\n{notes}\n*Description:*\n{desc}'.format(
                            notes=form.notes.data, desc=form.IssueBody.data)
                        issue_title = '[BUG] {data}'.format(
                            data=form.IssueTitle.data)
                        issue_upload = make_github_issue(
                            issue_title, data,
                            ['bug', 'sample' + str(sample.id)])

                        if issue_upload != 'ERROR':
                            issue_data = json.loads(issue_upload)
                            issue_id = issue_data['number']
                            issue_title = issue_data['title']
                            issue_user = issue_data['user']['login']
                            issue_date = issue_data['created_at']
                            issue_status = issue_data['state']
                            issue = Issue(sample.id, issue_id, issue_date,
                                          issue_title, issue_user,
                                          issue_status)
                            g.db.add(issue)
                            g.db.commit()
                        else:
                            flash(
                                'Could not submit an issue on GitHub (did you revoke permissions for the  platform?).'
                                ' Please submit it manually.')

                    os.rename(temp_path, final_path)
                    return redirect(
                        url_for('sample.sample_by_id', sample_id=sample.id))

            return {'form': form, 'queued_sample': queued_sample}

    # Raise error
    raise QueuedSampleNotFoundException()