From 0d17de238b44327fe946313fa1057be4443b3af4 Mon Sep 17 00:00:00 2001 From: frikky Date: Tue, 23 Jun 2020 20:04:00 +0200 Subject: [PATCH] Bugfixes towards blogpost 4 --- .env | 12 +++++----- backend/app_sdk/app_base.py | 34 ++++++++++++++++++++------- backend/go-app/main.go | 30 +++++++++++++---------- backend/go-app/walkoff.go | 16 +++++++++---- docker-compose.yml | 6 ++--- frontend/src/Admin.js | 2 +- frontend/src/AngularWorkflow.js | 18 +++++++------- frontend/src/defaultCytoscapeStyle.js | 2 ++ functions/onprem/orborus/orborus.go | 5 ++-- functions/onprem/worker/worker.go | 8 ++++++- 10 files changed, 86 insertions(+), 47 deletions(-) diff --git a/.env b/.env index c8986223..ee13a292 100644 --- a/.env +++ b/.env @@ -4,13 +4,13 @@ ENVIRONMENT_NAME=Shuffle # Remote github config for first load APP_DOWNLOAD_LOCATION=https://github.com/frikky/shuffle-apps -APP_DOWNLOAD_AUTH_USERNAME="" -APP_DOWNLOAD_AUTH_PASSWORD="" +APP_DOWNLOAD_AUTH_USERNAME= +APP_DOWNLOAD_AUTH_PASSWORD= -# User config for first load -SHUFFLE_DEFAULT_USERNAME="" -SHUFFLE_DEFAULT_PASSWORD="" -SHUFFLE_DEFAULT_APIKEY="" +# User config for first load. Username & PW: min length 3 +SHUFFLE_DEFAULT_USERNAME= +SHUFFLE_DEFAULT_PASSWORD= +SHUFFLE_DEFAULT_APIKEY= # Local location of your app directory. Can't use ~/ APP_HOTLOAD_LOCATION=./shuffle-apps diff --git a/backend/app_sdk/app_base.py b/backend/app_sdk/app_base.py index 3f7a788f..9e45426f 100644 --- a/backend/app_sdk/app_base.py +++ b/backend/app_sdk/app_base.py @@ -384,14 +384,27 @@ class AppBase: if value == "#": # FIXME - not recursive - should go deeper if there are more # - print("HANDLE RECURSIVE LOOP ") + print("HANDLE RECURSIVE LOOP OF %s" % basejson) returnlist = [] - for innervalue in basejson: - #print("Value: %s" % value[parsersplit[cnt+1]]) - returnlist.append(innervalue[parsersplit[cnt+1]]) + try: + for innervalue in basejson: + print("Value: %s" % value[parsersplit[cnt+1]]) + returnlist.append(innervalue[parsersplit[cnt+1]]) + except IndexError as e: + print("Indexerror inner: %s" % e) + # Basically means its a normal list, not a crazy one :) + # Custom format for ${name[0,1,2,...]}$ + indexvalue = "${NO_SPLITTER%s}$" % json.dumps(basejson) + if len(returnlist) > 0: + indexvalue = "${NO_SPLITTER%s}$" % json.dumps(returnlist) + + print("INDEXVAL: ", indexvalue) + return indexvalue # Example format: ${[]}$ - return "${%s%s}$" % (parsersplit[cnt+1], json.dumps(returnlist)) + parseditem = "${%s%s}$" % (parsersplit[cnt+1], json.dumps(returnlist)) + print("PARSED LOOP ITEM: %s" % parseditem) + return parseditem else: if isinstance(basejson[value], str): @@ -405,9 +418,8 @@ class AppBase: basejson = basejson[value] except KeyError as e: + print("Lower keyerror: %s" % e) return "KeyError: %s" % e - except IndexError as e: - return "IndexError: %s" % e return basejson @@ -424,7 +436,7 @@ class AppBase: #self.logger.debug(f"\n\nHandle static data with JSON: {data}\n\n") #self.logger.info("STATIC PARSED: %s" % actualitem) if len(actualitem) > 0: - print("ACTUAL: %s", actualitem) + print("ACTUAL: ", actualitem) for replace in actualitem: try: to_be_replaced = replace[0] @@ -488,8 +500,10 @@ class AppBase: else: fullname += parameter["action_field"] + self.logger.info("PRE Fullname: %s" % fullname) + if parameter["value"].startswith(jsonparsevalue): - fullname += parameter["value"][2:] + fullname += parameter["value"][1:] #else: # fullname = "$%s" % parameter["action_field"] @@ -699,8 +713,10 @@ class AppBase: raise "Value check error: %s" % Exception(check) # Custom format for ${name[0,1,2,...]}$ + #submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})" submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})" actualitem = re.findall(submatch, value, re.MULTILINE) + print("Multicheck: %s", actualitem) if len(actualitem) > 0: multiexecution = True diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 9774b606..f36fa593 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -812,8 +812,8 @@ func parseLoginParameters(resp http.ResponseWriter, request *http.Request) (logi // Removed for localhost func checkPasswordStrength(password string) error { // Check password strength here - if len(password) < 10 { - return errors.New("Minimum password length is 10.") + if len(password) < 3 { + return errors.New("Minimum password length is 3.") } //if len(password) > 128 { @@ -923,8 +923,8 @@ func checkUsername(Username string) error { // return errors.New("Invalid Username") //} - if len(Username) < 4 { - return errors.New("Minimum Username length is 4") + if len(Username) < 3 { + return errors.New("Minimum Username length is 3") } return nil @@ -1939,7 +1939,7 @@ func handlePasswordChange(resp http.ResponseWriter, request *http.Request) { if len(users) != 1 { log.Printf(`Found multiple users with the same username: %s: %d`, t.Username, len(users)) resp.WriteHeader(401) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Found multiple users with the same username: %s"}`, t.Username))) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Found %d users with the same username: %s (%d)"}`, len(users), t.Username))) return } @@ -2233,7 +2233,8 @@ func handleLogin(resp http.ResponseWriter, request *http.Request) { } ctx := context.Background() - q := datastore.NewQuery("Users").Filter("Username =", strings.ToLower(data.Username)) + log.Printf("Username: %s", data.Username) + q := datastore.NewQuery("Users").Filter("Username =", data.Username) var users []User _, err = dbclient.GetAll(ctx, q, &users) if err != nil { @@ -2246,7 +2247,7 @@ func handleLogin(resp http.ResponseWriter, request *http.Request) { if len(users) != 1 { log.Printf(`Found multiple users with the same username: %s: %d`, data.Username, len(users)) resp.WriteHeader(401) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Found multiple users with the same username: %s"}`, data.Username))) + resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Found %d users with the same username: %s"}`, len(users), data.Username))) return } @@ -3215,8 +3216,6 @@ func handleNewHook(resp http.ResponseWriter, request *http.Request) { Running: false, } - log.Printf("Hello") - // FIXME: Add cloud function execution? //b, err := json.Marshal(hook) //if err != nil { @@ -6140,7 +6139,6 @@ func runInit(ctx context.Context) { } // Fix active users etc - log.Printf("Checking users") q := datastore.NewQuery("Users").Filter("active =", true) var activeusers []User _, err = dbclient.GetAll(ctx, q, &activeusers) @@ -6181,18 +6179,23 @@ func runInit(ctx context.Context) { } } } else if len(users) == 0 { - log.Printf("Trying to set up user based on environments DEFAULT_USERNAME & DEFAULT_PASSWORD") + log.Printf("Trying to set up user based on environments SHUFFLE_DEFAULT_USERNAME & SHUFFLE_DEFAULT_PASSWORD") username := os.Getenv("SHUFFLE_DEFAULT_USERNAME") password := os.Getenv("SHUFFLE_DEFAULT_PASSWORD") if len(username) == 0 || len(password) == 0 { - log.Printf("DEFAULT_USERNAME and DEFAULT_PASSWORD not defined as environments. Running without default user.") + log.Printf("SHUFFLE_DEFAULT_USERNAME and SHUFFLE_DEFAULT_PASSWORD not defined as environments. Running without default user.") } else { apikey := os.Getenv("SHUFFLE_DEFAULT_APIKEY") err = createNewUser(username, password, "admin", apikey) if err != nil { log.Printf("Failed to create default user %s: %s", username, err) + } else { + log.Printf("Successfully created user %s", username) } } + } else { + //log.Printf("Found %d users.", len(users)) + //log.Printf(users[0].Username) } } @@ -6306,7 +6309,7 @@ func runInit(ctx context.Context) { } _, err = git.Clone(storer, fs, cloneOptions) if err != nil { - log.Printf("Failed loading repo %s into memory: %s", err) + log.Printf("Failed loading repo %s into memory: %s", apis, err) } else { log.Printf("Finished git clone. Looking for updates to the repo.") dir, err := fs.ReadDir("") @@ -6354,6 +6357,7 @@ func init() { r.HandleFunc("/api/v1/users/getsettings", handleSettings).Methods("GET", "OPTIONS") r.HandleFunc("/api/v1/users/updateuser", handleUpdateUser).Methods("PUT", "OPTIONS") r.HandleFunc("/api/v1/users/{user}", deleteUser).Methods("DELETE", "OPTIONS") + r.HandleFunc("/api/v1/users/passwordchange", handlePasswordChange).Methods("POST", "OPTIONS") r.HandleFunc("/api/v1/users", handleGetUsers).Methods("GET", "OPTIONS") // General - duplicates and old. diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index b7541c87..dd651385 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -1205,6 +1205,13 @@ func setNewWorkflow(resp http.ResponseWriter, request *http.Request) { // Adds the Testing app if it's a new workflow workflowapps, err := getAllWorkflowApps(ctx) if err == nil { + // FIXME: Add real env + //q := datastore.NewQuery("Environments").Limit(1) + //count, err := dbclient.Get(ctx, q) + //envName := "Shuffle" + //if err == nil { + //} + for _, item := range workflowapps { if item.Name == "Testing" && item.AppVersion == "1.0.0" { nodeId := "40447f30-fa44-4a4f-a133-4ee710368737" @@ -1627,10 +1634,10 @@ func saveWorkflow(resp http.ResponseWriter, request *http.Request) { } // Has to NOT be generated - //if app.Name == action.AppName && app.AppVersion == action.AppVersion { - // curapp = app - // break - //} + if app.Name == action.AppName && app.AppVersion == action.AppVersion { + curapp = app + break + } } // Check to see if the whole app is valid @@ -1985,6 +1992,7 @@ func handleExecution(id string, workflow Workflow, request *http.Request) (Workf } // FIXME - this should have "execution_argument" from executeWorkflow frontend + log.Printf("EXEC: %#v", execution) if len(execution.ExecutionArgument) > 0 { workflowExecution.ExecutionArgument = execution.ExecutionArgument } diff --git a/docker-compose.yml b/docker-compose.yml index 25c4f51c..c13e60fc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: depends_on: - backend backend: - #build: ./backend + build: ./backend image: frikky/shuffle:backend container_name: shuffle-backend hostname: ${BACKEND_HOSTNAME} @@ -27,10 +27,10 @@ services: - /var/run/docker.sock:/var/run/docker.sock - ${APP_HOTLOAD_LOCATION}:/shuffle-apps environment: - - ORG_ID=${ORG_ID} - DATASTORE_EMULATOR_HOST=shuffle-database:8000 - - APP_DOWNLOAD_LOCATION=${APP_DOWNLOAD_LOCATION} - APP_HOTLOAD_FOLDER=/shuffle-apps + - ORG_ID=${ORG_ID} + - APP_DOWNLOAD_LOCATION=${APP_DOWNLOAD_LOCATION} - SHUFFLE_DEFAULT_USERNAME=${SHUFFLE_DEFAULT_USERNAME} - SHUFFLE_DEFAULT_PASSWORD=${SHUFFLE_DEFAULT_PASSWORD} - SHUFFLE_DEFAULT_APIKEY=${SHUFFLE_DEFAULT_APIKEY} diff --git a/frontend/src/Admin.js b/frontend/src/Admin.js index 2c76392b..a4762fc4 100644 --- a/frontend/src/Admin.js +++ b/frontend/src/Admin.js @@ -94,7 +94,7 @@ const Admin = (props) => { }), ) .catch(error => { - alert.error("Err: ", error.toString()) + alert.error("Err: "+error.toString()) }); } diff --git a/frontend/src/AngularWorkflow.js b/frontend/src/AngularWorkflow.js index 87670cd2..d93aa1e4 100644 --- a/frontend/src/AngularWorkflow.js +++ b/frontend/src/AngularWorkflow.js @@ -792,11 +792,12 @@ const AngularWorkflow = (props) => { setSelectedEdgeIndex(workflow.branches.findIndex(data => data.id === event.target.data()["id"])) setSelectedEdge(event.target.data()) - setSelectedAction({}) - setSelectedTrigger({}) } else { //alert.info("Can't edit branches from triggers") } + + setSelectedAction({}) + setSelectedTrigger({}) } const onNodeSelect = (event) => { @@ -862,6 +863,7 @@ const AngularWorkflow = (props) => { found = true break } else if (workflow.branches[key].destination_id === edge.target && workflow.branches[key].source_id === edge.source) { + console.log(edge) alert.error("That branch already exists") event.target.remove() found = true @@ -1048,7 +1050,7 @@ const AngularWorkflow = (props) => { event.preventDefault() cy.fit(null, 50) } - break; + break; case 65: // As a poweruser myself, I found myself hitting this a few // too many times to just edit text. Need a better bind @@ -2485,13 +2487,13 @@ const AngularWorkflow = (props) => { }} style={{backgroundColor: inputColor, color: "white", height: "50px"}} > - {workflow.workflow_variables !== null ? workflow.workflow_variables.map(data => ( + {workflow.workflow_variables !== undefined && workflow.workflow_variables !== null ? workflow.workflow_variables.map(data => ( {data.name} )) : null} - {workflow.execution_variables !== null ? workflow.execution_variables.map(data => ( + {workflow.execution_variables !== undefined && workflow.execution_variables !== null ? workflow.execution_variables.map(data => ( {data.name} @@ -2649,7 +2651,7 @@ const AngularWorkflow = (props) => { placeholder={selectedAction.label} onChange={selectedNameChange} /> - {environments !== undefined && environments !== null && environments.length > 1 ? + {environments !== undefined && environments !== null && environments.length > 0 ?
Environment