-
- Actions
-
-
+ : null}
+ {selectedAction.description !== undefined && selectedAction.description.length > 0 && hideExtraTypes !== true ?
{selectedAction.description}
: null}
-
diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx
index ed8e2295..5c76fd77 100644
--- a/frontend/src/views/AngularWorkflow.jsx
+++ b/frontend/src/views/AngularWorkflow.jsx
@@ -5,8 +5,8 @@ import { useTheme } from '@material-ui/core/styles';
import uuid from "uuid";
import {Link} from 'react-router-dom';
import { Prompt } from 'react-router'
-import ReactJson from 'react-json-view'
import { useBeforeunload } from 'react-beforeunload';
+import ReactJson from 'react-json-view'
import NestedMenuItem from "material-ui-nested-menu-item";
import {TextField, Drawer, Button, Paper, Grid, Tabs, InputAdornment, Tab, ButtonBase, Tooltip, Select, MenuItem, Divider, Dialog, Modal, DialogActions, DialogTitle, InputLabel, DialogContent, FormControl, IconButton, Menu, Input, FormGroup, FormControlLabel, Typography, Checkbox, Breadcrumbs, CircularProgress, Switch, Fade} from '@material-ui/core';
@@ -52,6 +52,25 @@ function useWindowSize() {
return size;
}
+export function sortByKey(array, key) {
+ if (array === undefined) {
+ return []
+ }
+
+ if (key.startsWith("-") && key.length > 2) {
+ key = key.slice(1, key.length)
+ return array.sort(function(a, b) {
+ var x = a[key]; var y = b[key]
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0))
+ }).reverse()
+ }
+
+ return array.sort(function(a, b) {
+ var x = a[key]; var y = b[key]
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0))
+ })
+}
+
function removeParam(key, sourceURL) {
if (sourceURL === undefined) {
return
@@ -2678,13 +2697,14 @@ const AngularWorkflow = (props) => {
*/
console.log("ENVS: ", environments)
+ const parsedEnvironments = environments === null || environments === [] ? "cloud" : environments[defaultEnvironmentIndex] === undefined ? "cloud" : environments[defaultEnvironmentIndex].Name
const newAppData = {
app_name: app.name,
app_version: app.app_version,
app_id: app.id,
sharing: app.sharing,
private_id: app.private_id,
- environment: environments === null || environments === [] ? "cloud" : environments[defaultEnvironmentIndex].Name,
+ environment: parsedEnvironments,
errors: [],
id_: newNodeId,
_id_: newNodeId,
@@ -3126,24 +3146,7 @@ const AngularWorkflow = (props) => {
- function sortByKey(array, key) {
- if (array === undefined) {
- return []
- }
-
- if (key.startsWith("-") && key.length > 2) {
- key = key.slice(1, key.length)
- return array.sort(function(a, b) {
- var x = a[key]; var y = b[key]
- return ((x < y) ? -1 : ((x > y) ? 1 : 0))
- }).reverse()
- }
-
- return array.sort(function(a, b) {
- var x = a[key]; var y = b[key]
- return ((x < y) ? -1 : ((x > y) ? 1 : 0))
- })
- }
+
const rightsidebarStyle = {
position: "fixed",
@@ -3170,7 +3173,6 @@ const AngularWorkflow = (props) => {
selectedApp={selectedApp}
workflowExecutions={workflowExecutions}
setSelectedResult={setSelectedResult}
- getParents={getParents}
setSelectedApp={setSelectedApp}
setSelectedTrigger={setSelectedTrigger}
setSelectedEdge={setSelectedEdge}
diff --git a/frontend/src/views/AppCreator.jsx b/frontend/src/views/AppCreator.jsx
index d3c2be72..34149bd0 100644
--- a/frontend/src/views/AppCreator.jsx
+++ b/frontend/src/views/AppCreator.jsx
@@ -301,12 +301,12 @@ const AppCreator = (props) => {
return response.json()
})
.then((responseJson) => {
- if (!responseJson.success) {
+ if (responseJson.success === false) {
alert.error("Failed to get the app")
setIsAppLoaded(true)
+ window.location.pathname = "/search"
} else {
- const data = JSON.parse(responseJson.body)
- parseIncomingOpenapiData(data)
+ parseIncomingOpenapiData(responseJson)
}
})
.catch(error => {
@@ -346,27 +346,8 @@ const AppCreator = (props) => {
if (!responseJson.success) {
alert.error("Failed to verify")
} else{
- var jsonvalid = false
- var tmpvalue = ""
- try {
- tmpvalue = JSON.parse(responseJson.body)
- jsonvalid = true
- } catch (e) {
- console.log("Error JSON: ", e)
- }
-
- if (!jsonvalid) {
- try {
- tmpvalue = YAML.parse(responseJson.body, )
- jsonvalid = true
- } catch(e) {
- console.log("Error YAML: ", e)
- }
- }
-
- if (jsonvalid) {
- parseIncomingOpenapiData(tmpvalue)
- }
+ parseIncomingOpenapiData(responseJson)
+
}
})
.catch(error => {
@@ -427,9 +408,33 @@ const AppCreator = (props) => {
// Sets the data up as it should be at later points
// This is the data FROM the database, not what's being saved
const parseIncomingOpenapiData = (data) => {
- //console.log("DATA: ", data.info)
- setBasedata(data)
+ const parsedapp = data.openapi === undefined ? data : JSON.parse(atob(data.openapi))
+ data = parsedapp.body === undefined ? parsedapp : parsedapp.body
+ var jsonvalid = false
+ var tmpvalue = ""
+ try {
+ data = JSON.parse(data)
+ jsonvalid = true
+ } catch (e) {
+ console.log("Error JSON: ", e)
+ }
+
+ if (!jsonvalid) {
+ try {
+ data = YAML.parse(data)
+ jsonvalid = true
+ } catch(e) {
+ console.log("Error YAML: ", e)
+ }
+ }
+
+ if (!jsonvalid) {
+ alert.info("OpenAPI data is invalid.")
+ return
+ }
+
+ setBasedata(data)
if (data.info !== null && data.info !== undefined) {
setName(data.info.title)
setDescription(data.info.description)
@@ -490,210 +495,211 @@ const AppCreator = (props) => {
"PUT",
]
- // FIXME - headers?
var newActions = []
var wordlist = {}
- for (let [path, pathvalue] of Object.entries(data.paths)) {
- for (let [method, methodvalue] of Object.entries(pathvalue)) {
- if (methodvalue === null) {
- alert.info("Skipped method (null)"+method)
- continue
- }
+ if (data.paths !== null && data.paths !== undefined) {
+ for (let [path, pathvalue] of Object.entries(data.paths)) {
+ for (let [method, methodvalue] of Object.entries(pathvalue)) {
+ if (methodvalue === null) {
+ alert.info("Skipped method (null)"+method)
+ continue
+ }
- if (!allowedfunctions.includes(method.toUpperCase())) {
- console.log("Invalid method: ", method, "data: ", methodvalue)
- alert.info("Skipped method (not allowed): "+method)
- continue
- }
+ if (!allowedfunctions.includes(method.toUpperCase())) {
+ console.log("Invalid method: ", method, "data: ", methodvalue)
+ alert.info("Skipped method (not allowed): "+method)
+ continue
+ }
- var tmpname = methodvalue.summary
- if (methodvalue.operationId !== undefined && methodvalue.operationId !== null && methodvalue.operationId.length > 0 && (tmpname === undefined || tmpname.length === 0)) {
- tmpname = methodvalue.operationId
- }
+ var tmpname = methodvalue.summary
+ if (methodvalue.operationId !== undefined && methodvalue.operationId !== null && methodvalue.operationId.length > 0 && (tmpname === undefined || tmpname.length === 0)) {
+ tmpname = methodvalue.operationId
+ }
- var newaction = {
- "name": tmpname,
- "description": methodvalue.description,
- "url": path,
- "file_field": "",
- "method": method.toUpperCase(),
- "headers": "",
- "queries": [],
- "paths": [],
- "body": "",
- "errors": [],
- "example_response": "",
- }
+ var newaction = {
+ "name": tmpname,
+ "description": methodvalue.description,
+ "url": path,
+ "file_field": "",
+ "method": method.toUpperCase(),
+ "headers": "",
+ "queries": [],
+ "paths": [],
+ "body": "",
+ "errors": [],
+ "example_response": "",
+ }
- if (methodvalue["requestBody"] !== undefined) {
- //console.log("Handle requestbody: ", methodvalue["requestBody"])
- if (methodvalue["requestBody"]["content"] !== undefined) {
- if (methodvalue["requestBody"]["content"]["application/json"] !== undefined) {
- if (methodvalue["requestBody"]["content"]["application/json"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["application/json"]["schema"] !== null) {
- if (methodvalue["requestBody"]["content"]["application/json"]["schema"]["properties"] !== undefined) {
- var tmpobject = {}
- for (let [prop, propvalue] of Object.entries(methodvalue["requestBody"]["content"]["application/json"]["schema"]["properties"])) {
- tmpobject[prop] = `\$\{${prop}\}`
+ if (methodvalue["requestBody"] !== undefined) {
+ //console.log("Handle requestbody: ", methodvalue["requestBody"])
+ if (methodvalue["requestBody"]["content"] !== undefined) {
+ if (methodvalue["requestBody"]["content"]["application/json"] !== undefined) {
+ if (methodvalue["requestBody"]["content"]["application/json"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["application/json"]["schema"] !== null) {
+ if (methodvalue["requestBody"]["content"]["application/json"]["schema"]["properties"] !== undefined) {
+ var tmpobject = {}
+ for (let [prop, propvalue] of Object.entries(methodvalue["requestBody"]["content"]["application/json"]["schema"]["properties"])) {
+ tmpobject[prop] = `\$\{${prop}\}`
+ }
+
+ for (var subkey in methodvalue["requestBody"]["content"]["application/json"]["schema"]["required"]) {
+ const tmpitem = methodvalue["requestBody"]["content"]["application/json"]["schema"]["required"][subkey]
+ tmpobject[tmpitem] = `\$\{${tmpitem}\}`
+ }
+
+ newaction["body"] = JSON.stringify(tmpobject, null, 2)
}
-
- for (var subkey in methodvalue["requestBody"]["content"]["application/json"]["schema"]["required"]) {
- const tmpitem = methodvalue["requestBody"]["content"]["application/json"]["schema"]["required"][subkey]
- tmpobject[tmpitem] = `\$\{${tmpitem}\}`
- }
-
- newaction["body"] = JSON.stringify(tmpobject, null, 2)
}
- }
- } else if (methodvalue["requestBody"]["content"]["application/xml"] !== undefined) {
- console.log("METHOD XML: ", methodvalue)
- if (methodvalue["requestBody"]["content"]["application/xml"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["application/xml"]["schema"] !== null) {
- if (methodvalue["requestBody"]["content"]["application/xml"]["schema"]["properties"] !== undefined) {
- var tmpobject = {}
- for (let [prop, propvalue] of Object.entries(methodvalue["requestBody"]["content"]["application/xml"]["schema"]["properties"])) {
- tmpobject[prop] = `\$\{${prop}\}`
+ } else if (methodvalue["requestBody"]["content"]["application/xml"] !== undefined) {
+ console.log("METHOD XML: ", methodvalue)
+ if (methodvalue["requestBody"]["content"]["application/xml"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["application/xml"]["schema"] !== null) {
+ if (methodvalue["requestBody"]["content"]["application/xml"]["schema"]["properties"] !== undefined) {
+ var tmpobject = {}
+ for (let [prop, propvalue] of Object.entries(methodvalue["requestBody"]["content"]["application/xml"]["schema"]["properties"])) {
+ tmpobject[prop] = `\$\{${prop}\}`
+ }
+
+ for (var subkey in methodvalue["requestBody"]["content"]["application/xml"]["schema"]["required"]) {
+ const tmpitem = methodvalue["requestBody"]["content"]["application/xml"]["schema"]["required"][subkey]
+ tmpobject[tmpitem] = `\$\{${tmpitem}\}`
+ }
+
+ //console.log("OBJ XML: ", tmpobject)
+ //newaction["body"] = XML.stringify(tmpobject, null, 2)
}
-
- for (var subkey in methodvalue["requestBody"]["content"]["application/xml"]["schema"]["required"]) {
- const tmpitem = methodvalue["requestBody"]["content"]["application/xml"]["schema"]["required"][subkey]
- tmpobject[tmpitem] = `\$\{${tmpitem}\}`
+ }
+ } else {
+ if (methodvalue["requestBody"]["content"]["example"] !== undefined) {
+ if (methodvalue["requestBody"]["content"]["example"]["example"] !== undefined) {
+ newaction["body"] = methodvalue["requestBody"]["content"]["example"]["example"]
+ //JSON.stringify(tmpobject, null, 2)
}
-
- //console.log("OBJ XML: ", tmpobject)
- //newaction["body"] = XML.stringify(tmpobject, null, 2)
}
- }
- } else {
- if (methodvalue["requestBody"]["content"]["example"] !== undefined) {
- if (methodvalue["requestBody"]["content"]["example"]["example"] !== undefined) {
- newaction["body"] = methodvalue["requestBody"]["content"]["example"]["example"]
- //JSON.stringify(tmpobject, null, 2)
- }
- }
- //console.log(methodvalue["requestBody"]["content"])
- if (methodvalue["requestBody"]["content"]["multipart/form-data"] !== undefined) {
- if (methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"] !== null) {
- if (methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"]["type"] === "object") {
- const fieldname = methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"]["properties"]["fieldname"]
- if (fieldname !== undefined) {
- console.log("FIELDNAME: ", fieldname)
- newaction.file_field = fieldname["value"]
+ //console.log(methodvalue["requestBody"]["content"])
+ if (methodvalue["requestBody"]["content"]["multipart/form-data"] !== undefined) {
+ if (methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"] !== undefined && methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"] !== null) {
+ if (methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"]["type"] === "object") {
+ const fieldname = methodvalue["requestBody"]["content"]["multipart/form-data"]["schema"]["properties"]["fieldname"]
+ if (fieldname !== undefined) {
+ console.log("FIELDNAME: ", fieldname)
+ newaction.file_field = fieldname["value"]
+ }
}
}
}
}
}
}
- }
- // HAHAHA wtf is this.
- if (methodvalue.responses !== undefined && methodvalue.responses !== null) {
- if (methodvalue.responses.default !== undefined) {
- if (methodvalue.responses.default.content !== undefined) {
- if (methodvalue.responses.default.content["text/plain"] !== undefined) {
- if (methodvalue.responses.default.content["text/plain"]["schema"] !== undefined) {
- if (methodvalue.responses.default.content["text/plain"]["schema"]["example"] !== undefined) {
- newaction.example_response = methodvalue.responses.default.content["text/plain"]["schema"]["example"]
+ // HAHAHA wtf is this.
+ if (methodvalue.responses !== undefined && methodvalue.responses !== null) {
+ if (methodvalue.responses.default !== undefined) {
+ if (methodvalue.responses.default.content !== undefined) {
+ if (methodvalue.responses.default.content["text/plain"] !== undefined) {
+ if (methodvalue.responses.default.content["text/plain"]["schema"] !== undefined) {
+ if (methodvalue.responses.default.content["text/plain"]["schema"]["example"] !== undefined) {
+ newaction.example_response = methodvalue.responses.default.content["text/plain"]["schema"]["example"]
+ }
}
}
}
}
}
- }
- for (var key in methodvalue.parameters) {
- const parameter = handleGetRef(methodvalue.parameters[key], data)
- if (parameter.in === "query") {
- var tmpaction = {
- "description": parameter.description,
- "name": parameter.name,
- "required": parameter.required,
- "in": "query",
+ for (var key in methodvalue.parameters) {
+ const parameter = handleGetRef(methodvalue.parameters[key], data)
+ if (parameter.in === "query") {
+ var tmpaction = {
+ "description": parameter.description,
+ "name": parameter.name,
+ "required": parameter.required,
+ "in": "query",
+ }
+
+ if (parameter.required === undefined) {
+ tmpaction.required = false
+ }
+
+ newaction.queries.push(tmpaction)
+ } else if (parameter.in === "path") {
+ // FIXME - parse this to the URL too
+ newaction.paths.push(parameter.name)
+
+ // FIXME: This doesn't follow OpenAPI3 exactly.
+ // https://swagger.io/docs/specification/describing-request-body/
+ // https://swagger.io/docs/specification/describing-parameters/
+ // Need to split the data.
+ } else if (parameter.in === "body") {
+ // FIXME: Add tracking for components
+ // E.G: https://raw.githubusercontent.com/owentl/Shuffle/master/gosecure.yaml
+ if (parameter.example !== undefined) {
+ newaction.body = parameter.example
+ }
+ } else if (parameter.in === "header") {
+ newaction.headers += `${parameter.name}=${parameter.example}\n`
+ } else {
+ console.log("WARNING: don't know how to handle this param: ", parameter)
}
-
- if (parameter.required === undefined) {
- tmpaction.required = false
- }
-
- newaction.queries.push(tmpaction)
- } else if (parameter.in === "path") {
- // FIXME - parse this to the URL too
- newaction.paths.push(parameter.name)
-
- // FIXME: This doesn't follow OpenAPI3 exactly.
- // https://swagger.io/docs/specification/describing-request-body/
- // https://swagger.io/docs/specification/describing-parameters/
- // Need to split the data.
- } else if (parameter.in === "body") {
- // FIXME: Add tracking for components
- // E.G: https://raw.githubusercontent.com/owentl/Shuffle/master/gosecure.yaml
- if (parameter.example !== undefined) {
- newaction.body = parameter.example
- }
- } else if (parameter.in === "header") {
- newaction.headers += `${parameter.name}=${parameter.example}\n`
- } else {
- console.log("WARNING: don't know how to handle this param: ", parameter)
}
- }
- if (newaction.name === "" || newaction.name === undefined) {
- // Find a unique part of the string
- // FIXME: Looks for length between /, find the one where they differ
- // Should find others with the same START to their path
- // Make a list of reserved names? Aka things that show up only once
- if (Object.getOwnPropertyNames(wordlist).length === 0) {
- for (let [newpath, pathvalue] of Object.entries(data.paths)) {
- const newpathsplit = newpath.split("/")
- for(var key in newpathsplit) {
- const pathitem = newpathsplit[key].toLowerCase()
- if (wordlist[pathitem] === undefined) {
- wordlist[pathitem] = 1
- } else {
- wordlist[pathitem] += 1
+ if (newaction.name === "" || newaction.name === undefined) {
+ // Find a unique part of the string
+ // FIXME: Looks for length between /, find the one where they differ
+ // Should find others with the same START to their path
+ // Make a list of reserved names? Aka things that show up only once
+ if (Object.getOwnPropertyNames(wordlist).length === 0) {
+ for (let [newpath, pathvalue] of Object.entries(data.paths)) {
+ const newpathsplit = newpath.split("/")
+ for(var key in newpathsplit) {
+ const pathitem = newpathsplit[key].toLowerCase()
+ if (wordlist[pathitem] === undefined) {
+ wordlist[pathitem] = 1
+ } else {
+ wordlist[pathitem] += 1
+ }
}
}
- }
- }
+ }
- //console.log("WORDLIST: ", wordlist)
+ //console.log("WORDLIST: ", wordlist)
- // Remove underscores and make it normal with upper case etc
- const urlsplit = path.split("/")
- if (urlsplit.length > 0) {
- var curname = ""
- for(var key in urlsplit) {
- var subpath = urlsplit[key]
- if (wordlist[subpath] > 2 || subpath.length < 1) {
- continue
+ // Remove underscores and make it normal with upper case etc
+ const urlsplit = path.split("/")
+ if (urlsplit.length > 0) {
+ var curname = ""
+ for(var key in urlsplit) {
+ var subpath = urlsplit[key]
+ if (wordlist[subpath] > 2 || subpath.length < 1) {
+ continue
+ }
+
+ curname = subpath
+ break
}
-
- curname = subpath
- break
- }
- // FIXME: If name exists,
- // FIXME: Check if first part of parsedname is verb, otherwise use method
- const parsedname = curname.split("_").join(" ").split("-").join(" ").split("{").join(" ").split("}").join(" ").trim()
- if (parsedname.length === 0) {
- newaction.errors.push("Missing name")
- } else {
- const newname = method.charAt(0).toUpperCase() + method.slice(1) + " " + parsedname
- const searchactions = newActions.find(data => data.name === newname)
- console.log("SEARCH: ", searchactions)
- if (searchactions !== undefined) {
+ // FIXME: If name exists,
+ // FIXME: Check if first part of parsedname is verb, otherwise use method
+ const parsedname = curname.split("_").join(" ").split("-").join(" ").split("{").join(" ").split("}").join(" ").trim()
+ if (parsedname.length === 0) {
newaction.errors.push("Missing name")
} else {
- newaction.name = newname
+ const newname = method.charAt(0).toUpperCase() + method.slice(1) + " " + parsedname
+ const searchactions = newActions.find(data => data.name === newname)
+ console.log("SEARCH: ", searchactions)
+ if (searchactions !== undefined) {
+ newaction.errors.push("Missing name")
+ } else {
+ newaction.name = newname
+ }
}
- }
- } else {
- newaction.errors.push("Missing name")
+ } else {
+ newaction.errors.push("Missing name")
+ }
}
+ newActions.push(newaction)
}
- newActions.push(newaction)
}
if (data.servers !== undefined && data.servers.length > 0) {
@@ -721,8 +727,7 @@ const AppCreator = (props) => {
}
}
-
- // FIXME: Have multiple authentication options?
+ console.log("INVALID9: ", data)
if (securitySchemes !== undefined) {
for (const [key, value] of Object.entries(securitySchemes)) {
if (value.scheme === "bearer") {
diff --git a/frontend/src/views/Apps.jsx b/frontend/src/views/Apps.jsx
index 03b98a5f..d13c068a 100644
--- a/frontend/src/views/Apps.jsx
+++ b/frontend/src/views/Apps.jsx
@@ -280,11 +280,19 @@ const Apps = (props) => {
if (!responseJson.success) {
alert.error("Failed to download file")
} else {
- const inputdata = YAML.parse(responseJson.body)
+ console.log(responseJson)
+ const basedata = atob(responseJson.openapi)
+ console.log("BASE: ", basedata)
+ var inputdata = JSON.parse(basedata)
+ console.log("POST INPUT: ", inputdata)
+ inputdata = JSON.parse(inputdata.body)
+
const newpaths = {}
- Object.keys(inputdata["paths"]).forEach(function(key) {
- newpaths[key.split("?")[0]] = inputdata.paths[key]
- })
+ if (inputdata["paths"] !== undefined) {
+ Object.keys(inputdata["paths"]).forEach(function(key) {
+ newpaths[key.split("?")[0]] = inputdata.paths[key]
+ })
+ }
inputdata.paths = newpaths
console.log("INPUT: ", inputdata)