aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVidhu Kant Sharma <vidhukant@vidhukant.xyz>2023-02-01 11:39:05 +0530
committerVidhu Kant Sharma <vidhukant@vidhukant.xyz>2023-02-01 11:39:05 +0530
commit9534771936b88675c2bec251c3e0369853409380 (patch)
tree743b209108f5ddf28fc5680d77055f1838016be5
parent747e4795424c6f9112f0e64bcb434df42b2ba8c5 (diff)
added vendored Client ID support
-rw-r--r--auth/auth.go183
-rw-r--r--cmd/login.go52
-rw-r--r--cmd/version.go10
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)
},
}