From 19dc76d94bf7dbca125c249ddf46428f45cd9eb6 Mon Sep 17 00:00:00 2001 From: Brian Gann Date: Tue, 1 Oct 2024 23:30:33 -0400 Subject: [PATCH] fix: bypass login for oauth is not reliables (#148) * update ci * enable page load parameter as argument * add sleeps between bypass steps --- .github/workflows/ci.yml | 26 +++++++++++++++++++++----- pkg/cmd/grafana-kiosk/main.go | 4 ++++ pkg/kiosk/local_login.go | 27 ++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad9d203..2844bcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,19 +25,18 @@ jobs: run: go get . - name: Install golangci-lint - uses: golangci/golangci-lint-action@v4 + uses: golangci/golangci-lint-action@v6 with: version: latest args: --exclude-use-default skip-cache: true - skip-pkg-cache: true - name: Run Gosec Security Scanner uses: securego/gosec@master with: args: ./... - - name: Branch name + - name: Get BRANCH, NAME, TAG id: branch_name run: | echo "SOURCE_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT @@ -50,8 +49,25 @@ jobs: version: latest args: -v build:ci + - name: Get PR + uses: jwalton/gh-find-current-pr@master + id: findPr + with: + state: open + + - name: Archive Build + uses: actions/upload-artifact@v4 + if: success() && steps.findPr.outputs.number + env: + PR: ${{ steps.findPr.outputs.pr }} + with: + name: grafana-kiosk-pr-${{env.PR}} + path: bin + overwrite: true + retention-days: 7 + - name: Upload Code Climate Report - uses: paambaati/codeclimate-action@v5.0.0 + uses: paambaati/codeclimate-action@v9 env: CC_TEST_REPORTER_ID: ${{secrets.CC_TEST_REPORTER_ID}} with: @@ -95,7 +111,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} if: startsWith(github.ref, 'refs/tags/v') with: - draft: true + prerelease: true generate_release_notes: true files: | ./grafana-kiosk-v*/** diff --git a/pkg/cmd/grafana-kiosk/main.go b/pkg/cmd/grafana-kiosk/main.go index 7a81ce2..3808ba3 100644 --- a/pkg/cmd/grafana-kiosk/main.go +++ b/pkg/cmd/grafana-kiosk/main.go @@ -35,6 +35,7 @@ type Args struct { LoginMethod string URL string Username string + PageLoadDelayMS int64 Password string UsernameField string PasswordField string @@ -58,6 +59,7 @@ func ProcessArgs(cfg interface{}) Args { flagSettings.StringVar(&processedArgs.WindowPosition, "window-position", "0,0", "Top Left Position of Kiosk") flagSettings.StringVar(&processedArgs.WindowSize, "window-size", "", "Size of Kiosk in pixels (width,height)") flagSettings.StringVar(&processedArgs.ScaleFactor, "scale-factor", "1.0", "Scale factor, sort of zoom") + flagSettings.Int64Var(&processedArgs.PageLoadDelayMS, "page-load-delay-ms", 2000, "Delay in milliseconds before navigating to URL") flagSettings.BoolVar(&processedArgs.IsPlayList, "playlists", false, "URL is a playlist") flagSettings.BoolVar(&processedArgs.AutoFit, "autofit", true, "Fit panels to screen") flagSettings.BoolVar(&processedArgs.LXDEEnabled, "lxde", false, "Initialize LXDE for kiosk mode") @@ -125,6 +127,7 @@ func summary(cfg *kiosk.Config) { log.Println("WindowPosition:", cfg.General.WindowPosition) log.Println("WindowSize:", cfg.General.WindowSize) log.Println("ScaleFactor:", cfg.General.ScaleFactor) + log.Println("PageLoadDelayMS:", cfg.General.PageLoadDelayMS) // target log.Println("URL:", cfg.Target.URL) log.Println("LoginMethod:", cfg.Target.LoginMethod) @@ -186,6 +189,7 @@ func main() { cfg.General.WindowPosition = args.WindowPosition cfg.General.WindowSize = args.WindowSize cfg.General.ScaleFactor = args.ScaleFactor + cfg.General.PageLoadDelayMS = args.PageLoadDelayMS // cfg.GoAuth.AutoLogin = args.OauthAutoLogin cfg.GoAuth.UsernameField = args.UsernameField diff --git a/pkg/kiosk/local_login.go b/pkg/kiosk/local_login.go index 2951c66..e7bfcee 100644 --- a/pkg/kiosk/local_login.go +++ b/pkg/kiosk/local_login.go @@ -57,21 +57,46 @@ func GrafanaKioskLocal(cfg *Config, messages chan string) { baseURL := cfg.Target.URL[:endIndex] bypassURL := baseURL + "/login/local" - log.Println("Bypassing Azure AD autoLogin at ", bypassURL) + log.Println("Bypassing autoLogin using URL ", bypassURL) if err := chromedp.Run(taskCtx, chromedp.Navigate(bypassURL), + chromedp.ActionFunc(func(context.Context) error { + log.Printf("Sleeping %d MS before checking for login fields", cfg.General.PageLoadDelayMS) + time.Sleep(time.Duration(cfg.General.PageLoadDelayMS) * time.Millisecond) + return nil + }), chromedp.WaitVisible(`//input[@name="user"]`, chromedp.BySearch), chromedp.SendKeys(`//input[@name="user"]`, cfg.Target.Username, chromedp.BySearch), chromedp.SendKeys(`//input[@name="password"]`, cfg.Target.Password+kb.Enter, chromedp.BySearch), + chromedp.ActionFunc(func(context.Context) error { + log.Printf("Sleeping %d MS before checking for topnav", cfg.General.PageLoadDelayMS) + time.Sleep(time.Duration(cfg.General.PageLoadDelayMS) * time.Millisecond) + return nil + }), chromedp.WaitVisible(`//img[@alt="User avatar"]`, chromedp.BySearch), + chromedp.ActionFunc(func(context.Context) error { + log.Printf("Sleeping %d MS before navigating to final url", cfg.General.PageLoadDelayMS) + time.Sleep(time.Duration(cfg.General.PageLoadDelayMS) * time.Millisecond) + return nil + }), chromedp.Navigate(generatedURL), ); err != nil { panic(err) } } else { if err := chromedp.Run(taskCtx, + chromedp.ActionFunc(func(context.Context) error { + log.Printf("Sleeping %d MS before navigating to final url", cfg.General.PageLoadDelayMS) + time.Sleep(time.Duration(cfg.General.PageLoadDelayMS) * time.Millisecond) + return nil + }), chromedp.Navigate(generatedURL), + chromedp.ActionFunc(func(context.Context) error { + log.Printf("Sleeping %d MS before checking for login fields", cfg.General.PageLoadDelayMS) + time.Sleep(time.Duration(cfg.General.PageLoadDelayMS) * time.Millisecond) + return nil + }), chromedp.WaitVisible(`//input[@name="user"]`, chromedp.BySearch), chromedp.SendKeys(`//input[@name="user"]`, cfg.Target.Username, chromedp.BySearch), chromedp.SendKeys(`//input[@name="password"]`, cfg.Target.Password+kb.Enter, chromedp.BySearch),