diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2023-09-27 15:37:23 +0200 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2023-09-29 13:31:43 +0200 |
| commit | ee38ef96dfa6409bca1edc37d9ab63c27d3adcec (patch) | |
| tree | 0d6f57339144847d5c0bd520cbde1cdfa4081d47 /client | |
| parent | 8a5e8dad79cf07dd15be47b16d97c228c2bc17d2 (diff) | |
Client + Server + OAuth: Support mobile redirects
Diffstat (limited to 'client')
| -rw-r--r-- | client/client.go | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/client/client.go b/client/client.go index 64e01bd..2afb1a9 100644 --- a/client/client.go +++ b/client/client.go @@ -112,6 +112,22 @@ type Client struct { mu sync.Mutex } +func (c *Client) NeedsMobileRedirect() bool { + splitted := strings.Split(c.Name, ".") + last := splitted[len(splitted)-1] + return last == "android" || last == "ios" +} + +func (c *Client) MobileRedirect() string { + vals := map[string]string{ + "org.letsconnect-vpn.app.ios": "org.letsconnect-vpn.app.ios:/api/callback", + "org.letsconnect-vpn.app.android": "org.letsconnect-vpn.app:/api/callback", + "org.eduvpn.app.ios": "org.eduvpn.app.ios:/api/callback", + "org.eduvpn.app.android": "org.eduvpn.app:/api/callback", + } + return vals[c.Name] +} + func (c *Client) updateTokens(srv server.Server) error { if c.TokenGetter == nil { return errors.New("no token getter defined") @@ -360,15 +376,39 @@ func (c *Client) locationCallback(ck *cookie.Cookie) error { } func (c *Client) loginCallback(ck *cookie.Cookie, srv server.Server) error { - url, err := server.OAuthURL(srv, c.Name) - if err != nil { - return err + // get a custom redirect + cr := "" + if c.NeedsMobileRedirect() { + cr = c.MobileRedirect() } - err = c.FSM.GoTransitionRequired(StateOAuthStarted, url) + url, err := server.OAuthURL(srv, c.Name, cr) if err != nil { return err } - err = server.OAuthExchange(ck.Context(), srv) + authCodeURI := "" + if c.NeedsMobileRedirect() { + errChan := make(chan error) + go func() { + err := c.FSM.GoTransitionRequired(StateOAuthStarted, &srvtypes.RequiredAskTransition{ + C: ck, + Data: url, + }) + if err != nil { + errChan <- err + } + }() + g, err := ck.Receive(errChan) + if err != nil { + return err + } + authCodeURI = g + } else { + err = c.FSM.GoTransitionRequired(StateOAuthStarted, url) + if err != nil { + return err + } + } + err = server.OAuthExchange(ck.Context(), srv, authCodeURI) if err != nil { return err } |
