From 08c8b0ccedbda92d98a71376335fa6f12903a6c8 Mon Sep 17 00:00:00 2001 From: Andre Staltz Date: Tue, 30 Mar 2021 18:04:07 +0300 Subject: [PATCH] style the join (claim invite) pages --- docs/invites-chart.png | Bin 0 -> 62992 bytes docs/invites.md | 9 ++ web/assets/autoredirect.js | 17 ++++ web/handlers/http.go | 7 +- web/handlers/invites.go | 116 ++++++++++++++++------ web/i18n/defaults/active.en.toml | 17 +++- web/router/complete.go | 8 +- web/templates/admin/denied-keys.tmpl | 2 +- web/templates/admin/members.tmpl | 2 +- web/templates/invite/consumed.tmpl | 13 ++- web/templates/invite/facade-fallback.tmpl | 29 ++++++ web/templates/invite/facade.tmpl | 53 ++++------ web/templates/invite/insert-id.tmpl | 27 +++++ 13 files changed, 226 insertions(+), 74 deletions(-) create mode 100644 docs/invites-chart.png create mode 100644 docs/invites.md create mode 100644 web/assets/autoredirect.js create mode 100644 web/templates/invite/facade-fallback.tmpl create mode 100644 web/templates/invite/insert-id.tmpl diff --git a/docs/invites-chart.png b/docs/invites-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..2a8994559e35d2ebfabdbbc106c3caf6ecfce11a GIT binary patch literal 62992 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 mW^6(K70_uU{*PR4nrB&sn9`24C2xq|KBS { + hasFocus = false; +}); +window.addEventListener('focus', () => { + hasFocus = true; +}); + +const anchorElem = document.getElementById('join-room-uri'); +anchorElem.onclick = function handleURI(ev) { + const ssbUri = ev.target.dataset.href; + const fallbackUrl = ev.target.dataset.hrefFallback; + setTimeout(function () { + if (hasFocus) window.location = fallbackUrl; + }, 500); + window.location = ssbUri; +}; diff --git a/web/handlers/http.go b/web/handlers/http.go index 39ea77d..7ffb8b0 100644 --- a/web/handlers/http.go +++ b/web/handlers/http.go @@ -39,6 +39,8 @@ var HTMLTemplates = []string{ "invite/consumed.tmpl", "invite/facade.tmpl", + "invite/facade-fallback.tmpl", + "invite/insert-id.tmpl", "notice/list.tmpl", "notice/show.tmpl", @@ -301,11 +303,14 @@ func New( var ih = inviteHandler{ render: r, - invites: dbs.Invites, + invites: dbs.Invites, + pinnedNotices: dbs.PinnedNotices, networkInfo: netInfo, } m.Get(router.CompleteInviteFacade).Handler(r.HTML("invite/facade.tmpl", ih.presentFacade)) + m.Get(router.CompleteInviteFacadeFallback).Handler(r.HTML("invite/facade-fallback.tmpl", ih.presentFacadeFallback)) + m.Get(router.CompleteInviteInsertID).Handler(r.HTML("invite/insert-id.tmpl", ih.presentInsert)) m.Get(router.CompleteInviteConsume).HandlerFunc(ih.consume) m.PathPrefix("/assets/").Handler(http.StripPrefix("/assets/", http.FileServer(web.Assets))) diff --git a/web/handlers/invites.go b/web/handlers/invites.go index 4218ea3..b49f80c 100644 --- a/web/handlers/invites.go +++ b/web/handlers/invites.go @@ -1,15 +1,18 @@ package handlers import ( + "encoding/base64" "encoding/json" "errors" "fmt" "html/template" + "image/color" "net/http" "net/url" "github.com/go-kit/kit/log/level" "github.com/gorilla/csrf" + "github.com/skip2/go-qrcode" "go.mindeco.de/http/render" "go.mindeco.de/logging" @@ -24,22 +27,13 @@ import ( type inviteHandler struct { render *render.Renderer - invites roomdb.InvitesService + invites roomdb.InvitesService + pinnedNotices roomdb.PinnedNoticesService networkInfo network.ServerEndpointDetails } -func (h inviteHandler) presentFacade(rw http.ResponseWriter, req *http.Request) (interface{}, error) { - token := req.URL.Query().Get("token") - - inv, err := h.invites.GetByToken(req.Context(), token) - if err != nil { - if errors.Is(err, roomdb.ErrNotFound) { - return nil, weberrors.ErrNotFound{What: "invite"} - } - return nil, err - } - +func buildJoinRoomURI(h inviteHandler, token string) string { var joinRoomURI url.URL joinRoomURI.Scheme = "ssb" joinRoomURI.Opaque = "experimental" @@ -60,13 +54,88 @@ func (h inviteHandler) presentFacade(rw http.ResponseWriter, req *http.Request) joinRoomURI.RawQuery = queryVals.Encode() + return joinRoomURI.String() +} + +func (h inviteHandler) presentFacade(rw http.ResponseWriter, req *http.Request) (interface{}, error) { + token := req.URL.Query().Get("token") + + _, err := h.invites.GetByToken(req.Context(), token) + if err != nil { + if errors.Is(err, roomdb.ErrNotFound) { + return nil, weberrors.ErrNotFound{What: "invite"} + } + return nil, err + } + + notice, err := h.pinnedNotices.Get(req.Context(), roomdb.NoticeDescription, "en-GB") + if err != nil { + return nil, fmt.Errorf("failed to find room's description: %w", err) + } + + joinRoomURI := buildJoinRoomURI(h, token) + + urlTo := web.NewURLTo(router.CompleteApp()) + fallbackURL := urlTo(router.CompleteInviteFacadeFallback, "token", token) + + // generate a QR code with the token inside so that you can open it easily in a supporting mobile app + qrCode, err := qrcode.New(joinRoomURI, qrcode.Medium) + if err != nil { + return nil, err + } + + qrCode.BackgroundColor = color.Transparent // transparent to fit into the page + qrCode.ForegroundColor = color.Black + + qrCodeData, err := qrCode.PNG(-5) + if err != nil { + return nil, err + } + qrURI := "data:image/png;base64," + base64.StdEncoding.EncodeToString(qrCodeData) + return map[string]interface{}{ csrf.TemplateTag: csrf.TemplateField(req), + "RoomTitle": notice.Title, + "JoinRoomURI": template.URL(joinRoomURI), + "FallbackURL": fallbackURL, + "QRCodeURI": template.URL(qrURI), + }, nil +} - "Invite": inv, - "Token": token, +func (h inviteHandler) presentFacadeFallback(rw http.ResponseWriter, req *http.Request) (interface{}, error) { + token := req.URL.Query().Get("token") - "JoinRoomURI": template.URL(joinRoomURI.String()), + _, err := h.invites.GetByToken(req.Context(), token) + if err != nil { + if errors.Is(err, roomdb.ErrNotFound) { + return nil, weberrors.ErrNotFound{What: "invite"} + } + return nil, err + } + + urlTo := web.NewURLTo(router.CompleteApp()) + insertURL := urlTo(router.CompleteInviteInsertID, "token", token) + + return map[string]interface{}{ + csrf.TemplateTag: csrf.TemplateField(req), + "InsertURL": insertURL, + }, nil +} + +func (h inviteHandler) presentInsert(rw http.ResponseWriter, req *http.Request) (interface{}, error) { + token := req.URL.Query().Get("token") + + _, err := h.invites.GetByToken(req.Context(), token) + if err != nil { + if errors.Is(err, roomdb.ErrNotFound) { + return nil, weberrors.ErrNotFound{What: "invite"} + } + return nil, err + } + + return map[string]interface{}{ + csrf.TemplateTag: csrf.TemplateField(req), + "Token": token, }, nil } @@ -213,22 +282,9 @@ func (html *inviteConsumeHTMLResponder) UpdateMultiserverAddr(msaddr string) { } func (html inviteConsumeHTMLResponder) SendSuccess() { - - // construct the ssb:experimental?action=consume-invite&... uri for linking into apps - queryParams := url.Values{} - queryParams.Set("action", "join-room") - queryParams.Set("multiserverAddress", html.multiservAddr) - - // html.multiservAddr - ssbURI := url.URL{ - Scheme: "ssb", - Opaque: "experimental", - RawQuery: queryParams.Encode(), - } - err := html.renderer.Render(html.rw, html.req, "invite/consumed.tmpl", http.StatusOK, struct { - SSBURI template.URL - }{template.URL(ssbURI.String())}) + MultiserverAddress string + }{(html.multiservAddr)}) if err != nil { logger := logging.FromContext(html.req.Context()) level.Warn(logger).Log("event", "render failed", "err", err) diff --git a/web/i18n/defaults/active.en.toml b/web/i18n/defaults/active.en.toml index 35db22d..e92ec48 100644 --- a/web/i18n/defaults/active.en.toml +++ b/web/i18n/defaults/active.en.toml @@ -2,12 +2,15 @@ GenericConfirm = "Yes" GenericGoBack = "Back" GenericSave = "Save" GenericCreate = "Create" +GenericSubmit = "Submit" GenericPreview = "Preview" GenericLanguage = "Language" GenericOpenLink = "Open Link" PageNotFound = "The requested page was not found." +PubKeyRefPlaceholder = "@ .ed25519" + RoleMember = "Member" RoleModerator = "Moderator" RoleAdmin = "Admin" @@ -82,12 +85,18 @@ NavAdminNotices = "Notices" InviteFacade = "Join Room" InviteFacadeTitle = "Join Room" -InviteFacadeWelcome = "elaborate welcome message for a new member with good words and stuff." -InviteFacadeAliasSuggestion = "The persone who created thought you might like this alias:" -InviteFacadePublicKey = "Public Key" +InviteFacadeWelcome = "You have permission to become a member of this room because someone has shared this invite with you." +InviteFacadeInstruct = "To claim the invite, press the button below which will open a compatible SSB app, if it's installed." +InviteFacadeJoin = "Join this room" + +InviteFacadeFallbackWelcome = "Are you new to SSB? It seems you don't have an SSB app capable of understanding that link. You can install one of these apps:" +InviteFacadeFallbackManyverse = "Install Manyverse" +InviteFacadeFallbackInsertID = "Insert SSB ID" + +InviteInsertWelcome = "You can claim your invite by inserting your SSB ID below. After that, you'll be able to connect to the room in your SSB app." InviteConsumedTitle = "Invite accepted!" -InviteConsumedWelcome = "Even more elaborate message that the person is now a member of the room!" +InviteConsumedWelcome = "You are now a member of this room. If you need a multiserver address to connect to the room, you can copy-paste the one below:" NoticeEditTitle = "Edit Notice" NoticeList = "Notices" diff --git a/web/router/complete.go b/web/router/complete.go index 43c4717..61575a6 100644 --- a/web/router/complete.go +++ b/web/router/complete.go @@ -16,8 +16,10 @@ const ( CompleteAliasResolve = "complete:alias:resolve" - CompleteInviteFacade = "complete:invite:accept" - CompleteInviteConsume = "complete:invite:consume" + CompleteInviteFacade = "complete:invite:accept" + CompleteInviteFacadeFallback = "complete:invite:accept:fallback" + CompleteInviteInsertID = "complete:invite:insert-id" + CompleteInviteConsume = "complete:invite:consume" ) // CompleteApp constructs a mux.Router containing the routes for batch Complete html frontend @@ -33,6 +35,8 @@ func CompleteApp() *mux.Router { m.Path("/alias/{alias}").Methods("GET").Name(CompleteAliasResolve) m.Path("/join").Methods("GET").Name(CompleteInviteFacade) + m.Path("/join-fallback").Methods("GET").Name(CompleteInviteFacadeFallback) + m.Path("/join-manually").Methods("GET").Name(CompleteInviteInsertID) m.Path("/invite/consume").Methods("POST").Name(CompleteInviteConsume) m.Path("/notice/show").Methods("GET").Name(CompleteNoticeShow) diff --git a/web/templates/admin/denied-keys.tmpl b/web/templates/admin/denied-keys.tmpl index fedf91d..76cc09b 100644 --- a/web/templates/admin/denied-keys.tmpl +++ b/web/templates/admin/denied-keys.tmpl @@ -22,7 +22,7 @@ + {{end}} \ No newline at end of file diff --git a/web/templates/invite/facade-fallback.tmpl b/web/templates/invite/facade-fallback.tmpl new file mode 100644 index 0000000..51c64e4 --- /dev/null +++ b/web/templates/invite/facade-fallback.tmpl @@ -0,0 +1,29 @@ +{{ define "title" }}{{ i18n "InviteFacadeTitle" }}{{ end }} +{{ define "content" }} +
+

{{i18n "InviteFacadeFallbackWelcome"}}

+ + + +
+ +

Or if you already have an SSB app (such as Patchwork, Patchbay, Patchfoo, Oasis, Planetary) and it couldn't process the link for whatever reason, you can manually input your identifier here:

+ + {{i18n "InviteFacadeFallbackInsertID"}} +
+{{ end }} \ No newline at end of file diff --git a/web/templates/invite/facade.tmpl b/web/templates/invite/facade.tmpl index df5a3aa..005c5bc 100644 --- a/web/templates/invite/facade.tmpl +++ b/web/templates/invite/facade.tmpl @@ -1,39 +1,30 @@ {{ define "title" }}{{ i18n "InviteFacadeTitle" }}{{ end }} {{ define "content" }} -
+
+

Welcome to {{.RoomTitle}}! {{i18n "InviteFacadeWelcome"}}

+

{{i18n "InviteFacadeInstruct"}}

- {{ i18n "InviteFacadeWelcome" }} + {{i18n "InviteFacadeJoin"}} - Join +
-
-

TODO: html form fallback / advanced use

+ {{i18n "AuthWithSSBInstructQR"}} -
- {{ .csrfField }} - + QR-Code to pass the challenge to an App - -
- - -
- - -
- -
+ +
{{ end }} \ No newline at end of file diff --git a/web/templates/invite/insert-id.tmpl b/web/templates/invite/insert-id.tmpl new file mode 100644 index 0000000..878dd2f --- /dev/null +++ b/web/templates/invite/insert-id.tmpl @@ -0,0 +1,27 @@ +{{ define "title" }}{{ i18n "InviteFacadeTitle" }}{{ end }} +{{ define "content" }} +
+ {{i18n "InviteInsertWelcome"}} + +
+ {{.csrfField}} + + + + + +
+
+{{ end }} \ No newline at end of file