From 9534771936b88675c2bec251c3e0369853409380 Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Wed, 1 Feb 2023 11:39:05 +0530 Subject: added vendored Client ID support --- auth/auth.go | 183 ++++++++++++++++++++++++++++++--------------------------- cmd/login.go | 52 ++++++++-------- cmd/version.go | 10 ++-- 3 files changed, 126 insertions(+), 119 deletions(-) diff --git a/auth/auth.go b/auth/auth.go index 15ad854..4ff5b82 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -12,117 +12,124 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU General Public Lice along with this program. If not, see . */ package auth import ( - "os" - "os/user" - "os/exec" - "runtime" - "errors" - "fmt" - "github.com/zalando/go-keyring" - "github.com/spf13/viper" + "errors" + "fmt" + "github.com/spf13/viper" + "github.com/zalando/go-keyring" + "os" + "os/exec" + "os/user" + "runtime" ) +// set with ldflags, allows for direct login without setting up client id +var VendoredClientId string var serviceName string = "macli" var userName string func init() { - // get user and set username - currentUser, err := user.Current() - if err != nil { - fmt.Println("Error getting current user's info", err.Error()) - os.Exit(1) - } - userName = currentUser.Username + fmt.Println(VendoredClientId) + // get user and set username + currentUser, err := user.Current() + if err != nil { + fmt.Println("Error getting current user's info", err.Error()) + os.Exit(1) + } + userName = currentUser.Username } // asks for all the details func Login(tk, clientId string, storeClientId bool) { - // check if an auth token already exists - var existingToken string - if NoSysKeyring { - existingToken = viper.GetString("auth.token") - } else { - /* if there is an error with keyring, askClientId would handle it - * can safely ignore error here */ - existingToken, _ = keyring.Get(serviceName, userName) - } - - if existingToken != "" { - if !confirmInput("Already logged in. Log in again? [Y/n] ", true) { - fmt.Println("Login process aborted") - os.Exit(0) - } - } - - if clientId == "" { - clientId = askClientId(storeClientId) - } else { - validateClientId(clientId) - if storeClientId { - setClientId(clientId) - } - } - - if tk != "" { - setToken(tk) - fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") - fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") - return - } - - challenge := codeChallenge() - link := generateLink(clientId, challenge) - - openInBrowser(link) - listen(clientId, challenge) + // check if an auth token already exists + var existingToken string + if NoSysKeyring { + existingToken = viper.GetString("auth.token") + } else { + /* if there is an error with keyring, askClientId would handle it + * can safely ignore error here */ + existingToken, _ = keyring.Get(serviceName, userName) + } + + if existingToken != "" { + if !confirmInput("Already logged in. Log in again? [Y/n] ", true) { + fmt.Println("Login process aborted") + os.Exit(0) + } + } + + if clientId == "" { + if VendoredClientId == "" { + clientId = askClientId(storeClientId) + } else { + clientId = VendoredClientId + } + } else { + validateClientId(clientId) + if storeClientId { + setClientId(clientId) + } + } + + if tk != "" { + setToken(tk) + fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") + fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") + return + } + + challenge := codeChallenge() + link := generateLink(clientId, challenge) + + openInBrowser(link) + listen(clientId, challenge) } func generateLink(clientId, challenge string) string { - return "https://myanimelist.net/v1/oauth2/authorize?response_type=code&client_id=" + clientId + "&code_challenge=" + challenge + return "https://myanimelist.net/v1/oauth2/authorize?response_type=code&client_id=" + clientId + "&code_challenge=" + challenge } func openInBrowser(url string) { - fmt.Println("Attempting to launch \033[36m" + url + "\033[0m in your default web browser. If it doesn't launch please manually copy-paste the link.") - - var err error - switch runtime.GOOS { - case "linux": - err = exec.Command("xdg-open", url).Start() - case "windows": - err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() - case "darwin": - err = exec.Command("open", url).Start() - default: - err = errors.New("") - } - - if err != nil { - fmt.Println("There was an error while launching your browser.") - fmt.Println("Please manually copy and paste the above URL into your web browser.") - fmt.Println(err) - } + fmt.Println("Attempting to launch \033[36m" + url + "\033[0m in your default web browser. If it doesn't launch please manually copy-paste the link.") + + var err error + switch runtime.GOOS { + case "linux": + err = exec.Command("xdg-open", url).Start() + case "windows": + err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() + case "darwin": + err = exec.Command("open", url).Start() + default: + err = errors.New("") + } + + if err != nil { + fmt.Println("There was an error while launching your browser.") + fmt.Println("Please manually copy and paste the above URL into your web browser.") + fmt.Println(err) + } } func Logout() { - existingToken, _ := keyring.Get(serviceName, userName) - deleteToken() - deleteExpiresIn() - deleteRefreshToken() - if existingToken != "" { - fmt.Println("Deleted user credentials.") - } - - // only ask to delete Client ID if it actually exists - existingClientId, _ := getClientId() - if existingClientId != "" && confirmInput("Delete your Client ID? [y/N] ", false) { - deleteClientId() - fmt.Println("Deleted Client ID.") - } + existingToken, _ := keyring.Get(serviceName, userName) + deleteToken() + deleteExpiresIn() + deleteRefreshToken() + if existingToken != "" { + fmt.Println("Deleted user credentials.") + } + + // only ask to delete Client ID if it actually exists + existingClientId, _ := getClientId() + if existingClientId != "" && confirmInput("Delete your Client ID? [y/N] ", false) { + deleteClientId() + fmt.Println("Deleted Client ID.") + } } diff --git a/cmd/login.go b/cmd/login.go index 453d744..cbb0955 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -19,43 +19,43 @@ along with this program. If not, see . package cmd import ( - "os" "fmt" + "github.com/MikunoNaka/macli/auth" "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/MikunoNaka/macli/auth" + "os" ) -var loginCmd = &cobra.Command { +var loginCmd = &cobra.Command{ Use: "login", Short: "Login with your MyAnimeList account", Long: "To authenticate with macli, a Client ID is required.\n" + - "If you have logged in before and ran `macli logout`, you may not need to enter your Client ID again unless you specifically deleted it.\n" + - "\n" + - "\x1b[31;1mHow to generate a Client ID:\x1b[0m\n" + - " - Go to \x1b[36mhttps://myanimelist.net/apiconfig\x1b[0m\n" + - " - Click on \x1b[33m\"Create ID\"\x1b[0m\n" + - " - Inside the form you can set all the details to whatever you'd like\n" + - " - For macli to work properly, you only need to set \x1b[33m\"App Redirect Url\"\x1b[0m to \x1b[36mhttp://localhost:8000\x1b[0m\n" + - " - After that, hit submit, then copy your Client ID, run `macli login` and paste in your Client ID.\n" + - " - \x1b[31mIf after running `macli login` it opens a dialogue box in the browser asking for credentials,\n and not the MyAnimeList login page, that means you have entered your Client ID wrong. \n (you might need to wait for a few minutes after creating a new ID)\x1b[0m\n" + - "", + "If you have logged in before and ran `macli logout`, you may not need to enter your Client ID again unless you specifically deleted it.\n" + + "\n" + + "\x1b[31;1mHow to generate a Client ID:\x1b[0m\n" + + " - Go to \x1b[36mhttps://myanimelist.net/apiconfig\x1b[0m\n" + + " - Click on \x1b[33m\"Create ID\"\x1b[0m\n" + + " - Inside the form you can set all the details to whatever you'd like\n" + + " - For macli to work properly, you only need to set \x1b[33m\"App Redirect Url\"\x1b[0m to \x1b[36mhttp://localhost:8000\x1b[0m\n" + + " - After that, hit submit, then copy your Client ID, run `macli login` and paste in your Client ID.\n" + + " - \x1b[31mIf after running `macli login` it opens a dialogue box in the browser asking for credentials,\n and not the MyAnimeList login page, that means you have entered your Client ID wrong. \n (you might need to wait for a few minutes after creating a new ID)\x1b[0m\n" + + "", Run: func(cmd *cobra.Command, args []string) { var storeClientId bool var err error - if cmd.Flags().Lookup("no-sys-keyring").Changed { - auth.NoSysKeyring, err = cmd.Flags().GetBool("no-sys-keyring") - if err != nil { + if cmd.Flags().Lookup("no-sys-keyring").Changed { + auth.NoSysKeyring, err = cmd.Flags().GetBool("no-sys-keyring") + if err != nil { fmt.Println("Error reading \x1b[33m`--no-sys-keyring`\x1b[0m flag:", err.Error()) } - } else { - auth.NoSysKeyring = viper.GetBool("auth.no_system_keyring") - } + } else { + auth.NoSysKeyring = viper.GetBool("auth.no_system_keyring") + } var s, errmsg string - if cmd.Flags().Lookup("store-client-id").Changed { - s, _ = cmd.Flags().GetString("store-client-id") + if cmd.Flags().Lookup("store-client-id").Changed { + s, _ = cmd.Flags().GetString("store-client-id") errmsg = "\x1b[33m`--store-client-id`\x1b[0m flag only accepts \x1b[33m\"yes\"\x1b[0m or \x1b[33m\"no\"\x1b[0m" } else { s = viper.GetString("auth.save_client_id") @@ -83,9 +83,9 @@ var loginCmd = &cobra.Command { } func init() { - rootCmd.AddCommand(loginCmd) - loginCmd.Flags().StringP("authentication-token", "t", "", "MyAnimeList authentication token to use (overrides system keyring if any)") - loginCmd.Flags().StringP("client-id", "c", "", "MyAnimeList Client ID") - loginCmd.Flags().StringP("store-client-id", "s", "yes", "Save Client ID to keyring") - loginCmd.Flags().BoolP("no-sys-keyring", "k", false, "Don't use system keyring to store login info") + rootCmd.AddCommand(loginCmd) + loginCmd.Flags().StringP("authentication-token", "t", "", "MyAnimeList authentication token to use (overrides system keyring if any)") + loginCmd.Flags().StringP("client-id", "c", "", "MyAnimeList Client ID") + loginCmd.Flags().StringP("store-client-id", "s", "yes", "Save Client ID to keyring") + loginCmd.Flags().BoolP("no-sys-keyring", "k", false, "Don't use system keyring to store login info") } diff --git a/cmd/version.go b/cmd/version.go index 3a1e3c6..9f848f1 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -20,18 +20,18 @@ package cmd import ( "fmt" - "runtime" "github.com/spf13/cobra" + "runtime" ) -const version string = "v1.16.0" +const version string = "v1.17.1" -var versionCmd = &cobra.Command { +var versionCmd = &cobra.Command{ Use: "version", Short: "Shows current version", - Long: "Shows current version of macli", + Long: "Shows current version of macli", Run: func(cmd *cobra.Command, args []string) { - fmt.Println("macli version", version, runtime.GOOS + "/" + runtime.GOARCH) + fmt.Println("macli version", version, runtime.GOOS+"/"+runtime.GOARCH) }, } -- cgit v1.2.3