{"version":3,"sources":["img/logo.svg","img/logo_full.svg","container/Header.js","img/easter_egg.svg","components/NotImplemented.js","components/ViewHeading.js","views/preparation/AttackListView.js","views/preparation/AttackByParameterView.js","views/preparation/AttackNewView.js","components/Card.js","components/Loading.js","views/preparation/CommandListView.js","components/APISearchbar.js","components/Button.js","components/Draggable.js","components/Droppable.js","views/preparation/CommandByParameterView.js","img/werkschau_leonschmidt.png","img/werkschau_nicolajaeger.png","img/werkschau_nadineweber.png","views/preparation/AboutView.js","views/preparation/CommandNewView.js","pages/PreperationPage.js","utils/Template.js","utils/enums.js","components/CodeWrapper.js","components/Tooltip.js","components/CommandTemplateValueBox.js","components/CommandTemplateForm.js","pages/CommandViewerPage.js","pages/AttackViewerPage.js","pages/PerformAttackPage.js","components/NotFound.js","components/LinkButton.js","components/LinkButtonGroup.js","container/Sidebar.js","container/ViewContainer.js","App.js","reportWebVitals.js","index.js"],"names":["Header","sidebarCollapsed","setSidebarCollapsed","useState","hovering","setHovering","className","onClick","old","fill","viewBox","stroke","aria-hidden","strokeLinecap","strokeLinejoin","strokeWidth","d","to","onMouseOver","onMouseLeave","src","logoFull","width","alt","logo","NotImplemented","plannedFor","type","data","easterEgg","ViewHeading","title","subtitle","AttackListView","AttackByParameterView","AttackNewView","Card","titleOverwrite","smallPadding","children","Loading","CommandListView","searchTerm","setSearchTerm","setData","filtered","setFiltered","useEffect","fetch","then","r","json","catch","e","console","log","handleChange","event","term","target","value","filter","command","sTerm","toLowerCase","name","includes","description","onChange","placeholder","map","_id","APISearchbar","searchFor","overlay","setTerm","searchTimer","setSearchTimer","showingResults","setShowingResults","results","setResults","ref","useRef","document","addEventListener","handleOutsideClick","removeEventListener","preventDefault","current","contains","clearTimeout","timeout","setTimeout","p","URLSearchParams","set","toString","error","doOverlay","Button","important","fullWidth","noWrap","submit","Draggable","itemType","itemObject","useDrag","item","collect","monitor","opacity","isDragging","dragRef","style","Droppable","acceptItemTypes","dropFunc","canDropClassName","isOverClassName","useDrop","accept","canDrop","isOver","drop","dropRef","CommandByParameterView","have","setHave","want","setWant","viewingResults","setViewingResults","cardStyle","namedObj","withRemoveButton","removeButtonOnClickCallback","undefined","hidden","orientation","translate","x","y","c","body","length","h","method","JSON","stringify","temp","push","idToRemove","i","findIndex","splice","AboutView","imgNicola","imgLeon","imgNadine","href","rel","CommandNewView","template","template_values","formValues","setFormValues","response","setResponse","handleSubmit","a","v","parse","alert","headers","text","onSubmit","rows","PreperationPage","path","useRouteMatch","exact","component","Template","this","raw","split","templateCopy","matchAll","replace","regex","test","commandTemplateValueTypes","CodeWrapper","Tooltip","tip","onMouseOut","CommandTemplateValueBox","plaintext","templateName","templateValue","formData","setFormData","checked","valTypes","triggered","hint","inputTypesOf","inputType","index","size","CommandTemplateForm","templateValues","withPreview","fd","Object","entries","forEach","n","default_state","default","marked","markedArray","fullCommandString","fcs","usage","copied","setCopied","onCopy","CommandViewerPage","commandID","match","params","instructions","online_manpage","requires_root","AttackViewerPage","PerformAttackPage","NotFound","LinkButton","selected","useLocation","pathname","LinkButtonGroup","Sidebar","collapsed","ViewContainer","App","DndProvider","backend","HTML5Backend","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.250b3767.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/logo.5ce6fba9.svg\";","export default __webpack_public_path__ + \"static/media/logo_full.74710891.svg\";","import React, { useState } from \"react\"\nimport { Link } from \"react-router-dom\"\nimport logo from \"../img/logo.svg\"\nimport logoFull from \"../img/logo_full.svg\"\n\n/**\n * This is PAQMANs header for all pages\n * @param props\n * @param props.sidebarCollapsed State if sidebar is collapsed\n * @param props.setSidebarCollapsed State function to set if the sidebar should be collapsed\n */\nexport default function Header({ sidebarCollapsed, setSidebarCollapsed }) {\n const [hovering, setHovering] = useState(false)\n\n return (\n
\n
\n
\n {sidebarCollapsed ? (\n setSidebarCollapsed(old => !old)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"grey\"\n aria-hidden=\"true\"\n >\n \n \n ) : (\n setSidebarCollapsed(old => !old)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"grey\"\n aria-hidden=\"true\"\n >\n \n \n )}\n
\n \n setHovering(true)}\n onMouseLeave={() => setHovering(false)}\n >\n {hovering ? (\n \n ) : (\n \n )}\n
\n \n
\n \n )\n}\n","export default __webpack_public_path__ + \"static/media/easter_egg.deacb52d.svg\";","import React from \"react\"\nimport easterEgg from \"../img/easter_egg.svg\"\n/**\n * This component can be used to signal, that a feature\n * has not been implemented yet.\n * @param props\n * @param props.plannedFor For which version the feature is planned for\n */\nexport default function NotImplemented({ plannedFor }) {\n return (\n
\n
\n

Not implemented yet!

\n {plannedFor && (\n

Planned for {plannedFor}

\n )}\n
\n \n svg-animation\n \n
\n )\n}\n","import React from \"react\"\n\n/**\n * This component MUST be used on views for displaying the views title.\n * @param props\n * @param props.title The views title/heading\n * @param props.subtitle Will be displayed below the titel (optional)\n */\nexport default function ViewHeading({ title, subtitle }) {\n return (\n
\n

{title}

\n

{subtitle}

\n
\n )\n}\n","import React from \"react\"\nimport NotImplemented from \"../../components/NotImplemented\"\nimport ViewHeading from \"../../components/ViewHeading\"\n\n/**\n * This view provides a list of all attacks for the preparation page\n */\nexport default function AttackListView() {\n return (\n
\n \n \n
\n )\n}\n","import React from \"react\"\nimport NotImplemented from \"../../components/NotImplemented\"\nimport ViewHeading from \"../../components/ViewHeading\"\n\n/**\n * This view allows to search for attacks by parameters that you already have.\n * It is the heart of PAQMAN.\n */\nexport default function AttackByParameterView() {\n return (\n
\n \n \n
\n )\n}\n","import React from \"react\"\nimport NotImplemented from \"../../components/NotImplemented\"\nimport ViewHeading from \"../../components/ViewHeading\"\n\n/**\n * This view is used to create new attacks\n */\nexport default function AttackNewView() {\n return (\n
\n \n \n
\n )\n}\n","import React from \"react\"\n\n/**\n * A styled card with a gray-highlighted title\n * @param props\n * @param props.title The title of the card\n * @param props.titleOverwrite Used to provide custom HTML for the title div. If this is set, the title prop is ignored.\n * @param props.smallPadding If the padding should be smaller (useful if used as some kind of entry)\n * @param props.className CSS classes to pass in the component\n */\nexport default function Card({\n title,\n titleOverwrite,\n smallPadding,\n className,\n children,\n}) {\n return (\n \n {!title && !titleOverwrite ? null : (\n
\n {title ?

{title}

: titleOverwrite}\n
\n )}\n {children}\n \n )\n}\n","import React from \"react\"\n\nexport default function Loading() {\n return

Loading

\n}\n","import React, { useState, useEffect } from \"react\"\nimport { Link } from \"react-router-dom\"\nimport ViewHeading from \"../../components/ViewHeading\"\nimport Card from \"../../components/Card\"\nimport Loading from \"../../components/Loading\"\n\n/**\n * This view provides a list of all commands for the preparation page\n */\nexport default function CommandListView() {\n const [searchTerm, setSearchTerm] = useState(\"\")\n const [data, setData] = useState()\n const [filtered, setFiltered] = useState()\n\n useEffect(() => {\n fetch(\"/api/commands\")\n .then(r => r.json())\n .then(r => {\n setData(r)\n setFiltered(r)\n return r\n })\n .catch(e => console.log(e))\n }, [])\n\n const handleChange = event => {\n let term = event.target.value\n setSearchTerm(term)\n setFiltered(\n data.filter(command => {\n let sTerm = term.toLowerCase()\n return (\n command.name.toLowerCase().includes(sTerm) ||\n command.description.toLowerCase().includes(sTerm)\n )\n })\n )\n }\n\n return (\n
\n \n
\n {/* Search bar (using client side filtering) */}\n
\n \n {/* Delete term button */}\n {searchTerm && searchTerm !== \"\" && (\n {\n setSearchTerm(\"\")\n handleChange(event)\n }}\n className=\"absolute top-2 right-4 z-30 text-xl text-gray-400 focus:outline-none\"\n >\n ×\n \n )}\n
\n
\n
\n {filtered ? ( // render out the filtered commands\n filtered.map(e => (\n
\n \n \n

{e.description}

\n
\n \n
\n ))\n ) : (\n \n )}\n
\n
\n )\n}\n","import React, { useEffect, useRef, useState } from \"react\"\n\n/**\n * Uses the /search enpoint to search for commands, parameters or attacks.\n * @param props\n * @param props.searchFor Can be one of (\"command\", \"parameter\", \"attack\"). If not set, a global search is performed\n * @param props.overlay A function with signature `function (results): React.Component`. It receives the results\n * from the database and is used to provide customized layout of the result representation\n */\nexport default function APISearchbar({ searchFor, overlay }) {\n // search term that the user searches for\n const [term, setTerm] = useState(\"\")\n // timeout that triggers the fetch /api/search call, when the user stops typing\n const [searchTimer, setSearchTimer] = useState(null)\n // if there are results available (may be empty)\n const [showingResults, setShowingResults] = useState(false)\n // search results from API\n const [results, setResults] = useState()\n // used to check for clicks outside the div\n const ref = useRef()\n\n useEffect(() => {\n // create the onclick listener on mount to the whole document\n document.addEventListener(\"click\", handleOutsideClick)\n // remove event listener on unmount\n return () => {\n document.removeEventListener(\"click\", handleOutsideClick)\n }\n }, [])\n\n const handleOutsideClick = event => {\n // this callback for the global click listener checks if\n // the click target was outside the div referenced by `ref`\n event.preventDefault()\n if (ref.current && !ref.current.contains(event.target)) {\n setShowingResults(false)\n }\n }\n\n const handleChange = event => {\n let value = event.target.value\n\n clearTimeout(searchTimer) // stops the previous fetch search timeout if there is one\n setSearchTimer(null) // deletes the fetch search timeout\n\n setTerm(value)\n\n // reset reults, if search term is empty\n if (value === \"\") {\n setShowingResults(false)\n setResults()\n return\n }\n\n // create a new fetch search timeout with callback\n let timeout = setTimeout(() => {\n // compose query string\n let p = new URLSearchParams()\n if (searchFor) {\n p.set(\"for\", searchFor)\n }\n p.set(\"term\", value)\n // request and set results\n fetch(`/api/search?${p.toString()}`)\n .then(r => r.json())\n .then(r => setResults(r))\n .then(() => setShowingResults(true))\n .catch(e => console.log(e))\n }, 500)\n setSearchTimer(timeout)\n }\n\n const handleDeleteTerm = event => {\n event.preventDefault()\n // delete the search term and results\n setTerm(\"\")\n setShowingResults(false)\n setResults()\n // reset fetch search timeout\n clearTimeout(searchTimer)\n setSearchTimer(null)\n }\n\n const doOverlay = () => {\n // tries to execute the overlay function\n try {\n return overlay(results)\n } catch (e) {\n console.error('Error while executing the \"overlay\" function: ', e)\n return

ERROR

\n }\n }\n\n return (\n
\n
\n {\n // show the results panel after it has been hidden\n if (results && !showingResults) {\n setShowingResults(true)\n }\n }}\n placeholder={`Search for ${searchFor || \"everything\"}`}\n className=\"relative w-full px-4 py-2 border rounded-lg shadow-lg z-20\"\n />\n {/* Delete term button */}\n {term && term !== \"\" && (\n \n ×\n \n )}\n
\n {/* Results panel */}\n {showingResults && overlay && (\n
\n
\n
\n {results ? doOverlay() :

No results

}\n
\n
\n
\n )}\n
\n )\n}\n","import React from \"react\"\n\n/**\n * A universal styled button. Can be used as a submit button and has two different\n * kinds of styling.\n * @param props\n * @param {Function} props.onClick An onClick handler to be passed in\n * @param {string} props.title Title of the button (visible)\n * @param {boolean} props.important If the button should be filled (true) or only surrounded (false)\n * @param {string} props.fullWidth Whether the button should expand to it's full parent width\n * @param {string} props.noWrap If the text wrapping should be prohibited if the buttons width is too small\n * @param {boolean} props.submit If this is a submit button (used inside a form)\n */\nexport default function Button({\n onClick,\n title,\n important,\n fullWidth,\n noWrap,\n submit,\n}) {\n return (\n \n {title}\n \n )\n}\n","import React from \"react\"\nimport { useDrag } from \"react-dnd\"\n\n/**\n * Draggable creates a draggable object that can be dragged to a Droppable\n * component. Specify the itemType and itemObject to be dragged.\n * @param props\n * @param props.itemType The item types that is the Draggable. Couterpart to\n * Droppables acceptItemTypes prop.\n * @param props.itemObject The javascript object, with with the Droppables\n * dropFunc function is called.\n */\nexport default function Draggable({ itemType, itemObject, children }) {\n const [{ opacity }, dragRef] = useDrag(() => ({\n type: itemType,\n item: itemObject,\n collect: monitor => ({\n opacity: monitor.isDragging() ? 0.5 : 1,\n }),\n }))\n\n return (\n
\n {children}\n
\n )\n}\n","import React from \"react\"\nimport { useDrop } from \"react-dnd\"\n\n/**\n * Droppable creates a div, which allows items wrapped with Draggable to be\n * dragged to. You must specify the allowed item types.\n * @param props\n * @param props.acceptItemTypes The item types that are accepted. Couterpart to Draggables itemType prop.\n * @param props.dropFunc Signature: `function (item): any`. This function is called with the dragged item,\n * when it is released in this area.\n * @param props.className The divs classNames.\n * @param props.canDropClassName The classNames that will be applied, if a Draggable object that is accepted by\n * this Droppable is currently dragged anywhere on the site.\n * @param props.isOverClassName The classNames that will be applied, if a Draggable object that is accepted by\n * this Droppable is currently dragged over this div.\n */\nexport default function Droppable({\n acceptItemTypes,\n dropFunc,\n className,\n canDropClassName,\n isOverClassName,\n children,\n}) {\n const [{ canDrop, isOver }, dropRef] = useDrop(() => ({\n accept: acceptItemTypes,\n collect: monitor => ({\n canDrop: monitor.canDrop(),\n isOver: monitor.isOver(),\n }),\n drop: dropFunc,\n }))\n\n return (\n \n {children}\n \n )\n}\n","import React, { useState } from \"react\"\nimport APISearchbar from \"../../components/APISearchbar\"\nimport ViewHeading from \"../../components/ViewHeading\"\nimport Button from \"../../components/Button\"\nimport Card from \"../../components/Card\"\nimport Draggable from \"../../components/Draggable\"\nimport Droppable from \"../../components/Droppable\"\nimport Tree from \"react-d3-tree\"\n\n/**\n * This view is used to search commands by parameters\n */\nexport default function CommandByParameterView() {\n const [have, setHave] = useState([]) // entrypoints\n const [want, setWant] = useState() // target\n const [results, setResults] = useState() // API results\n const [viewingResults, setViewingResults] = useState(false)\n\n const submit = event => {\n event.preventDefault()\n\n let body = {}\n if (have && have.length > 0) {\n body.have = have.map(h => h._id)\n }\n if (want) {\n body.want = want._id\n }\n\n fetch(`/api/commands/by-parameter`, {\n method: \"POST\",\n body: JSON.stringify(body),\n })\n .then(r => r.json())\n .then(r => setResults(r))\n .catch(e => console.error(e))\n }\n\n /**\n * Creates a block styled name, description pair (may be a command, parameter or attack). This is used as a\n * makro to create the Cards holding search results, entrypoint parameters and the target parameter.\n * @param {Object} namedObj The object that has name and description field\n * @param {bool} options.withRemoveButton If the button to remove the parameter should be displayed\n * @param {Function} options.removeButtonOnClickCallback If options.withRemoveButton is true, provide a\n * function to define what happens, if the button is clicked. Signature: `function (idToDelete): void`\n */\n const cardStyle = (\n namedObj,\n { withRemoveButton, removeButtonOnClickCallback } = {}\n ) => {\n return (\n \n
\n
{namedObj.name}
\n {\n removeButtonOnClickCallback(\n namedObj._id\n )\n }\n : undefined\n }\n // when in d3 viewing mode, hide the remove cross\n hidden={viewingResults === true}\n >\n

×

\n \n \n ) : undefined\n }\n className=\"mb-4\"\n smallPadding\n >\n
\n
\n {namedObj.description || \"No description provided\"}\n
\n
\n \n )\n }\n\n return (\n
\n \n
\n
\n {viewingResults && results ? (\n
\n {results && results.error ? (\n

\n Error: {results.error}\n

\n ) : (\n
\n

\n Possible command path(s)\n {!want || want === \"\"\n ? \" for your entrypoints\"\n : \" to reach your target\"}\n

\n
\n \n
\n
\n )}\n {/*\n
{JSON.stringify(results, null, 4)}
\n */}\n
\n ) : (\n
\n

\n Choose your entrypoint and target parameters\n

\n (\n <>\n {results.map(c => (\n
\n \n {cardStyle(c)}\n \n
\n ))}\n \n )}\n />\n
\n )}\n
\n {/* Main button and dumps for have and want parameters */}\n
\n {/* Main button */}\n
\n {viewingResults ? (\n {\n setViewingResults(false)\n }}\n />\n ) : (\n {\n submit(event)\n setViewingResults(true)\n }}\n />\n )}\n
\n
\n {/* Dump for have parameters */}\n {\n setHave(old => {\n let temp = [...old]\n if (\n !temp.map(e => e._id).includes(item._id)\n ) {\n temp.push(item)\n }\n return temp\n })\n }}\n className=\"flex-1 p-4 m-2 border-2 rounded-lg border-transparent\"\n canDropClassName=\"border-paqteal-500\"\n >\n

\n Entrypoints\n

\n
\n {have && have.length > 0 ? (\n have.map(h => (\n
\n {cardStyle(h, {\n withRemoveButton: true,\n removeButtonOnClickCallback:\n idToRemove => {\n setHave(old => {\n let temp = [...old]\n let i =\n temp.findIndex(\n i =>\n i._id ===\n idToRemove\n )\n temp.splice(i, 1)\n return temp\n })\n },\n })}\n
\n ))\n ) : (\n \n No entrypoints added yet! Drag the\n search results here!\n \n )}\n
\n \n {/* Dump for want parameter */}\n {\n setWant(item)\n }}\n className=\"flex-1 p-4 m-2 border-2 rounded-lg border-transparent\"\n canDropClassName=\"border-paqteal-500\"\n >\n

Target

\n
\n {want ? (\n cardStyle(want, {\n withRemoveButton: true,\n removeButtonOnClickCallback: () => {\n setWant() // sets want to undefined (default state)\n },\n })\n ) : (\n \n No target parameter defined yet! Drag a\n search result here!\n \n )}\n
\n \n
\n
\n
\n
\n )\n}\n","export default __webpack_public_path__ + \"static/media/werkschau_leonschmidt.01578068.png\";","export default __webpack_public_path__ + \"static/media/werkschau_nicolajaeger.49606700.png\";","export default __webpack_public_path__ + \"static/media/werkschau_nadineweber.6f858837.png\";","import React from \"react\"\nimport Button from \"../../components/Button\"\nimport Card from \"../../components/Card\"\nimport logoFull from \"../../img/logo_full.svg\"\nimport imgLeon from \"../../img/werkschau_leonschmidt.png\"\nimport imgNicola from \"../../img/werkschau_nicolajaeger.png\"\nimport imgNadine from \"../../img/werkschau_nadineweber.png\"\n\nexport const version = \"v0.2.1\"\n\nexport default function AboutView() {\n return (\n
\n {/* Logo */}\n
\n \"PAQMAN\n
\n\n {/* Cards with information */}\n
\n
\n \n
\n

\n PAQMAN is a command line companion tool to\n improve your pentesting experience. It provides\n you with copy-pastable commands depending on the\n information you collect or already have to\n transform them into a successful attack.\n

\n

\n PAQMAN is kept as simple as possible to allow\n you to fully focus on your work.\n

\n
\n
\n \n
\n

\n If you want to search for predefined Attacks,\n use the{\" \"}\n Attack List.\n To list all Commands, use the{\" \"}\n Command List.\n You can search for both name and description in\n every view of PAQMAN.\n

\n

\n For already gathered or targeted parameters, use{\" \"}\n \n Attack by Parameter\n {\" \"}\n and{\" \"}\n \n Command by Parameter\n {\" \"}\n to search for actions matching your current\n situation.\n

\n

\n If you want to add a new Attack or Command, use\n the Add{\" \"}\n button, respectively.\n

\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n Command{\" \"}\n \n Well, just a command. This can be a\n binary, shell script or any other\n executable with flags, values, etc.\n
\n Attack{\" \"}\n \n An Attack bundles Commands statically to\n form a predefined sequence of actions.\n The Commands are preconfigured and ready\n to be executed.\n
\n Parameter{\" \"}\n \n This is PAQMANs centerpiece. Parameters\n define abstract subgoals while executing\n a chain of Commands (e.g. an Attack).\n They provide context to usually\n stateless Commands.\n
\n
\n \n
\n

\n PAQMAN was developed as a project work by Nadine\n Weber, Nicola Jäger and Leon Schmidt as part of\n a project work at the University of Applied\n Sciences Offenburg.\n

\n

\n \"Nicola\n \"Leon\n \"Nadine\n

\n

\n Images created by Ines Martinez Bischoff\n

\n
\n
\n
\n
\n\n
\n\n {/* Important infos (subtitle) */}\n
\n

Version {version}

\n
\n \n
\n
\n\n
\n
\n )\n}\n","import React, { useState } from \"react\"\nimport NotImplemented from \"../../components/NotImplemented\"\nimport ViewHeading from \"../../components/ViewHeading\"\n\n/**\n * This view is used to create new commands by template.\n * WORK IN PROGRESS!\n */\nexport default function CommandNewView() {\n const [formValues, setFormValues] = useState({\n name: \"\",\n description: \"\",\n template: \"\",\n template_values: \"{}\",\n })\n\n const [response, setResponse] = useState(null)\n\n const handleSubmit = async event => {\n event.preventDefault()\n\n let v = { ...formValues }\n v[\"template_values\"] = JSON.parse(v.template_values) // transform json string to JS object\n\n alert(`Commiting command:\\n${JSON.stringify(v, null, 4)}`)\n let r = await fetch(\"/api/command\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(v),\n }).catch(e => console.log(e))\n\n setResponse(await r.text())\n }\n\n const handleChange = event => {\n let v = { ...formValues } // shallow copy formValues\n v[event.target.name] = event.target.value // change the field\n setFormValues(v) // set it to state\n }\n\n return (\n
\n \n \n \n \n\n \n \n\n \n \n\n \n \n\n \n\n {response && (\n
\n

{response}

\n
\n )}\n \n

or

\n
\n

Add a command by importing a manpage

\n \n
\n
\n )\n}\n","import React from \"react\"\nimport { useRouteMatch, Switch, Route, Redirect } from \"react-router-dom\"\nimport AttackListView from \"../views/preparation/AttackListView\"\nimport AttackByParameterView from \"../views/preparation/AttackByParameterView\"\nimport AttackNewView from \"../views/preparation/AttackNewView\"\nimport CommandListView from \"../views/preparation/CommandListView\"\nimport CommandByParameterView from \"../views/preparation/CommandByParameterView\"\nimport AboutView from \"../views/preparation/AboutView\"\nimport CommandNewView from \"../views/preparation/CommandNewView\"\n\n/**\n * This page is used to prepare for an attack. Here you choose\n * which attack you want to perform before beeing redirected to\n * the \"perform attack\" page.\n * Also, things like the about page and the views for adding commands,\n * attacks and parameters reside here.\n */\nexport default function PreperationPage() {\n const { path } = useRouteMatch()\n\n return (\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n )\n}\n","export default class Template {\n constructor(template) {\n this.raw = template\n }\n\n /**\n * @returns Plaintext parts of the template as Array\n * @deprecated\n */\n get plaintexts() {\n let regex = /%\\{.*?\\}/g // pattern to find template values ( %{ } )\n let templateCopy = this.raw\n // split the template copy at the patters to retreive everything\n // that is not template value\n return templateCopy.split(regex)\n }\n\n /**\n * @returns Template value names found in the template as Array\n * @deprecated\n */\n get templateValueNames() {\n let regex = /%\\{.*?\\}/g // pattern to find template values ( %{ } )\n let templateCopy = this.raw\n // search for all templates with regex pattern and replace brackets\n return [...templateCopy.matchAll(regex)].map(e =>\n e[0].replace(\"%{\", \"\").replace(\"}\", \"\")\n )\n }\n\n /**\n * This returns an array which contains tupels of this form:\n *\n * `[ (\"plain\" || \"template_value\") , content ]`\n *\n * The first value describes, if the element is pure plaintext\n * or if it is a template value. The second element contains the\n * actual string (plaintext or template value name, respectively)\n *\n * This can be used to render out React components to display commands.\n *\n * @returns String\n */\n markedArray() {\n let regex = /(%\\{.*?\\})/g // pattern to find template values ( %{ } )\n let templateCopy = this.raw\n\n // the following regex pattern does not replace the matches\n return templateCopy.split(regex).map(e => {\n // check if e is a template value\n if (regex.test(e)) {\n return [\"template_value\", e.replace(\"%{\", \"\").replace(\"}\", \"\")]\n } else {\n return [\"plain\", e]\n }\n })\n }\n}\n","export const commandTemplateValueTypes = {\n nonvalueFlag: \"nonvalue-flag\",\n valueFlag: \"value-flag\",\n value: \"value\",\n selection: \"selection\",\n}\n","import React from \"react\"\n\n/**\n * Wraps the children into a auto-scaling lightgray box with proper code fonts\n * @param props\n * @param props.children The child components inside the Code Wrapper (does not need to be set explicitly)\n */\nexport default function CodeWrapper({ children }) {\n return (\n
\n {children}\n
\n )\n}\n","import React, { useState } from \"react\"\n\n/**\n * This provides an area to display a div on hover. The content text of this div is\n * specified by the \"tip\" prop\n * @param props\n * @param props.tip The hint message to show in the div on hover (it null or undefined, the tooltip will be disabled)\n * @param props.children DO NOT SPECIFY EXPLICITLY! The nested children elements inside the component tags\n */\nexport default function Tooltip({ tip, children }) {\n const [hovering, setHovering] = useState(false)\n\n return (\n
\n setHovering(true)}\n onMouseOut={() => setHovering(false)}\n className=\"relative\"\n >\n {children}\n \n

{tip}

\n
\n \n \n )\n}\n","import React from \"react\"\nimport { commandTemplateValueTypes as valTypes } from \"../utils/enums\"\nimport Tooltip from \"./Tooltip\"\n\n/**\n * This displays a box containing either plaintext (if plaintext prop is provided) or a fillable\n * template value (if templateName and templateValue props are provided) used in the CommandTemplateForm component\n * @param {Object} props\n * @param {string} props.plaintext The hardcoded parts of the commands\n * @param {string} props.templateName The name of the template value\n * @param {Object} props.templateValue The value of the template\n * @param {*} props.formData The state for the form data in CommandTemplateForm\n * @param {Function} props.setFormData The state setter function for the form data in CommandTemplateForm\n */\nexport default function CommandTemplateValueBox({\n plaintext,\n templateName,\n templateValue,\n formData,\n setFormData,\n}) {\n /**\n * Used to compute the HTML input types by template value\n * @param v Object containing the template value definition\n * @returns Array that can be mapped to create the input elements\n */\n const inputTypesOf = v => {\n switch (v.type) {\n case valTypes.nonvalueFlag:\n return [\"checkbox\"]\n case valTypes.valueFlag:\n // \"checkbox\" for \"activating\" the flag\n // and \"text\" to define the content\n return [\"checkbox\", \"text\"]\n case valTypes.value:\n return [\"text\"]\n default:\n console.error(\n `ERROR: found unsupported type ${v.type} in command template value`\n )\n }\n }\n\n const handleChange = event => {\n const { name, type, checked, value } = event.target\n const d = { ...formData } // shallow copy formData\n\n // different command template value types have different\n // formats on how they are stored in formData\n switch (templateValue.type) {\n case valTypes.nonvalueFlag:\n d[name].triggered = checked\n break\n case valTypes.valueFlag:\n type === \"checkbox\"\n ? (d[name].triggered = checked)\n : (d[name].value = value)\n break\n case valTypes.value:\n d[name].value = value\n break\n default:\n console.error(\n `ERROR: found unsupported type ${templateValue.type} in command template value`\n )\n }\n\n setFormData(d)\n }\n\n if (plaintext) {\n return (\n
\n
 
\n
{plaintext}
\n
\n )\n }\n\n if (templateName && templateValue) {\n return (\n
\n \n
\n \n
\n
\n
\n {inputTypesOf(templateValue).map((inputType, index) => (\n 15\n ? formData[templateName].value.length\n : 15\n }\n />\n ))}\n
\n
\n )\n }\n\n // occurs, when there is no plaintext between two template values\n return

\n}\n","import React, { useEffect, useState } from \"react\"\nimport { CopyToClipboard } from \"react-copy-to-clipboard\"\n// utils\nimport Template from \"../utils/Template\"\nimport { commandTemplateValueTypes as valTypes } from \"../utils/enums\"\n// JSX components\nimport Button from \"./Button\"\nimport CodeWrapper from \"./CodeWrapper\"\nimport CommandTemplateValueBox from \"./CommandTemplateValueBox\"\nimport Loading from \"./Loading\"\n\n/**\n * Displays the gray box containing the fillable template values of a command\n * @param {Object} props\n * @param {string} props.template The template string\n * @param {Object} props.templateValues The object from the command document containing the template value definitions\n * @param {boolean} props.withPreview Whether the full plaintext command should be displayed\n */\nexport default function CommandTemplateForm({\n template,\n templateValues,\n withPreview,\n}) {\n const [formData, setFormData] = useState()\n\n /* \n populate formData with defaults, if any in this format:\n {\n triggered: \"for checkboxes,\n value: \"for text inputs\"\n }\n */\n useEffect(() => {\n let fd = {}\n Object.entries(templateValues).forEach(([n, v]) => {\n switch (v.type) {\n case valTypes.nonvalueFlag:\n fd[n] = {\n triggered: v.default_state || false,\n }\n break\n case valTypes.valueFlag:\n fd[n] = {\n triggered: v.default_state || false,\n value: v.default || \"\",\n }\n break\n case valTypes.value:\n fd[n] = {\n value: v.default || \"\",\n }\n break\n default:\n console.log(\n `ERROR: found unsupported type ${v.type} in command template value`\n )\n }\n })\n setFormData(fd)\n }, [templateValues])\n\n const t = new Template(template)\n const marked = t.markedArray() // see javadoc for details on what this does\n\n const templateArray = () => {\n // reassamble the template to contain both plaintext and template values\n return marked.map(([type, e], index) =>\n type === \"template_value\" ? (\n \n ) : (\n \n )\n )\n }\n\n /**\n * This function computes a full command string to be pasted to the clipboard.\n * @returns {string} Full command ready to be pasted to the command line\n */\n const fullCommandString = () => {\n let fcs = \"\"\n marked.forEach(([type, e]) => {\n if (type === \"template_value\") {\n switch (templateValues[e].type) {\n case valTypes.nonvalueFlag:\n if (formData[e].triggered) {\n fcs += templateValues[e].value // TODO, check if existent?\n }\n break\n case valTypes.valueFlag:\n if (formData[e].triggered) {\n fcs += templateValues[e].usage.replace(\n \"%\",\n formData[e].value\n )\n }\n break\n case valTypes.value:\n fcs += formData[e].value\n break\n default:\n console.log(\n `ERROR: found unsupported type ${templateValues[e].type} in command template value`\n )\n }\n } else {\n fcs += e\n }\n })\n fcs = fcs.replace(/\\s+/g, \" \") // remove duplicate whitespaces\n return fcs\n }\n\n const [copied, setCopied] = useState(false)\n\n // wait for everything to populate before rendering the form\n // (formData is populated via useEffect(..., []). This means\n // that setFormData() will be called asynchronously and this\n // component will render without waiting for the effect to\n // finish.)\n if (!formData) {\n return \n }\n\n return (\n

\n {/* render out the reassambled template */}\n
\n \n
\n {templateArray()}\n
\n
\n
\n {/* things below the template (preview, copy button) */}\n
\n {withPreview && (\n <>\n
\n \n

> {fullCommandString()}

\n
\n
\n
\n {\n setCopied(true)\n setTimeout(() => setCopied(false), 3000)\n }}\n >\n
\n {/* Don't delete this div! It is required, as CopyToClipboard only accepts one child */}\n \n {copied && (\n

\n Copied 👍\n

\n )}\n
\n \n
\n \n )}\n
\n
\n )\n}\n","import React, { useEffect, useState } from \"react\"\nimport CommandTemplateForm from \"../components/CommandTemplateForm\"\nimport ViewHeading from \"../components/ViewHeading\"\nimport Loading from \"../components/Loading\"\nimport Card from \"../components/Card\"\nimport Button from \"../components/Button\"\n\n/**\n * This page is used to display more information about a\n * command. It shows it's paramters and how they are retreived.\n */\nexport default function CommandViewerPage({ match }) {\n // get the commandID from route URL\n const {\n params: { commandID },\n } = match\n\n const [data, setData] = useState()\n\n useEffect(() => {\n fetch(`/api/command/${commandID}`)\n .then(r => r.json())\n .then(r => setData(r))\n .catch(e => console.error(e))\n }, [commandID])\n\n if (!data) return \n if (data.error) return

{data.error}

\n\n return (\n
\n \n
\n
\n
\n \n

\n {data.instructions ||\n \"No instructions available\"}\n

\n {data.online_manpage && (\n
\n \n
\n )}\n
\n
\n
\n \n
\n

\n Requires root? \n {data.requires_root ? (\n \n {/* paqgreen color needs adjustment */}\n ✓\n \n ) : (\n \n ✕\n \n )}\n

\n
\n
\n
\n
\n \n
\n
\n )\n}\n","import React from \"react\"\nimport NotImplemented from \"../components/NotImplemented\"\n\n/**\n * This page is used to inspect an attack. The commands to perform\n * this attack are displayed and the \"perform atttack\" page can be\n * accessed from here. Also, clicking on commands opens the command\n * viewer to inspect them further.\n */\nexport default function AttackViewerPage({ match }) {\n return \n}\n","import React from \"react\"\nimport NotImplemented from \"../components/NotImplemented\"\n\n/**\n * The \"perform attack\" page is shown after an attack was choosen\n * from the \"preperation\" page. It accompanies the user with\n * all the command necessairy to perform the attack successfully.\n *\n * This page cannot be accessed without choosing an attack as it\n * requires its ID in the URL like \"/perform/1337\".\n */\nexport default function PerformAttackPage({ match }) {\n return \n}\n","import React from \"react\"\n\n/**\n * This component is used mostly on the default paths on\n * the browser routers to signal, that a page or view\n * does not exist.\n */\nexport default function NotFound() {\n return (\n
\n

Page not found

\n

:(

\n
\n )\n}\n","import React from \"react\"\nimport { Link, useLocation } from \"react-router-dom\"\n\n/**\n * A LinkButton uses the react-router Link component to redirect a user to a\n * ressource, routed via browser router.\n *\n * IMPORTANT: Always append a trailing slash at the end of the path in the \"to\"\n * prop, as the backend served the static frontend files in strict slash mode.\n *\n * @param props\n * @param props.title The text displayed in the button\n * @param props.to The internal URL to redirect to, when the button is clicked\n */\nexport default function LinkButton({ title, to }) {\n const selectedStyle = \" border-yellow-400\"\n const { pathname } = useLocation() // gets the current path\n\n let selected\n if (pathname === to) selected = true\n\n return (\n \n \n {title}\n \n \n )\n}\n","import React from \"react\"\n\n/**\n * This component is used to group LinkButton components together.\n * The LinkButtons must be supplied as children of LinkButtonGroup\n * but can be left empty.\n * @param props\n * @param props.title Name of the group (displayed visually)\n */\nexport default function LinkButtonGroup({ title, children }) {\n return (\n
\n

{title}

\n {children}\n
\n )\n}\n","import React from \"react\"\nimport LinkButton from \"../components/LinkButton\"\nimport LinkButtonGroup from \"../components/LinkButtonGroup\"\n\n/**\n * This is the sidebar displayed on the preperation page\n * @param props\n * @param props.collapsed If the sidebar is collapsed (not visible)\n */\nexport default function Sidebar({ collapsed }) {\n return (\n \n
\n {/* upper buttons */}\n
\n
\n \n \n \n \n \n
\n \n \n \n \n \n
\n {/* lower buttons */}\n
\n \n
\n
\n
\n )\n}\n","import React from \"react\"\n\n/**\n * This component is used to wrap the views and pages to fit the\n * header and sidebar.\n * @param props\n * @param props.sidebarCollapsed If PAQMANs sidebar is collapsed or not\n */\nexport default function ViewContainer({ sidebarCollapsed, children }) {\n return (\n \n {children}\n \n )\n}\n","import React, { useState } from \"react\"\nimport {\n BrowserRouter as Router,\n Switch,\n Route,\n Redirect,\n} from \"react-router-dom\"\nimport Header from \"./container/Header\"\nimport PreperationPage from \"./pages/PreperationPage\"\nimport CommandViewerPage from \"./pages/CommandViewerPage\"\nimport AttackViewerPage from \"./pages/AttackViewerPage\"\nimport PerformAttackPage from \"./pages/PerformAttackPage\"\nimport NotFound from \"./components/NotFound\"\nimport Sidebar from \"./container/Sidebar\"\nimport ViewContainer from \"./container/ViewContainer\"\nimport { HTML5Backend } from \"react-dnd-html5-backend\"\nimport { DndProvider } from \"react-dnd\"\n\nexport default function App() {\n const [sidebarCollapsed, setSidebarCollapsed] = useState(false)\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* Fallback (404 page) */}\n \n \n \n \n \n )\n}\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(\n ({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n }\n )\n }\n}\n\nexport default reportWebVitals\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport \"./index.css\" // this is, where our tailwind classes will be generated to\nimport App from \"./App\"\nimport reportWebVitals from \"./reportWebVitals\"\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}