Added app auth encryption possibility with SHUFFLE_ENCRYPTION_MODIFIER env
This commit is contained in:
@@ -25,16 +25,22 @@ SHUFFLE_APP_HOTLOAD_FOLDER=./shuffle-apps
|
|||||||
SHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps
|
SHUFFLE_APP_HOTLOAD_LOCATION=./shuffle-apps
|
||||||
SHUFFLE_FILE_LOCATION=./shuffle-files
|
SHUFFLE_FILE_LOCATION=./shuffle-files
|
||||||
|
|
||||||
|
# Encryption modifier. This HAS to be set to encrypt any authentication being used in Shuffle. This is put together with other relevant values to ensure multiple parts are needed to decrypt.
|
||||||
|
# If this key is lost or changed, you will have to reauthenticate all apps.
|
||||||
|
SHUFFLE_ENCRYPTION_MODIFIER=
|
||||||
|
|
||||||
# Other configs
|
# Other configs
|
||||||
BACKEND_HOSTNAME=shuffle-backend
|
BACKEND_HOSTNAME=shuffle-backend
|
||||||
BACKEND_PORT=5001
|
BACKEND_PORT=5001
|
||||||
FRONTEND_PORT=3001
|
FRONTEND_PORT=3001
|
||||||
FRONTEND_PORT_HTTPS=3443
|
FRONTEND_PORT_HTTPS=3443
|
||||||
|
|
||||||
# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:
|
# CHANGE THIS IF YOU WANT GOOD LOCAL EXECUTIONS:
|
||||||
OUTER_HOSTNAME=shuffle-backend
|
OUTER_HOSTNAME=shuffle-backend
|
||||||
DB_LOCATION=./shuffle-database
|
DB_LOCATION=./shuffle-database
|
||||||
DOCKER_API_VERSION=1.40
|
DOCKER_API_VERSION=1.40
|
||||||
|
|
||||||
|
|
||||||
# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.
|
# Proxy configurations. SHUFFLE_PASS_WORKER_PROXY must be FALSE to not pass the proxy information to sub-apps.
|
||||||
# PS: It will skip proxy for
|
# PS: It will skip proxy for
|
||||||
HTTP_PROXY=
|
HTTP_PROXY=
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ require (
|
|||||||
github.com/docker/go-units v0.4.0 // indirect
|
github.com/docker/go-units v0.4.0 // indirect
|
||||||
github.com/elastic/go-elasticsearch/v7 v7.13.1 // indirect
|
github.com/elastic/go-elasticsearch/v7 v7.13.1 // indirect
|
||||||
github.com/frikky/kin-openapi v0.39.0
|
github.com/frikky/kin-openapi v0.39.0
|
||||||
github.com/frikky/shuffle-shared v0.0.95
|
github.com/frikky/shuffle-shared v0.0.97
|
||||||
github.com/fsouza/go-dockerclient v1.7.2
|
github.com/fsouza/go-dockerclient v1.7.2
|
||||||
github.com/ghodss/yaml v1.0.0
|
github.com/ghodss/yaml v1.0.0
|
||||||
github.com/go-git/go-billy/v5 v5.0.0
|
github.com/go-git/go-billy/v5 v5.0.0
|
||||||
|
|||||||
@@ -1540,6 +1540,33 @@ func handleExecution(id string, workflow shuffle.Workflow, request *http.Request
|
|||||||
return shuffle.WorkflowExecution{}, fmt.Sprintf("Auth ID %s doesn't exist", action.AuthenticationId), errors.New(fmt.Sprintf("Auth ID %s doesn't exist", action.AuthenticationId))
|
return shuffle.WorkflowExecution{}, fmt.Sprintf("Auth ID %s doesn't exist", action.AuthenticationId), errors.New(fmt.Sprintf("Auth ID %s doesn't exist", action.AuthenticationId))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if curAuth.Encrypted {
|
||||||
|
setField := true
|
||||||
|
newFields := []shuffle.AuthenticationStore{}
|
||||||
|
for _, field := range curAuth.Fields {
|
||||||
|
parsedKey := fmt.Sprintf("%s_%d_%s_%s", curAuth.OrgId, curAuth.Created, curAuth.Label, field.Key)
|
||||||
|
newValue, err := shuffle.HandleKeyDecryption(field.Value, parsedKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[WARNING] Failed decryption for %s: %s", field.Key, err)
|
||||||
|
setField = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
field.Value = newValue
|
||||||
|
newFields = append(newFields, field)
|
||||||
|
}
|
||||||
|
|
||||||
|
if setField {
|
||||||
|
curAuth.Fields = newFields
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("[INFO] AUTH IS NOT ENCRYPTED - attempting encrypting!")
|
||||||
|
err = shuffle.SetWorkflowAppAuthDatastore(ctx, curAuth, curAuth.Id)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[WARNING] Failed running encryption during execution: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
newParams := []shuffle.WorkflowAppActionParameter{}
|
newParams := []shuffle.WorkflowAppActionParameter{}
|
||||||
if strings.ToLower(curAuth.Type) == "oauth2" {
|
if strings.ToLower(curAuth.Type) == "oauth2" {
|
||||||
log.Printf("\n\nShould replace auth parameters!!!\n\n")
|
log.Printf("\n\nShould replace auth parameters!!!\n\n")
|
||||||
@@ -3699,7 +3726,7 @@ func IterateAppGithubFolders(ctx context.Context, fs billy.Filesystem, dir []os.
|
|||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
workflowapp.Documentation = string(fileData)
|
workflowapp.Documentation = string(fileData)
|
||||||
log.Printf("[INFO] Found %s (README) file of length %d for %s:%s", readmePath, len(workflowapp.Documentation), newName, workflowapp.AppVersion)
|
//log.Printf("[INFO] Found %s (README) file of length %d for %s:%s", readmePath, len(workflowapp.Documentation), newName, workflowapp.AppVersion)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3719,7 +3746,7 @@ func IterateAppGithubFolders(ctx context.Context, fs billy.Filesystem, dir []os.
|
|||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
workflowapp.Documentation = string(fileData)
|
workflowapp.Documentation = string(fileData)
|
||||||
log.Printf("[INFO] Found %s (README) file of length %d for %s:%s", readmePath, len(workflowapp.Documentation), newName, workflowapp.AppVersion)
|
//log.Printf("[INFO] Found %s (README) file of length %d for %s:%s", readmePath, len(workflowapp.Documentation), newName, workflowapp.AppVersion)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1488,7 +1488,7 @@ const ParsedAction = (props) => {
|
|||||||
<ArrowLeftIcon style={{color: "white"}}/>
|
<ArrowLeftIcon style={{color: "white"}}/>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<IconButton style={{marginTop: "auto", marginBottom: "auto", height: 30, paddingLeft: 10, paddingRight: 0}} onClick={() => {
|
<IconButton style={{marginTop: "auto", marginBottom: "auto", height: 30, paddingLeft: 25, paddingRight: 0}} onClick={() => {
|
||||||
setAuthenticationModalOpen(true)
|
setAuthenticationModalOpen(true)
|
||||||
}}>
|
}}>
|
||||||
<Tooltip color="primary" title="Read app docs" placement="top">
|
<Tooltip color="primary" title="Read app docs" placement="top">
|
||||||
|
|||||||
@@ -9123,18 +9123,22 @@ const AngularWorkflow = (props) => {
|
|||||||
<CloseIcon />
|
<CloseIcon />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
<div style={{display: "flex", flexDirection: "row",}}>
|
<div style={{display: "flex", flexDirection: "row",}}>
|
||||||
<div style={{flex: 1, padding: 0, minHeight: 650, maxHeight: 650, overflowY: "auto", overflowX: "hidden", }}>
|
<div style={{flex: 2, padding: 0, minHeight: 650, maxHeight: 650, overflowY: "auto", overflowX: "hidden", }}>
|
||||||
{authenticationType.type === "oauth2" ?
|
{authenticationType.type === "oauth2" ?
|
||||||
<AuthenticationOauth2 saveWorkflow={saveWorkflow} selectedApp={selectedApp} workflow={workflow} selectedAction={selectedAction} authenticationType={authenticationType} getAppAuthentication={getAppAuthentication} appAuthentication={appAuthentication} setSelectedAction={setSelectedAction} setNewAppAuth={setNewAppAuth} setAuthenticationModalOpen={setAuthenticationModalOpen} />
|
<AuthenticationOauth2 saveWorkflow={saveWorkflow} selectedApp={selectedApp} workflow={workflow} selectedAction={selectedAction} authenticationType={authenticationType} getAppAuthentication={getAppAuthentication} appAuthentication={appAuthentication} setSelectedAction={setSelectedAction} setNewAppAuth={setNewAppAuth} setAuthenticationModalOpen={setAuthenticationModalOpen} />
|
||||||
:
|
:
|
||||||
<AuthenticationData app={selectedApp} />
|
<AuthenticationData app={selectedApp} />
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<div style={{flex: 2, borderLeft: `1px solid ${inputColor}`, padding: "70px 30px 30px 30px", maxHeight: 630, minHeight: 630, overflowY: "auto", overflowX: "hidden"}}>
|
<div style={{flex: 3, borderLeft: `1px solid ${inputColor}`, padding: "70px 30px 30px 30px", maxHeight: 630, minHeight: 630, overflowY: "auto", overflowX: "hidden"}}>
|
||||||
{selectedApp.documentation === undefined || selectedApp.documentation === null || selectedApp.documentation.length === 0 ?
|
{selectedApp.documentation === undefined || selectedApp.documentation === null || selectedApp.documentation.length === 0 ?
|
||||||
<span style={{textAlign: "center", }}>
|
<span style={{textAlign: "center", }}>
|
||||||
|
<Typography variant="h6">
|
||||||
|
Description: {selectedApp.description}
|
||||||
|
</Typography>
|
||||||
|
<Divider style={{marginTop: 25, marginBottom: 25, backgroundColor: inputColor, }} />
|
||||||
<Typography variant="h4">
|
<Typography variant="h4">
|
||||||
There is currently no documentation for this app.
|
There is currently no extended documentation available for this app.
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="h6" style={{marginTop: 25}}>
|
<Typography variant="h6" style={{marginTop: 25}}>
|
||||||
Want help with this app? <a rel="norefferer" target="_blank" href="https://discord.gg/B2CBzUm" style={{textDecoration: "none", color: "#f86a3e"}}>Join the Discord!</a>
|
Want help with this app? <a rel="norefferer" target="_blank" href="https://discord.gg/B2CBzUm" style={{textDecoration: "none", color: "#f86a3e"}}>Join the Discord!</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user