+46
-63
@@ -35,8 +35,8 @@ import (
|
|||||||
"github.com/go-git/go-billy/v5/memfs"
|
"github.com/go-git/go-billy/v5/memfs"
|
||||||
"github.com/go-git/go-git/v5"
|
"github.com/go-git/go-git/v5"
|
||||||
"github.com/go-git/go-git/v5/plumbing"
|
"github.com/go-git/go-git/v5/plumbing"
|
||||||
|
gitProxy "github.com/go-git/go-git/v5/plumbing/transport"
|
||||||
"github.com/go-git/go-git/v5/storage/memory"
|
"github.com/go-git/go-git/v5/storage/memory"
|
||||||
gitProxy "github.com/go-git/go-git/v5/plumbing/transport"
|
|
||||||
|
|
||||||
// Random
|
// Random
|
||||||
xj "github.com/basgys/goxml2json"
|
xj "github.com/basgys/goxml2json"
|
||||||
@@ -257,7 +257,6 @@ type Hook struct {
|
|||||||
Environment string `json:"environment" datastore:"environment"`
|
Environment string `json:"environment" datastore:"environment"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func GetUsersHandler(w http.ResponseWriter, r *http.Request) {
|
func GetUsersHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"id": "12345",
|
"id": "12345",
|
||||||
@@ -398,49 +397,49 @@ func checkUsername(Username string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isGitNoProxy(rawURL string) bool {
|
func isGitNoProxy(rawURL string) bool {
|
||||||
noProxy := os.Getenv("NO_PROXY")
|
noProxy := os.Getenv("NO_PROXY")
|
||||||
if noProxy == "" {
|
if noProxy == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if noProxy == "*" {
|
if noProxy == "*" {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
noProxyList := strings.Split(noProxy, ",")
|
noProxyList := strings.Split(noProxy, ",")
|
||||||
parsedURL, err := url.Parse(rawURL)
|
parsedURL, err := url.Parse(rawURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
host := parsedURL.Hostname()
|
host := parsedURL.Hostname()
|
||||||
|
|
||||||
for _,value := range noProxyList {
|
for _, value := range noProxyList {
|
||||||
value = strings.TrimSpace(value)
|
value = strings.TrimSpace(value)
|
||||||
|
|
||||||
if host == value {
|
if host == value {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if strings.HasPrefix(value, "*.") && strings.HasSuffix(host, value[2:]){
|
if strings.HasPrefix(value, "*.") && strings.HasSuffix(host, value[2:]) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkGitProxy(cloneOptions *git.CloneOptions) *git.CloneOptions {
|
func checkGitProxy(cloneOptions *git.CloneOptions) *git.CloneOptions {
|
||||||
if os.Getenv("HTTP_PROXY") != "" && !isGitNoProxy(cloneOptions.URL){
|
if os.Getenv("HTTP_PROXY") != "" && !isGitNoProxy(cloneOptions.URL) {
|
||||||
cloneOptions.ProxyOptions = gitProxy.ProxyOptions{
|
cloneOptions.ProxyOptions = gitProxy.ProxyOptions{
|
||||||
URL: os.Getenv("HTTP_PROXY"),
|
URL: os.Getenv("HTTP_PROXY"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if os.Getenv("HTTPS_PROXY") != "" && !isGitNoProxy(cloneOptions.URL) {
|
if os.Getenv("HTTPS_PROXY") != "" && !isGitNoProxy(cloneOptions.URL) {
|
||||||
cloneOptions.ProxyOptions = gitProxy.ProxyOptions{
|
cloneOptions.ProxyOptions = gitProxy.ProxyOptions{
|
||||||
URL: os.Getenv("HTTPS_PROXY"),
|
URL: os.Getenv("HTTPS_PROXY"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cloneOptions
|
return cloneOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNewUser(username, password, role, apikey string, org shuffle.OrgMini) error {
|
func createNewUser(username, password, role, apikey string, org shuffle.OrgMini) error {
|
||||||
@@ -559,7 +558,6 @@ func createNewUser(username, password, role, apikey string, org shuffle.OrgMini)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -663,7 +661,7 @@ func handleRegister(resp http.ResponseWriter, request *http.Request) {
|
|||||||
Name: newOrg.Name,
|
Name: newOrg.Name,
|
||||||
}
|
}
|
||||||
|
|
||||||
user.ActiveOrg = currentOrg
|
user.ActiveOrg = currentOrg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -932,7 +930,6 @@ func handleInfo(resp http.ResponseWriter, request *http.Request) {
|
|||||||
log.Printf("[DEBUG] Failed to get org during getinfo: %s", err)
|
log.Printf("[DEBUG] Failed to get org during getinfo: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//if err == nil {
|
//if err == nil {
|
||||||
if len(org.Id) > 0 {
|
if len(org.Id) > 0 {
|
||||||
if userInfo.Role == "" {
|
if userInfo.Role == "" {
|
||||||
@@ -1069,9 +1066,9 @@ func handleInfo(resp http.ResponseWriter, request *http.Request) {
|
|||||||
ChatDisabled: chatDisabled,
|
ChatDisabled: chatDisabled,
|
||||||
Tutorials: tutorialsFinished,
|
Tutorials: tutorialsFinished,
|
||||||
|
|
||||||
Interests: orgInterests,
|
Interests: orgInterests,
|
||||||
Priorities: orgPriorities,
|
Priorities: orgPriorities,
|
||||||
Licensed: licensed,
|
Licensed: licensed,
|
||||||
}
|
}
|
||||||
|
|
||||||
returnData, err := json.Marshal(returnValue)
|
returnData, err := json.Marshal(returnValue)
|
||||||
@@ -1092,7 +1089,6 @@ type passwordReset struct {
|
|||||||
Reference string `json:"reference"`
|
Reference string `json:"reference"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func checkAdminLogin(resp http.ResponseWriter, request *http.Request) {
|
func checkAdminLogin(resp http.ResponseWriter, request *http.Request) {
|
||||||
cors := shuffle.HandleCors(resp, request)
|
cors := shuffle.HandleCors(resp, request)
|
||||||
if cors {
|
if cors {
|
||||||
@@ -3338,7 +3334,6 @@ func buildSwaggerApp(resp http.ResponseWriter, body []byte, user shuffle.User, s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log.Printf("[DEBUG] Successfully built app %s (%s)", api.Name, api.ID)
|
log.Printf("[DEBUG] Successfully built app %s (%s)", api.Name, api.ID)
|
||||||
if len(user.Id) > 0 {
|
if len(user.Id) > 0 {
|
||||||
resp.WriteHeader(200)
|
resp.WriteHeader(200)
|
||||||
@@ -3379,8 +3374,6 @@ func verifySwagger(resp http.ResponseWriter, request *http.Request) {
|
|||||||
buildSwaggerApp(resp, body, user, false)
|
buildSwaggerApp(resp, body, user, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Hotloads new apps from a folder
|
// Hotloads new apps from a folder
|
||||||
func handleAppHotload(ctx context.Context, location string, forceUpdate bool) error {
|
func handleAppHotload(ctx context.Context, location string, forceUpdate bool) error {
|
||||||
|
|
||||||
@@ -3727,7 +3720,6 @@ func remoteOrgJobController(org shuffle.Org, body []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func remoteOrgJobHandler(org shuffle.Org, interval int) error {
|
func remoteOrgJobHandler(org shuffle.Org, interval int) error {
|
||||||
|
|
||||||
// Check if it's 1 in 10 (10% chance random)
|
// Check if it's 1 in 10 (10% chance random)
|
||||||
@@ -3777,7 +3769,6 @@ func remoteOrgJobHandler(org shuffle.Org, interval int) error {
|
|||||||
backupJobData = []byte{}
|
backupJobData = []byte{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
syncUrl := fmt.Sprintf("%s/api/v1/cloud/sync", syncUrl)
|
syncUrl := fmt.Sprintf("%s/api/v1/cloud/sync", syncUrl)
|
||||||
client := shuffle.GetExternalClient(syncUrl)
|
client := shuffle.GetExternalClient(syncUrl)
|
||||||
req, err := http.NewRequest(
|
req, err := http.NewRequest(
|
||||||
@@ -4275,7 +4266,7 @@ func runInitEs(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cloneOptions = checkGitProxy(cloneOptions)
|
cloneOptions = checkGitProxy(cloneOptions)
|
||||||
|
|
||||||
branch := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_BRANCH")
|
branch := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_BRANCH")
|
||||||
if len(branch) > 0 && branch != "master" && branch != "main" {
|
if len(branch) > 0 && branch != "master" && branch != "main" {
|
||||||
@@ -4322,7 +4313,7 @@ func runInitEs(ctx context.Context) {
|
|||||||
URL: apis,
|
URL: apis,
|
||||||
}
|
}
|
||||||
|
|
||||||
cloneOptions = checkGitProxy(cloneOptions)
|
cloneOptions = checkGitProxy(cloneOptions)
|
||||||
|
|
||||||
_, err = git.Clone(storer, fs, cloneOptions)
|
_, err = git.Clone(storer, fs, cloneOptions)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -4340,7 +4331,6 @@ func runInitEs(ctx context.Context) {
|
|||||||
log.Printf("[INFO] Skipping download of extra API samples as %d were found", len(workflowapps))
|
log.Printf("[INFO] Skipping download of extra API samples as %d were found", len(workflowapps))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if os.Getenv("SHUFFLE_HEALTHCHECK_DISABLED") != "true" {
|
if os.Getenv("SHUFFLE_HEALTHCHECK_DISABLED") != "true" {
|
||||||
healthcheckInterval := 30
|
healthcheckInterval := 30
|
||||||
log.Printf("[INFO] Starting healthcheck job every %d minute. Stats available on /api/v1/health/stats. Disable with SHUFFLE_HEALTHCHECK_DISABLED=true", healthcheckInterval)
|
log.Printf("[INFO] Starting healthcheck job every %d minute. Stats available on /api/v1/health/stats. Disable with SHUFFLE_HEALTHCHECK_DISABLED=true", healthcheckInterval)
|
||||||
@@ -4350,7 +4340,7 @@ func runInitEs(ctx context.Context) {
|
|||||||
|
|
||||||
request := http.Request{}
|
request := http.Request{}
|
||||||
// Add the "force=true" query to the fake request
|
// Add the "force=true" query to the fake request
|
||||||
request.URL, err = url.Parse("/api/v1/health/stats?force=true")
|
request.URL, err = url.Parse("/api/v1/health/stats?force=true")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("[ERROR] Failed to parse test url for healthstats: %s", err)
|
log.Printf("[ERROR] Failed to parse test url for healthstats: %s", err)
|
||||||
}
|
}
|
||||||
@@ -4369,7 +4359,6 @@ func runInitEs(ctx context.Context) {
|
|||||||
log.Printf("[INFO] Finished INIT (ES)")
|
log.Printf("[INFO] Finished INIT (ES)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func handleVerifyCloudsync(orgId string) (shuffle.SyncFeatures, error) {
|
func handleVerifyCloudsync(orgId string) (shuffle.SyncFeatures, error) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
org, err := shuffle.GetOrg(ctx, orgId)
|
org, err := shuffle.GetOrg(ctx, orgId)
|
||||||
@@ -4948,8 +4937,6 @@ func makeWorkflowPublic(resp http.ResponseWriter, request *http.Request) {
|
|||||||
resp.Write([]byte(fmt.Sprintf(`{"success": true}`)))
|
resp.Write([]byte(fmt.Sprintf(`{"success": true}`)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func handleAppZipUpload(resp http.ResponseWriter, request *http.Request) {
|
func handleAppZipUpload(resp http.ResponseWriter, request *http.Request) {
|
||||||
cors := shuffle.HandleCors(resp, request)
|
cors := shuffle.HandleCors(resp, request)
|
||||||
if cors {
|
if cors {
|
||||||
@@ -5008,8 +4995,6 @@ func handleAppZipUpload(resp http.ResponseWriter, request *http.Request) {
|
|||||||
resp.Write([]byte("OK"))
|
resp.Write([]byte("OK"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func initHandlers() {
|
func initHandlers() {
|
||||||
var err error
|
var err error
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
@@ -5056,7 +5041,7 @@ func initHandlers() {
|
|||||||
r.HandleFunc("/api/v1/users/register", handleRegister).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/users/register", handleRegister).Methods("POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/users/checkusers", checkAdminLogin).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/users/checkusers", checkAdminLogin).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/users/getinfo", handleInfo).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/users/getinfo", handleInfo).Methods("GET", "OPTIONS")
|
||||||
|
r.HandleFunc("/api/v1/users/{userId}/apps", shuffle.HandleGetUserApps).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/users/apps", shuffle.HandleGetUserApps).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/users/apps", shuffle.HandleGetUserApps).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/users/generateapikey", shuffle.HandleApiGeneration).Methods("GET", "POST", "OPTIONS")
|
r.HandleFunc("/api/v1/users/generateapikey", shuffle.HandleApiGeneration).Methods("GET", "POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/users/logout", shuffle.HandleLogout).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/users/logout", shuffle.HandleLogout).Methods("POST", "OPTIONS")
|
||||||
@@ -5192,7 +5177,7 @@ func initHandlers() {
|
|||||||
r.HandleFunc("/api/v1/triggers/gmail/register", shuffle.HandleNewGmailRegister).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/triggers/gmail/register", shuffle.HandleNewGmailRegister).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/triggers/gmail/getFolders", shuffle.HandleGetGmailFolders).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/triggers/gmail/getFolders", shuffle.HandleGetGmailFolders).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/triggers/pipeline", shuffle.HandleNewPipelineRegister).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/triggers/pipeline", shuffle.HandleNewPipelineRegister).Methods("POST", "OPTIONS")
|
||||||
//r.HandleFunc("/api/v1/triggers/pipeline/save", shuffle.HandleSavePipelineInfo).Methods("PUT", "OPTIONS")
|
//r.HandleFunc("/api/v1/triggers/pipeline/save", shuffle.HandleSavePipelineInfo).Methods("PUT", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/pipelines/{key}", handlePipelineCallback).Methods("POST", "GET", "PATCH", "PUT", "DELETE", "OPTIONS")
|
r.HandleFunc("/api/v1/pipelines/{key}", handlePipelineCallback).Methods("POST", "GET", "PATCH", "PUT", "DELETE", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/triggers", shuffle.HandleGetTriggers).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/triggers", shuffle.HandleGetTriggers).Methods("GET", "OPTIONS")
|
||||||
//r.HandleFunc("/api/v1/triggers/gmail/routing", handleGmailRouting).Methods("POST", "OPTIONS")
|
//r.HandleFunc("/api/v1/triggers/gmail/routing", handleGmailRouting).Methods("POST", "OPTIONS")
|
||||||
@@ -5244,7 +5229,6 @@ func initHandlers() {
|
|||||||
r.HandleFunc("/api/v1/orgs/{orgId}/datastore", shuffle.HandleSetCacheKey).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/orgs/{orgId}/datastore", shuffle.HandleSetCacheKey).Methods("POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/orgs/{orgId}/datastore/{cache_key}", shuffle.HandleDeleteCacheKey).Methods("DELETE", "OPTIONS")
|
r.HandleFunc("/api/v1/orgs/{orgId}/datastore/{cache_key}", shuffle.HandleDeleteCacheKey).Methods("DELETE", "OPTIONS")
|
||||||
|
|
||||||
|
|
||||||
// Docker orborus specific - downloads an image
|
// Docker orborus specific - downloads an image
|
||||||
r.HandleFunc("/api/v1/get_docker_image", getDockerImage).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/get_docker_image", getDockerImage).Methods("POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/login_sso", shuffle.HandleSSO).Methods("GET", "POST", "OPTIONS")
|
r.HandleFunc("/api/v1/login_sso", shuffle.HandleSSO).Methods("GET", "POST", "OPTIONS")
|
||||||
@@ -5266,15 +5250,14 @@ func initHandlers() {
|
|||||||
// This structure is horrendous. Needs fixing after we got the prototype up
|
// This structure is horrendous. Needs fixing after we got the prototype up
|
||||||
r.HandleFunc("/api/v1/detections/{detectionType}/connect", shuffle.HandleDetectionAutoConnect).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/detections/{detectionType}/connect", shuffle.HandleDetectionAutoConnect).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/detections/{detection_type}", shuffle.HandleGetDetectionRules).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/detections/{detection_type}", shuffle.HandleGetDetectionRules).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/detections/{triggerId}/selected_rules", shuffle.HandleGetSelectedRules).Methods("GET","OPTIONS")
|
r.HandleFunc("/api/v1/detections/{triggerId}/selected_rules", shuffle.HandleGetSelectedRules).Methods("GET", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/detections/{triggerId}/selected_rules/save", shuffle.HandleSaveSelectedRules).Methods("POST","OPTIONS")
|
r.HandleFunc("/api/v1/detections/{triggerId}/selected_rules/save", shuffle.HandleSaveSelectedRules).Methods("POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/detections/{action}", shuffle.HandleFolderToggle).Methods("PUT", "OPTIONS")
|
r.HandleFunc("/api/v1/detections/{action}", shuffle.HandleFolderToggle).Methods("PUT", "OPTIONS")
|
||||||
|
|
||||||
// This is weird.
|
// This is weird.
|
||||||
r.HandleFunc("/api/v1/detections/{fileId}/{action}", shuffle.HandleToggleRule).Methods("PUT", "OPTIONS")
|
r.HandleFunc("/api/v1/detections/{fileId}/{action}", shuffle.HandleToggleRule).Methods("PUT", "OPTIONS")
|
||||||
//r.HandleFunc("/api/v1/detections/siem/node_health", shuffle.HandleTenzirHealthUpdate).Methods("POST","OPTIONS")
|
//r.HandleFunc("/api/v1/detections/siem/node_health", shuffle.HandleTenzirHealthUpdate).Methods("POST","OPTIONS")
|
||||||
|
|
||||||
|
|
||||||
// Introduced in 0.9.21 to handle notifications for e.g. failed Workflow
|
// Introduced in 0.9.21 to handle notifications for e.g. failed Workflow
|
||||||
r.HandleFunc("/api/v1/notifications", shuffle.HandleCreateNotification).Methods("POST", "OPTIONS")
|
r.HandleFunc("/api/v1/notifications", shuffle.HandleCreateNotification).Methods("POST", "OPTIONS")
|
||||||
r.HandleFunc("/api/v1/notifications", shuffle.HandleGetNotifications).Methods("GET", "OPTIONS")
|
r.HandleFunc("/api/v1/notifications", shuffle.HandleGetNotifications).Methods("GET", "OPTIONS")
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import HealthPage from "./components/HealthPage.jsx";
|
|||||||
//import Header from "./components/Header.jsx";
|
//import Header from "./components/Header.jsx";
|
||||||
import theme from "./theme";
|
import theme from "./theme";
|
||||||
import Apps from "./views/Apps";
|
import Apps from "./views/Apps";
|
||||||
|
import Apps2 from "./views/Apps2.jsx";
|
||||||
import AppCreator from "./views/AppCreator";
|
import AppCreator from "./views/AppCreator";
|
||||||
import DetectionDashBoard from "./views/DetectionDashboard.jsx";
|
import DetectionDashBoard from "./views/DetectionDashboard.jsx";
|
||||||
|
|
||||||
@@ -408,6 +409,23 @@ const App = (message, props) => {
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
exact
|
||||||
|
path="/apps2"
|
||||||
|
element={
|
||||||
|
<Apps2
|
||||||
|
serverside={false}
|
||||||
|
isLoaded={isLoaded}
|
||||||
|
isLoggedIn={isLoggedIn}
|
||||||
|
checkLogin={checkLogin}
|
||||||
|
userdata={userdata}
|
||||||
|
globalUrl={globalUrl}
|
||||||
|
surfaceColor={theme.palette.surfaceColor}
|
||||||
|
inputColor={theme.palette.inputColor}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<Route
|
<Route
|
||||||
exact
|
exact
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ const AppSelection = props => {
|
|||||||
defaultSearch,
|
defaultSearch,
|
||||||
setDefaultSearch,
|
setDefaultSearch,
|
||||||
checkLogin,
|
checkLogin,
|
||||||
|
isAppPage=false
|
||||||
|
|
||||||
} = props;
|
} = props;
|
||||||
const [discoveryData, setDiscoveryData] = React.useState({})
|
const [discoveryData, setDiscoveryData] = React.useState({})
|
||||||
@@ -507,26 +508,31 @@ const AppSelection = props => {
|
|||||||
})}
|
})}
|
||||||
</Grid>
|
</Grid>
|
||||||
</div>
|
</div>
|
||||||
{!moreButton ? (
|
{
|
||||||
<div style={{ width: "100%", marginLeft: isMobile ? 80 : 200, marginBottom: 20, textAlign: isMobile ? "center" : null }}>
|
!isAppPage && (
|
||||||
<Link style={{ color: "#FF8444" }} onClick={() => {
|
<>
|
||||||
|
{!moreButton ? (
|
||||||
|
<div style={{ width: "100%", marginLeft: isMobile ? 80 : 200, marginBottom: 20, textAlign: isMobile ? "center" : null }}>
|
||||||
|
<Link style={{ color: "#FF8444" }} onClick={() => {
|
||||||
setMoreButton(true)
|
setMoreButton(true)
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
navigate("/welcome?tab=2")
|
navigate("/welcome?tab=2")
|
||||||
}, 250)
|
}, 250)
|
||||||
}}
|
}}
|
||||||
>See More Apps</Link>
|
>See More Apps</Link>
|
||||||
</div>) : ""}
|
</div>) : ""}
|
||||||
|
|
||||||
<div style={{ flexDirection: "row", width: isMobile ? 340 : null, textAlign: isMobile ? "center" : null }}>
|
<div style={{ flexDirection: "row", width: isMobile ? 340 : null, textAlign: isMobile ? "center" : null }}>
|
||||||
<Button variant="contained" type="submit" fullWidth style={bottomButtonStyle} onClick={() => {
|
<Button variant="contained" type="submit" fullWidth style={bottomButtonStyle} onClick={() => {
|
||||||
navigate("/usecases2")
|
navigate("/usecases2")
|
||||||
setActiveStep(2)
|
setActiveStep(2)
|
||||||
}}>
|
}}>
|
||||||
See usecases
|
See usecases
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</Fade>
|
</Fade>
|
||||||
)
|
)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user