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