diff --git a/backend/go-app/go.mod b/backend/go-app/go.mod index b4809e89..f311cf6b 100644 --- a/backend/go-app/go.mod +++ b/backend/go-app/go.mod @@ -19,7 +19,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/h2non/filetype v1.1.3 github.com/satori/go.uuid v1.2.0 - github.com/shuffle/shuffle-shared v0.3.98 + github.com/shuffle/shuffle-shared v0.4.0 golang.org/x/crypto v0.3.0 google.golang.org/api v0.103.0 google.golang.org/appengine v1.6.7 diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 4526dce2..b93e9042 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -21,7 +21,6 @@ import ( "io" "io/ioutil" "log" - "math/rand" "net/http" "net/url" "os" @@ -1226,15 +1225,6 @@ func handleContact(resp http.ResponseWriter, request *http.Request) { resp.Write([]byte(fmt.Sprintf(`{"success": true, "message": "Thanks for reaching out. We will contact you soon!"}`))) } -func verifier() (*shuffle.CodeVerifier, error) { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - b := make([]byte, 32, 32) - for i := 0; i < 32; i++ { - b[i] = byte(r.Intn(255)) - } - return shuffle.CreateCodeVerifierFromBytes(b) -} - func checkAdminLogin(resp http.ResponseWriter, request *http.Request) { cors := shuffle.HandleCors(resp, request) if cors { @@ -1279,51 +1269,7 @@ func checkAdminLogin(resp http.ResponseWriter, request *http.Request) { // Should run calculations if len(org.SSOConfig.OpenIdAuthorization) > 0 { - baseSSOUrl = org.SSOConfig.OpenIdAuthorization - - codeChallenge := uuid.NewV4().String() - //h.Write([]byte(v.Value)) - verifier, verifiererr := verifier() - if verifiererr == nil { - codeChallenge = verifier.Value - } - - //log.Printf("[DEBUG] Got challenge value %s (pre state)", codeChallenge) - - // https://192.168.55.222:3443/api/v1/login_openid - //location := strings.Split(request.URL.String(), "/") - //redirectUrl := url.QueryEscape("http://localhost:5001/api/v1/login_openid") - redirectUrl := url.QueryEscape(fmt.Sprintf("http://%s/api/v1/login_openid", request.Host)) - if strings.Contains(request.Host, "shuffle-backend") && !strings.Contains(os.Getenv("BASE_URL"), "shuffle-backend") { - redirectUrl = url.QueryEscape(fmt.Sprintf("%s/api/v1/login_openid", os.Getenv("BASE_URL"))) - } - - if len(os.Getenv("SSO_REDIRECT_URL")) > 0 { - redirectUrl = url.QueryEscape(fmt.Sprintf("%s/api/v1/login_openid", os.Getenv("SSO_REDIRECT_URL"))) - } - - state := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("org=%s&challenge=%s&redirect=%s", org.Id, codeChallenge, redirectUrl))) - - // has to happen after initial value is stored - if verifiererr == nil { - codeChallenge = verifier.CodeChallengeS256() - } - - //log.Printf("[DEBUG] Got challenge value %s (POST state)", codeChallenge) - - if len(org.SSOConfig.OpenIdClientSecret) > 0 { - - //baseSSOUrl += fmt.Sprintf("?client_id=%s&response_type=code&scope=openid&redirect_uri=%s&state=%s&client_secret=%s", org.SSOConfig.OpenIdClientId, redirectUrl, state, org.SSOConfig.OpenIdClientSecret) - state := base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("org=%s&redirect=%s&challenge=%s", org.Id, redirectUrl, org.SSOConfig.OpenIdClientSecret))) - log.Printf("URL: %s", redirectUrl) - - baseSSOUrl += fmt.Sprintf("?client_id=%s&response_type=id_token&scope=openid&redirect_uri=%s&state=%s&response_mode=form_post&nonce=%s", org.SSOConfig.OpenIdClientId, redirectUrl, state, state) - //baseSSOUrl += fmt.Sprintf("&client_secret=%s", org.SSOConfig.OpenIdClientSecret) - log.Printf("[DEBUG] Found OpenID url (client secret). Extra redirect check: %s - %s", request.URL.String(), baseSSOUrl) - } else { - log.Printf("[DEBUG] Found OpenID url (PKCE!!). Extra redirect check: %s", request.URL.String()) - baseSSOUrl += fmt.Sprintf("?client_id=%s&response_type=code&scope=openid&redirect_uri=%s&state=%s&code_challenge_method=S256&code_challenge=%s", org.SSOConfig.OpenIdClientId, redirectUrl, state, codeChallenge) - } + baseSSOUrl = shuffle.GetOpenIdUrl(org) break } diff --git a/frontend/src/views/AngularWorkflow.jsx b/frontend/src/views/AngularWorkflow.jsx index ced6d5d3..7e6e74da 100644 --- a/frontend/src/views/AngularWorkflow.jsx +++ b/frontend/src/views/AngularWorkflow.jsx @@ -9079,47 +9079,48 @@ const AngularWorkflow = (defaultprops) => { }; const handleWorkflowSelectionUpdate = (e, isUserinput) => { - setUpdate(Math.random()); + setUpdate(Math.random()); - if (e.target.value === undefined || e.target.value === null || e.target.value.id === undefined) { - return null - } - - const paramIndex = isUserinput === true ? 5 : 0 - workflow.triggers[selectedTriggerIndex].parameters[paramIndex].value = e.target.value.id; - setSubworkflow(e.target.value); - - // Sets the startnode - if (e.target.value.id !== workflow.id) { - console.log("WORKFLOW: ", e.target.value); - - const startnode = e.target.value.actions.find((action) => action.id === e.target.value.start); - - - if (startnode !== undefined && startnode !== null) { - setSubworkflowStartnode(startnode); - - if (paramIndex === 0) { - try { - workflow.triggers[selectedTriggerIndex].parameters[3].value = startnode.id; - } catch { - workflow.triggers[selectedTriggerIndex].parameters[3] = { - name: "startnode", - value: startnode.id, - }; - } - } - - //setWorkflow(workflow); - } - console.log("STARTNODE: ", startnode); - } else { - console.log("WORKFLOW: ", workflow); - } - - setWorkflow(workflow); + if (e.target.value === undefined || e.target.value === null || e.target.value.id === undefined) { + console.log("Returning as there's no id") + return null } + const paramIndex = isUserinput === true ? 5 : 0 + workflow.triggers[selectedTriggerIndex].parameters[paramIndex].value = e.target.value.id; + setSubworkflow(e.target.value); + + // Sets the startnode + if (e.target.value.id !== workflow.id) { + console.log("WORKFLOW: ", e.target.value); + + const startnode = e.target.value.actions.find((action) => action.id === e.target.value.start); + + + if (startnode !== undefined && startnode !== null) { + setSubworkflowStartnode(startnode); + + if (paramIndex === 0) { + try { + workflow.triggers[selectedTriggerIndex].parameters[3].value = startnode.id; + } catch { + workflow.triggers[selectedTriggerIndex].parameters[3] = { + name: "startnode", + value: startnode.id, + }; + } + } + + //setWorkflow(workflow); + } + console.log("STARTNODE: ", startnode); + } else { + console.log("WORKFLOW: ", workflow); + } + + setWorkflow(workflow); + } + const SubflowSidebar = () => { const [menuPosition, setMenuPosition] = useState(null); const [showDropdown, setShowDropdown] = React.useState(false); @@ -9880,7 +9881,7 @@ const AngularWorkflow = (defaultprops) => { id="subflow_search" autoHighlight freeSolo - autoSelect + //autoSelect value={subworkflow} classes={{ inputRoot: classes.inputRoot }} ListboxProps={{ @@ -9914,7 +9915,24 @@ const AngularWorkflow = (defaultprops) => { }} onChange={(event, newValue) => { console.log("Found value: ", newValue) - handleWorkflowSelectionUpdate({ target: { value: newValue } }) + + var parsedinput = { target: { value: newValue } } + + // For variables + if (typeof newValue === 'string' && newValue.startsWith("$")) { + parsedinput = { + target: { + value: { + "name": newValue, + "id": newValue, + "actions": [], + "triggers": [], + } + } + } + } + + handleWorkflowSelectionUpdate(parsedinput) }} renderOption={(data, index) => { if (data.id === workflow.id) { diff --git a/frontend/src/views/LoginPage.jsx b/frontend/src/views/LoginPage.jsx index 96329944..4cb4b27c 100644 --- a/frontend/src/views/LoginPage.jsx +++ b/frontend/src/views/LoginPage.jsx @@ -88,10 +88,8 @@ const LoginDialog = (props) => { if (responseJson["success"] === false) { setLoginInfo(responseJson["reason"]); } else { - if ( - responseJson.sso_url !== undefined && - responseJson.sso_url !== null - ) { + + if (responseJson.sso_url !== undefined && responseJson.sso_url !== null) { setSSOUrl(responseJson.sso_url); }