diff --git a/web/handlers/aliases.go b/web/handlers/aliases.go index 89ed323..a25e21c 100644 --- a/web/handlers/aliases.go +++ b/web/handlers/aliases.go @@ -14,12 +14,12 @@ import ( "net/url" "github.com/gorilla/mux" - ua "github.com/mileusna/useragent" "go.mindeco.de/http/render" "github.com/ssb-ngi-pointer/go-ssb-room/v2/internal/aliases" "github.com/ssb-ngi-pointer/go-ssb-room/v2/internal/network" "github.com/ssb-ngi-pointer/go-ssb-room/v2/roomdb" + "github.com/ssb-ngi-pointer/go-ssb-room/v2/web" ) // aliasHandler implements the public resolve endpoint for HTML and JSON requests. @@ -165,23 +165,11 @@ func (html aliasHTMLResponder) SendConfirmation(alias roomdb.Alias) { RawQuery: queryParams.Encode(), } - // Special treatment for Android Chrome for issue #135 - // https://github.com/ssb-ngi-pointer/go-ssb-room/issues/135 - browser := ua.Parse(html.req.UserAgent()) - if browser.IsAndroid() && browser.IsChrome() { - ssbURI = url.URL{ - Scheme: "intent", - Opaque: "//experimental", - RawQuery: queryParams.Encode(), - Fragment: "Intent;scheme=ssb;end;", - } - } - err := html.renderer.Render(html.rw, html.req, "alias.tmpl", http.StatusOK, struct { Alias roomdb.Alias SSBURI template.URL - }{alias, template.URL(ssbURI.String())}) + }{alias, template.URL(web.StringifySSBURI(&ssbURI, html.req.UserAgent()))}) if err != nil { log.Println("alias-resolve render errr:", err) } diff --git a/web/handlers/auth/withssb.go b/web/handlers/auth/withssb.go index 0ebb16b..286524f 100644 --- a/web/handlers/auth/withssb.go +++ b/web/handlers/auth/withssb.go @@ -20,7 +20,6 @@ import ( "github.com/gorilla/mux" "github.com/gorilla/sessions" - ua "github.com/mileusna/useragent" "github.com/skip2/go-qrcode" "go.cryptoscope.co/muxrpc/v2" "go.mindeco.de/http/render" @@ -373,18 +372,6 @@ func (h WithSSBHandler) serverInitiated(sc string, userAgent string) (templateDa startAuthURI.Opaque = "experimental" startAuthURI.RawQuery = queryParams.Encode() - // Special treatment for Android Chrome for issue #135 - // https://github.com/ssb-ngi-pointer/go-ssb-room/issues/135 - browser := ua.Parse(userAgent) - if browser.IsAndroid() && browser.IsChrome() { - startAuthURI = url.URL{ - Scheme: "intent", - Opaque: "//experimental", - RawQuery: queryParams.Encode(), - Fragment: "Intent;scheme=ssb;end;", - } - } - var qrURI string if !isSolvingRemotely { urlTo := web.NewURLTo(router.Auth(h.router), h.netInfo) @@ -416,7 +403,7 @@ func (h WithSSBHandler) serverInitiated(sc string, userAgent string) (templateDa // template.URL signals the template engine that those aren't fishy and from a trusted source data := templateData{ - SSBURI: template.URL(startAuthURI.String()), + SSBURI: template.URL(web.StringifySSBURI(&startAuthURI, userAgent)), QRCodeURI: template.URL(qrURI), IsSolvingRemotely: isSolvingRemotely, diff --git a/web/handlers/invites.go b/web/handlers/invites.go index 42f53aa..6e43724 100644 --- a/web/handlers/invites.go +++ b/web/handlers/invites.go @@ -15,7 +15,6 @@ import ( "net/url" "github.com/gorilla/csrf" - ua "github.com/mileusna/useragent" "github.com/skip2/go-qrcode" "go.mindeco.de/http/render" "go.mindeco.de/log/level" @@ -54,19 +53,7 @@ func (h inviteHandler) buildJoinRoomURI(token string, userAgent string) template RawQuery: queryVals.Encode(), } - // Special treatment for Android Chrome for issue #135 - // https://github.com/ssb-ngi-pointer/go-ssb-room/issues/135 - browser := ua.Parse(userAgent) - if browser.IsAndroid() && browser.IsChrome() { - joinRoomURI = url.URL{ - Scheme: "intent", - Opaque: "//experimental", - RawQuery: queryVals.Encode(), - Fragment: "Intent;scheme=ssb;end;", - } - } - - return template.URL(joinRoomURI.String()) + return template.URL(web.StringifySSBURI(&joinRoomURI, userAgent)) } // switch between JSON and HTML responses diff --git a/web/utils.go b/web/utils.go index 970cb40..c778aad 100644 --- a/web/utils.go +++ b/web/utils.go @@ -18,6 +18,7 @@ import ( "github.com/dustin/go-humanize" "github.com/gorilla/mux" "github.com/gorilla/securecookie" + ua "github.com/mileusna/useragent" "go.mindeco.de/log/level" "go.mindeco.de/logging" @@ -194,3 +195,23 @@ func LoadOrCreateCSRFSecret(repo repo.Interface) ([]byte, error) { return secret, nil } + +// Transforms the SSB URI into a string suitable for an and +// takes into account quirks from some browsers. +func StringifySSBURI(uri *url.URL, userAgent string) string { + browser := ua.Parse(userAgent) + + // Special treatment for Android Chrome for issue #135 + // https://github.com/ssb-ngi-pointer/go-ssb-room/issues/135 + if browser.IsAndroid() && browser.IsChrome() { + href := url.URL{ + Scheme: "intent", + Opaque: fmt.Sprintf("//%v", uri.Opaque), + RawQuery: uri.RawQuery, + Fragment: fmt.Sprintf("Intent;scheme=%v;end;", uri.Scheme), + } + return href.String() + } else { + return uri.String() + } +}