Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow setting a request id or use a generated one #8

Merged
merged 1 commit into from
Oct 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions morpheus_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from utils.sbom_tools import parse_sbom
from callback.http_callback import HttpCallback
from utils.output_tools import generate_markdown
from utils.input_tools import build_input, print_input_data
from utils.input_tools import build_input, generate_id, print_input_data, update_id

st.set_page_config(page_title='Morpheus Client', layout='wide')

Expand Down Expand Up @@ -40,9 +40,8 @@ def print_output():
for item in items:
with st.expander(item[0], expanded=True):
st.markdown(item[1])
image = data['input']['image']['name'].split('/')[-1]
tag = data['input']['image']['tag']
file_name = f"{image}:{tag}-output.json"
id = data['input']['scan']['id']
file_name = f"{id}-output.json"
st.download_button(label='Download', type='primary', data=json.dumps(data), file_name=file_name)


Expand Down Expand Up @@ -94,6 +93,7 @@ def update_file():
st.session_state.sbom = sbom
st.session_state['git_loading'] = False
set_data_ready()
update_id()
except Exception as exc:
main_col.error(repr(exc))

Expand All @@ -116,10 +116,16 @@ def save_file():
else:
return ""


main_col, helper_col = st.columns([2, 5])
main_col.header("Build Morpheus Request")

if 'id' not in st.session_state:
st.session_state['id'] = ''
manual_id = main_col.text_input(label='ID', value=st.session_state['id'])
if manual_id and manual_id != st.session_state['id']:
st.session_state['id'] = manual_id
update_file()

st.session_state.cves = main_col.text_input(label='CVEs', placeholder='CVE-2024-27304, CVE-2024-2961, ...',
value='CVE-2024-27304', on_change=set_data_ready)
st.session_state.input_file = main_col.file_uploader("Pick a CycloneDX SBOM File generated form Syft")
Expand All @@ -129,11 +135,10 @@ def save_file():
disabled=is_running() or not st.session_state['data_ready'])

def get_input_filename():
if 'sbom' not in st.session_state:
return 'input.json'
name = st.session_state.sbom.name.removeprefix("registry.redhat.io/").replace("/", "_")
tag = st.session_state.sbom.tag
return f"{name}:{tag}-input.json"
if 'sbom' not in st.session_state or st.session_state['id'] == '':
return "input.json"
id = st.session_state['id']
return f"{id}-input.json"

main_col.download_button('Save Morpheus Input', type='secondary', file_name=get_input_filename(),
disabled=not st.session_state['data_ready'], data=save_file())
Expand Down
1 change: 1 addition & 0 deletions utils/client_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class Vuln(BaseModel):


class Scan(BaseModel):
id: str | None = None
vulns: list[Vuln]


Expand Down
18 changes: 17 additions & 1 deletion utils/input_tools.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import uuid
import streamlit as st

from utils.client_model import SUPPORTED_LANGUAGES, Image, InputRequest, JsonSbomInfo, ManualSbomInfo, SbomPackage, Scan, SourceInfo, Vuln
Expand Down Expand Up @@ -182,6 +183,13 @@ def __sbom_to_csv(sbom: dict) -> list[SbomPackage]:
return pkgs


def generate_id():
if 'sbom' not in st.session_state:
return uuid.uuid4()
name = st.session_state.sbom.name.removeprefix("registry.redhat.io/").replace("/", "_")
tag = st.session_state.sbom.tag
return f"{name}:{tag}"

def build_image_from_sbom(sbom: SbomInput, input_format: str) -> Image:
if input_format == 'JSON':
sbom_info = JsonSbomInfo(
Expand All @@ -197,14 +205,22 @@ def build_image_from_sbom(sbom: SbomInput, input_format: str) -> Image:
include=__get_includes('Docs'), exclude=__get_excludes('Docs'))]
return Image(name=sbom.name, tag=sbom.tag, source_info=sources, sbom_info=sbom_info)

def update_id():
if st.session_state['id'] == '' and 'sbom' in st.session_state:
st.session_state['id'] = generate_id()

def build_input() -> InputRequest:
if 'sbom' not in st.session_state:
return ""
sbom: SbomInput = st.session_state.sbom
cves_text = st.session_state.cves
st.session_state['morpheus_waiting'] = True
input_format = st.session_state.input_format
cves = [cve.strip() for cve in cves_text.split(',')]
scan = Scan(vulns=[Vuln(vuln_id=cve) for cve in cves])

if st.session_state['id']== '':
st.session_state['id'] = generate_id()
scan = Scan(id=st.session_state['id'], vulns=[Vuln(vuln_id=cve) for cve in cves])
input_data = InputRequest(
image=build_image_from_sbom(sbom, input_format), scan=scan)
return input_data
Expand Down