diff options
author | Vidhu Kant Sharma <vidhukant@vidhukant.xyz> | 2023-02-01 11:39:05 +0530 |
---|---|---|
committer | Vidhu Kant Sharma <vidhukant@vidhukant.xyz> | 2023-02-01 11:39:05 +0530 |
commit | 9534771936b88675c2bec251c3e0369853409380 (patch) | |
tree | 743b209108f5ddf28fc5680d77055f1838016be5 /auth/auth.go | |
parent | 747e4795424c6f9112f0e64bcb434df42b2ba8c5 (diff) |
added vendored Client ID support
Diffstat (limited to 'auth/auth.go')
-rw-r--r-- | auth/auth.go | 183 |
1 files changed, 95 insertions, 88 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.") + } } |