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 => (
)) : null}