package main import ( "fmt" "log" "strings" "github.com/rivo/tview" ) type authStep int const ( authNoneStep authStep = iota authInstanceStep authCodeStep ) func NewAuthOverlay(app *App) *AuthOverlay { a := &AuthOverlay{ app: app, Flex: tview.NewFlex(), Input: tview.NewInputField(), Text: tview.NewTextView(), authStep: authNoneStep, } a.Flex.SetBackgroundColor(app.Config.Style.Background) a.Input.SetBackgroundColor(app.Config.Style.Background) a.Input.SetFieldBackgroundColor(app.Config.Style.Background) a.Input.SetFieldTextColor(app.Config.Style.Text) a.Text.SetBackgroundColor(app.Config.Style.Background) a.Text.SetTextColor(app.Config.Style.Text) a.Flex.SetDrawFunc(app.Config.ClearContent) a.Draw() return a } type AuthOverlay struct { app *App Flex *tview.Flex Input *tview.InputField Text *tview.TextView authStep authStep account AccountRegister } func (a *AuthOverlay) GotInput() { input := strings.TrimSpace(a.Input.GetText()) switch a.authStep { case authInstanceStep: if !(strings.HasPrefix(input, "https://") || strings.HasPrefix(input, "http://")) { input = "https://" + input } _, err := TryInstance(input) if err != nil { a.app.UI.CmdBar.ShowError(fmt.Sprintf("Couldn't connect to instance %s\n", input)) return } acc, err := Authorize(input) if err != nil { a.app.UI.CmdBar.ShowError(fmt.Sprintf("Couldn't authorize. Error: %v\n", err)) return } a.account = acc openURL(a.app.UI.Root, a.app.Config.Media, a.app.Config.OpenPattern, acc.AuthURI) a.Input.SetText("") a.authStep = authCodeStep a.Draw() case authCodeStep: client, err := AuthorizationCode(a.account, input) if err != nil { a.app.UI.CmdBar.ShowError(fmt.Sprintf("Couldn't verify the code. Error: %v\n", err)) a.Input.SetText("") return } path, _, err := CheckConfig("accounts.toml") if err != nil { log.Fatalf("Couldn't open the account file for reading. Error: %v", err) } ad := Account{ Server: client.Config.Server, ClientID: client.Config.ClientID, ClientSecret: client.Config.ClientSecret, AccessToken: client.Config.AccessToken, } a.app.Accounts.Accounts = append(a.app.Accounts.Accounts, ad) err = a.app.Accounts.Save(path) if err != nil { log.Fatalf("Couldn't save the account file. Error: %v", err) } index := len(a.app.Accounts.Accounts) - 1 a.app.Login(index) a.app.UI.LoggedIn() } } func (a *AuthOverlay) Draw() { switch a.authStep { case authNoneStep: a.authStep = authInstanceStep a.Input.SetText("") a.Draw() return case authInstanceStep: a.Input.SetLabel("Instance: ") a.Text.SetText("Enter the url of your instance. Will default to https://\nPress Enter when done") case authCodeStep: a.Text.SetText(fmt.Sprintf("The login URL has opened in your browser. If it didn't work open this URL\n%s", a.account.AuthURI)) a.Input.SetLabel("Authorization code: ") } }