summaryrefslogtreecommitdiff
path: root/client/client.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2023-09-27 15:37:23 +0200
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2023-09-29 13:31:43 +0200
commitee38ef96dfa6409bca1edc37d9ab63c27d3adcec (patch)
tree0d6f57339144847d5c0bd520cbde1cdfa4081d47 /client/client.go
parent8a5e8dad79cf07dd15be47b16d97c228c2bc17d2 (diff)
Client + Server + OAuth: Support mobile redirects
Diffstat (limited to 'client/client.go')
-rw-r--r--client/client.go50
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
}