summaryrefslogtreecommitdiff
path: root/pkg/gui/authenticationview.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/authenticationview.go')
-rw-r--r--pkg/gui/authenticationview.go165
1 files changed, 165 insertions, 0 deletions
diff --git a/pkg/gui/authenticationview.go b/pkg/gui/authenticationview.go
new file mode 100644
index 0000000..240b46c
--- /dev/null
+++ b/pkg/gui/authenticationview.go
@@ -0,0 +1,165 @@
+package gui
+
+import (
+ "fmt"
+ "github.com/isacikgoz/gitbatch/pkg/git"
+ "github.com/jroimartin/gocui"
+ log "github.com/sirupsen/logrus"
+)
+
+var (
+ authenticationReturnView string
+ authenticationViewFeature = viewFeature{Name: "authentication", Title: " Authentication "}
+ authUserFeature = viewFeature{Name: "authuser", Title: " User "}
+ authPasswordViewFeature = viewFeature{Name: "authpasswd", Title: " Password "}
+ authUserLabelFeature = viewFeature{Name: "authuserlabel", Title: " User: "}
+ authPswdLabelViewFeature = viewFeature{Name: "authpasswdlabel", Title: " Password: "}
+
+ authViews = []viewFeature{authUserFeature, authPasswordViewFeature}
+ authLabels = []viewFeature{authenticationViewFeature, authUserLabelFeature, authPswdLabelViewFeature}
+
+ jobRequiresAuth *git.Job
+)
+
+// open an error view to inform user with a message and a useful note
+func (gui *Gui) openAuthenticationView(g *gocui.Gui, jobQueue *git.JobQueue, job *git.Job, returnViewName string) error {
+ maxX, maxY := g.Size()
+ // lets remove this job from the queue so that it won't block anything
+ // also it is already unsuccessfully finished
+ jobRequiresAuth = job
+ if job.Entity.State != git.Fail {
+ if err := jobQueue.RemoveFromQueue(job.Entity); err != nil {
+ log.Fatal(err.Error())
+ return err
+ }
+ }
+
+ authenticationReturnView = returnViewName
+ v, err := g.SetView(authenticationViewFeature.Name, maxX/2-30, maxY/2-2, maxX/2+30, maxY/2+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ fmt.Fprintln(v, " Enter credentials for: "+red.Sprint(job.Entity.Remote.URL[0]))
+ }
+ g.Cursor = true
+ if err := gui.openUserView(g); err != nil {
+ return nil
+ }
+ if err := gui.openPasswordView(g); err != nil {
+ return nil
+ }
+ return nil
+}
+
+// close the opened error view
+func (gui *Gui) closeAuthenticationView(g *gocui.Gui, v *gocui.View) error {
+ g.Cursor = false
+ for _, vf := range authLabels {
+ if err := g.DeleteView(vf.Name); err != nil {
+ return nil
+ }
+ }
+ for _, vf := range authViews {
+ if err := g.DeleteView(vf.Name); err != nil {
+ return nil
+ }
+ }
+ if _, err := g.SetCurrentView(authenticationReturnView); err != nil {
+ return err
+ }
+ gui.updateKeyBindingsView(g, authenticationReturnView)
+ return nil
+}
+
+// close the opened error view
+func (gui *Gui) submitAuthenticationView(g *gocui.Gui, v *gocui.View) error {
+ g.Cursor = false
+ v_user, err := g.View(authUserFeature.Name)
+ v_pswd, err := g.View(authPasswordViewFeature.Name)
+ creduser := v_user.ViewBuffer()
+ credpswd := v_pswd.ViewBuffer()
+ // Maybe pause implementation can be added
+ switch mode := jobRequiresAuth.JobType; mode {
+ case git.FetchJob:
+ jobRequiresAuth.Options = git.FetchOptions{
+ RemoteName: jobRequiresAuth.Entity.Remote.Name,
+ Credentials: git.Credentials{
+ User: creduser,
+ Password: credpswd,
+ },
+ }
+ }
+ err = gui.State.Queue.AddJob(jobRequiresAuth)
+ if err != nil {
+ return err
+ }
+ jobRequiresAuth.Entity.State = git.Queued
+ gui.refreshMain(g)
+ gui.refreshViews(g, jobRequiresAuth.Entity)
+ gui.closeAuthenticationView(g, v)
+ return nil
+}
+
+// open an error view to inform user with a message and a useful note
+func (gui *Gui) openUserView(g *gocui.Gui) error {
+ maxX, maxY := g.Size()
+ vlabel, err := g.SetView(authUserLabelFeature.Name, maxX/2-30, maxY/2-1, maxX/2-19, maxY/2+1)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ fmt.Fprintln(vlabel, authUserLabelFeature.Title)
+ vlabel.Frame = false
+ }
+ v, err := g.SetView(authUserFeature.Name, maxX/2-18, maxY/2-1, maxX/2+29, maxY/2+1)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Title = authUserFeature.Title
+ v.Editable = true
+ v.Frame = false
+ }
+ gui.updateKeyBindingsView(g, authUserFeature.Name)
+ if _, err := g.SetCurrentView(authUserFeature.Name); err != nil {
+ return err
+ }
+ return nil
+}
+
+// open an error view to inform user with a message and a useful note
+func (gui *Gui) openPasswordView(g *gocui.Gui) error {
+ maxX, maxY := g.Size()
+ vlabel, err := g.SetView(authPswdLabelViewFeature.Name, maxX/2-30, maxY/2, maxX/2-19, maxY/2+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ fmt.Fprintln(vlabel, authPswdLabelViewFeature.Title)
+ vlabel.Frame = false
+ }
+ v, err := g.SetView(authPasswordViewFeature.Name, maxX/2-18, maxY/2, maxX/2+29, maxY/2+2)
+ if err != nil {
+ if err != gocui.ErrUnknownView {
+ return err
+ }
+ v.Title = authPasswordViewFeature.Title
+ v.Editable = true
+ v.Mask ^= '*'
+ v.Frame = false
+ }
+ return nil
+}
+
+// focus to next view
+func (gui *Gui) nextAuthView(g *gocui.Gui, v *gocui.View) error {
+ err := gui.nextViewOfGroup(g, v, authViews)
+ return err
+}
+
+// focus to previous view
+func (gui *Gui) previousAuthView(g *gocui.Gui, v *gocui.View) error {
+ err := gui.previousViewOfGroup(g, v, authViews)
+ return err
+}