diff options
| -rw-r--r-- | auth/auth.go | 183 | ||||
| -rw-r--r-- | cmd/login.go | 52 | ||||
| -rw-r--r-- | 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 <http://www.gnu.org/licenses/>.  */  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("<failed to detect platform>") -  } - -  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("<failed to detect platform>") +	} + +	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 <http://www.gnu.org/licenses/>.  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)  	},  } |