Пример #1
0
def delete_id(upload_id):
    """
    Delete upload with given id.

    :param upload_id: upload id
    :type upload_id: int
    :raises QueuedSampleNotFoundException: when upload id not found
    :return: form to delete upload and queued samples.
    :rtype: dict
    """
    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 or g.user.is_admin:
            # Allowed to remove
            form = DeleteQueuedSampleForm(request.form)
            if form.validate_on_submit():
                # Delete file, then delete from database
                file_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''),
                                         'QueuedFiles', queued_sample.filename)
                os.remove(file_path)
                g.db.delete(queued_sample)
                g.db.commit()
                g.log.warning(f'upload with id: {upload_id} deleted')
                return redirect(url_for('.index'))

            return {'form': form, 'queued_sample': queued_sample}
        g.log.warning(
            f'user with id: {g.user.id} tried to access upload belonging to user with id: {queued_sample.user_id}'
        )

    # Raise error
    raise QueuedSampleNotFoundException()
Пример #2
0
def link_id(upload_id):
    """
    View sample with upload id.

    :param upload_id: upload id of the sample
    :type upload_id: int
    :raises QueuedSampleNotFoundException: when upload id is not found
    :return: samples and queued samples with given upload id
    :rtype: dict
    """
    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 link
            user_uploads = Upload.query.filter(
                Upload.user_id == g.user.id).all()

            return {
                'samples': [u.sample for u in user_uploads],
                'queued_sample': queued_sample
            }
        g.log.warning(
            f'user with id: {g.user.id} tried to access upload belonging to user with id: {queued_sample.user_id}'
        )

    # Raise error
    raise QueuedSampleNotFoundException()
Пример #3
0
def link_id_confirm(upload_id, sample_id):
    """
    Confirm link for upload id and sample id.

    :param upload_id: upload id
    :type upload_id: int
    :param sample_id: sample id
    :type sample_id: int
    :raises QueuedSampleNotFoundException: when upload id is not found
    :return: redirect to index
    :rtype: Flask redirect
    """
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    sample = Sample.query.filter(Sample.id == sample_id).first()
    if queued_sample is not None and sample is not None:
        if queued_sample.user_id == g.user.id and sample.upload.user_id == g.user.id:
            # Allowed to link
            return redirect(url_for('.index'))

    # Raise error
    raise QueuedSampleNotFoundException()
Пример #4
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
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    if queued_sample is not None:
        if queued_sample.user_id == g.user.id:
            versions = CCExtractorVersion.query.all()
            form = FinishQueuedSampleForm(request.form)
            form.version.choices = [(v.id, v.version) for v in versions]
            if form.validate_on_submit():
                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()

                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(
                                f"{repo.heads.master}:.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`",
                                            f"`{form.parameters.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 += f"""
**Sample**

[Sample {sample.id}]({sample_link}) uploaded on the Sample Platform.

**Extra information**

*Notes:*
{form.notes.data}
*Description:*
{form.IssueBody.data}"""
                        issue_title = f"[BUG] {form.IssueTitle.data}"
                        issue_data = make_github_issue(
                            issue_title, data, ['bug', f'sample_{sample.id}'])

                        if issue_data != 'ERROR':
                            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()