diff --git a/.env b/.env index 397e67bf..86a2b1f1 100644 --- a/.env +++ b/.env @@ -3,9 +3,10 @@ ORG_ID=Shuffle ENVIRONMENT_NAME=Shuffle # Remote github config for first load +SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION= +SHUFFLE_DOWNLOAD_AUTH_USERNAME= +SHUFFLE_DOWNLOAD_AUTH_PASSWORD= APP_DOWNLOAD_LOCATION=https://github.com/frikky/shuffle-apps -APP_DOWNLOAD_AUTH_USERNAME= -APP_DOWNLOAD_AUTH_PASSWORD= # User config for first load. Username & PW: min length 3 SHUFFLE_DEFAULT_USERNAME= diff --git a/backend/go-app/main.go b/backend/go-app/main.go index 2560b69d..e44fba65 100644 --- a/backend/go-app/main.go +++ b/backend/go-app/main.go @@ -6327,8 +6327,8 @@ func runInit(ctx context.Context) { url = "https://github.com/frikky/shuffle-apps" } - username := os.Getenv("APP_DOWNLOAD_AUTH_USERNAME") - password := os.Getenv("APP_DOWNLOAD_AUTH_PASSWORD") + username := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_USERNAME") + password := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_PASSWORD") cloneOptions := &git.CloneOptions{ URL: url, } @@ -6388,6 +6388,30 @@ func runInit(ctx context.Context) { log.Printf("Finished downloading extra API samples") } + workflowLocation := os.Getenv("SHUFFLE_DOWNLOAD_WORKFLOW_LOCATION") + if len(workflowLocation) > 0 { + log.Printf("Downloading WORKFLOWS from %s if no workflows - EXTRA workflows", workflowLocation) + q := datastore.NewQuery("workflow") + var workflows []Workflow + _, err = dbclient.GetAll(ctx, q, &workflows) + if err != nil { + log.Printf("Error getting workflows: %s", err) + } else { + if len(workflows) == 0 { + username := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_USERNAME") + password := os.Getenv("SHUFFLE_DOWNLOAD_AUTH_PASSWORD") + err = loadGithubWorkflows(workflowLocation, username, password, "") + if err != nil { + log.Printf("Failed to upload workflows from github: %s", err) + } else { + log.Printf("Finished downloading workflows from github!") + } + } else { + log.Printf("Skipping because there are %d workflows already", len(workflows)) + } + + } + } log.Printf("Finished INIT") } diff --git a/backend/go-app/walkoff.go b/backend/go-app/walkoff.go index d6b3ff9f..7322ded4 100644 --- a/backend/go-app/walkoff.go +++ b/backend/go-app/walkoff.go @@ -1121,6 +1121,10 @@ func getWorkflows(resp http.ResponseWriter, request *http.Request) { // With user, do a search for workflows with user or user's org attached q := datastore.NewQuery("workflow").Filter("owner =", user.Id) + if user.Role == "admin" { + q = datastore.NewQuery("workflow") + } + var workflows []Workflow _, err = dbclient.GetAll(ctx, q, &workflows) if err != nil { @@ -4045,6 +4049,62 @@ func deployWebhookFunction(ctx context.Context, name, localization, applocation return nil } +func loadGithubWorkflows(url, username, password, userId string) error { + fs := memfs.New() + + if strings.Contains(url, "github") || strings.Contains(url, "gitlab") || strings.Contains(url, "bitbucket") { + cloneOptions := &git.CloneOptions{ + URL: url, + } + + // FIXME: Better auth. + if len(username) > 0 && len(password) > 0 { + cloneOptions.Auth = &http2.BasicAuth{ + + Username: username, + Password: password, + } + } + + storer := memory.NewStorage() + r, err := git.Clone(storer, fs, cloneOptions) + if err != nil { + log.Printf("Failed loading repo into memory: %s", err) + return err + } + + dir, err := fs.ReadDir("/") + if err != nil { + log.Printf("FAiled reading folder: %s", err) + } + _ = r + + log.Printf("Starting workflow folder iteration") + iterateWorkflowGithubFolders(fs, dir, "", "", userId) + + } else if strings.Contains(url, "s3") { + //https://docs.aws.amazon.com/sdk-for-go/api/service/s3/ + + //sess := session.Must(session.NewSession()) + //downloader := s3manager.NewDownloader(sess) + + //// Write the contents of S3 Object to the file + //storer := memory.NewStorage() + //n, err := downloader.Download(storer, &s3.GetObjectInput{ + // Bucket: aws.String(myBucket), + // Key: aws.String(myString), + //}) + //if err != nil { + // return fmt.Errorf("failed to download file, %v", err) + //} + //fmt.Printf("file downloaded, %d bytes\n", n) + } else { + return errors.New(fmt.Sprintf("URL %s is unsupported when downloading workflows", url)) + } + + return nil +} + func loadSpecificWorkflows(resp http.ResponseWriter, request *http.Request) { cors := handleCors(resp, request) if cors { @@ -4064,7 +4124,7 @@ func loadSpecificWorkflows(resp http.ResponseWriter, request *http.Request) { if user.Role != "admin" { log.Printf("Wrong user (%s) when downloading from github", user.Username) resp.WriteHeader(401) - resp.Write([]byte(`{"success": false}`)) + resp.Write([]byte(`{"success": false, "reason": "Downloading remotely requires admin"}`)) return } @@ -4093,59 +4153,11 @@ func loadSpecificWorkflows(resp http.ResponseWriter, request *http.Request) { return } - fs := memfs.New() - - if strings.Contains(tmpBody.URL, "github") || strings.Contains(tmpBody.URL, "gitlab") || strings.Contains(tmpBody.URL, "bitbucket") { - cloneOptions := &git.CloneOptions{ - URL: tmpBody.URL, - } - - // FIXME: Better auth. - if len(tmpBody.Field1) > 0 && len(tmpBody.Field2) > 0 { - cloneOptions.Auth = &http2.BasicAuth{ - - Username: tmpBody.Field1, - Password: tmpBody.Field2, - } - } - - storer := memory.NewStorage() - r, err := git.Clone(storer, fs, cloneOptions) - if err != nil { - log.Printf("Failed loading repo into memory: %s", err) - resp.WriteHeader(401) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err))) - return - } - - dir, err := fs.ReadDir("/") - if err != nil { - log.Printf("FAiled reading folder: %s", err) - } - _ = r - - log.Printf("Starting workflow folder iteration") - iterateWorkflowGithubFolders(fs, dir, "", "", user.Id) - - } else if strings.Contains(tmpBody.URL, "s3") { - //https://docs.aws.amazon.com/sdk-for-go/api/service/s3/ - - //sess := session.Must(session.NewSession()) - //downloader := s3manager.NewDownloader(sess) - - //// Write the contents of S3 Object to the file - //storer := memory.NewStorage() - //n, err := downloader.Download(storer, &s3.GetObjectInput{ - // Bucket: aws.String(myBucket), - // Key: aws.String(myString), - //}) - //if err != nil { - // return fmt.Errorf("failed to download file, %v", err) - //} - //fmt.Printf("file downloaded, %d bytes\n", n) - } else { + err = loadGithubWorkflows(tmpBody.URL, tmpBody.Field1, tmpBody.Field2, user.Id) + if err != nil { + log.Printf("Failed to update workflows: %s", err) resp.WriteHeader(401) - resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s is unsupported. Try e.g. github"}`, tmpBody.URL))) + resp.Write([]byte(`{"success": false}`)) return } @@ -4489,7 +4501,7 @@ func iterateWorkflowGithubFolders(fs billy.Filesystem, dir []os.FileInfo, extra log.Printf("Failed setting (download) workflow: %s", err) continue } - log.Printf("Uploaded workflow %s!", filename) + log.Printf("Uploaded workflow %s for user %s!", filename, userId) } } } diff --git a/frontend/src/views/Admin.jsx b/frontend/src/views/Admin.jsx index 2707d140..03a53575 100644 --- a/frontend/src/views/Admin.jsx +++ b/frontend/src/views/Admin.jsx @@ -129,7 +129,8 @@ const Admin = (props) => { if (responseJson["success"] === false) { alert.error("Failed setting new password") } else { - alert.success("Changed password!") + alert.success("Successfully password!") + setSelectedUserModalOpen(false) } }), )