diff options
| author | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2023-11-24 20:10:31 +0530 | 
|---|---|---|
| committer | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2023-11-24 20:10:31 +0530 | 
| commit | 9016476f2a5051fd72dbe35d0c7bce13b4b6d55b (patch) | |
| tree | e2b2db69b12aabd8db1657530ee1b8289768e3a2 /auth | |
| parent | 854e5250c672c002bd5362c1312325e4abe5ca89 (diff) | |
not prematurely killing the server before showing message in browser upon login
Diffstat (limited to 'auth')
| -rw-r--r-- | auth/server.go | 60 | 
1 files changed, 41 insertions, 19 deletions
| diff --git a/auth/server.go b/auth/server.go index 0f2496e..5bce2aa 100644 --- a/auth/server.go +++ b/auth/server.go @@ -19,51 +19,73 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.  package auth  import ( +	"context"    "net/http"    "net/url" +	"html"    "encoding/json"    "os"    "fmt" +	"errors"  )  func listen(clientId, verifier string) { -  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { -	  code, codeExists := r.URL.Query()["code"] +	mux := http.NewServeMux() +	server := &http.Server{Addr: ":8000", Handler: mux} + +	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { +		code, codeExists := r.URL.Query()["code"]  		if codeExists { -	    accessToken, refreshToken, expiresIn := requestToken(clientId, verifier, code[0]) -		  setToken(accessToken) -		  setRefreshToken(refreshToken) -      setExpiresIn(expiresIn) -			fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") -			fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") -			os.Exit(0) +			err := getToken(clientId, verifier, code[0]) +			if err != nil { +			  fmt.Fprintf(w, "<p>An error occoured while logging in: %s</p>", html.EscapeString(err.Error())) + +				fmt.Println("Error while requesting an access token from MyAnimeList:", err) +			} else { +				fmt.Fprintf(w, "<p>Login successful! You may close this tab now.</p>") + +				fmt.Println("\x1b[32mYou have successfully logged into macli.\x1b[0m") +				fmt.Println("\x1b[32mYou can close the web browser tab now.\x1b[0m") +			} +		} else { +			fmt.Fprintf(w, "<p>An error occoured while logging in (invalid request)</p>") + +			fmt.Println("An error occoured while logging in (invalid request)")  		} + +		go server.Shutdown(context.Background())    }) -  err := http.ListenAndServe(":8000", nil) -  if err != nil { +  err := server.ListenAndServe() +  if err != nil && err != http.ErrServerClosed {      fmt.Println("There was an error initialising the server", err.Error())      os.Exit(1)    }  } -func requestToken(clientId, verifier, code string) (string, string, string) { +func getToken(clientId, verifier, code string) error {    data := url.Values{ -	"client_id": {clientId}, -	"code_verifier": {verifier}, -	"grant_type": {"authorization_code"}, -	"code": {code}, +		"client_id": {clientId}, +		"code_verifier": {verifier}, +		"grant_type": {"authorization_code"}, +		"code": {code},    }    resp, err := http.PostForm("https://myanimelist.net/v1/oauth2/token", data)    if err != nil { -    fmt.Println("Error while requesting an access token:", err) -	os.Exit(1) +		return err    }    var res map[string]interface{}    json.NewDecoder(resp.Body).Decode(&res) -  return fmt.Sprintf("%v", res["access_token"]), fmt.Sprintf("%v", res["refresh_token"]), fmt.Sprintf("%v", res["expires_in"]) +	if res["error"] != nil { +		return errors.New(fmt.Sprintf("%v (%v)", res["message"], res["error"])) +	} + +	setToken(fmt.Sprintf("%v", res["access_token"])) +	//setRefreshToken(refreshToken) +	//setExpiresIn(expiresIn) +  return nil  } |