Author: Adam <git@apiote.tk>
show welcome after sign up
accounts/signup.go | 2 +- front/capnproto.go | 7 ++++++- front/html.go | 6 ++++++ front/renderer.go | 1 + libamuse/signup.go | 27 +++++++++++++++++++++++++-- router.go | 21 +++++++++++---------- static/style/style.css | 4 ++++ templates/signedup.html | 36 ++++++++++++++++++++++++++++++++++++
diff --git a/accounts/signup.go b/accounts/signup.go index 98369f388be284660cab5a3d20a87459a6939596..df71f3cdd9d91f0fdab2b0fedabb505ea670725e 100644 --- a/accounts/signup.go +++ b/accounts/signup.go @@ -89,5 +89,5 @@ if err != nil { return "", err } - return r.(gott.Tuple)[1].(*AuthResult).token, err + return r.(gott.Tuple)[1].(*AuthResult).recoveryCodesRaw, err } diff --git a/front/capnproto.go b/front/capnproto.go index 993d6a04dc0f12534dab1271a380cc5c19068407..47c382070fcbdc931c3ea86075a68b04991f401a 100644 --- a/front/capnproto.go +++ b/front/capnproto.go @@ -56,9 +56,14 @@ // todo throw Wrong Accept return TODO("implement CapnprotoRenderer.RenderLogin").(string) } -func (CapnprotoRenderer) RenderSignup(languages []language.Tag, err error, target *otp.Key) string { +func (CapnprotoRenderer) RenderSignup(languages []language.Tag, err error, otp *otp.Key) string { // todo throw Wrong Accept return TODO("implement CapnprotoRenderer.RenderSignup").(string) +} + +func (CapnprotoRenderer) RenderSignedup(languages []language.Tag, recoveryCodes []string) string { + // todo throw Wrong Accept + return TODO("implement CapnprotoRenderer.RenderSignedup").(string) } func (CapnprotoRenderer) RenderWatchlist(watchlist datastructure.Watchlist, languages []language.Tag) string { diff --git a/front/html.go b/front/html.go index 89ec021f32f5100951ae5d83b42302cfe079a183..5e3d6c17cad45814ae196a54e226f06d9552049e 100644 --- a/front/html.go +++ b/front/html.go @@ -151,6 +151,12 @@ data.State.Error = authError return render(languages, data, "signup") } +func (r HtmlRenderer) RenderSignedup(languages []language.Tag, recoveryCodes []string) string { + data := RenderData{Data: recoveryCodes} + data.State.User = r.user + return render(languages, data, "signedup") +} + func (r HtmlRenderer) RenderWatchlist(watchlist datastructure.Watchlist, languages []language.Tag) string { data := RenderData{Data: watchlist} data.State.User = r.user diff --git a/front/renderer.go b/front/renderer.go index b0c8c39176b3a90d92243bf8849d1655c93068b5..9c97247f40f1ba5dddd13923cd4da31c7f9a90d3 100644 --- a/front/renderer.go +++ b/front/renderer.go @@ -31,6 +31,7 @@ RenderAbout([]language.Tag) string RenderErrorPage(int, []language.Tag) string RenderLogin([]language.Tag, error, string) string RenderSignup([]language.Tag, error, *otp.Key) string + RenderSignedup([]language.Tag, []string) string RenderWatchlist(datastructure.Watchlist, []language.Tag) string RenderTvQueue(datastructure.TvQueue, []language.Tag) string RenderExperiences(datastructure.Experiences, []language.Tag) string diff --git a/libamuse/signup.go b/libamuse/signup.go index 7530470cef7193767f8ad3fb5a54e512e11edb18..46179267413dd217fdeb36f171c749f0b59769e7 100644 --- a/libamuse/signup.go +++ b/libamuse/signup.go @@ -4,6 +4,7 @@ import ( "notabug.org/apiote/amuse/accounts" "errors" + "strings" "github.com/pquerna/otp" "github.com/pquerna/otp/totp" @@ -79,6 +80,28 @@ return accounts.Signup(username, password, sfaSecret) } -func ShowSignedup(acceptLanguages, mimetype string) (string, error) { - return "", nil +func renderSignedup(args ...interface{}) interface{} { + result := args[1].(*Result) + recoveryCodes := args[2].(string) + codes := []string{} + if recoveryCodes != "" { + codes = strings.Split(recoveryCodes, ",") + } + result.page = result.renderer.RenderSignedup(result.languages, codes) + return gott.Tuple(args) +} + +func ShowSignedup(acceptLanguages, mimetype, recoveryCodes string) (string, error) { + r, err := gott. + NewResult(gott.Tuple{&RequestData{language: acceptLanguages, mimetype: mimetype}, &Result{}, recoveryCodes}). + Bind(parseLanguage). + Bind(createRenderer). + Map(renderSignedup). + Finish() + + if err != nil { + return "", err + } else { + return r.(gott.Tuple)[1].(*Result).page, nil + } } diff --git a/router.go b/router.go index aea23fb0f278e2186bc4f0f83f05d0daf861289c..5fc3a84ea1453e367b729a9816dd01cba40ab4a9 100644 --- a/router.go +++ b/router.go @@ -270,16 +270,6 @@ } } } -func signedup(w http.ResponseWriter, r *http.Request) { - acceptLanguages := r.Header.Get("Accept-Language") - mimetype := strings.Split(r.Header.Get("Accept"), ",")[0] - - defer recovery(acceptLanguages, mimetype, w) - - signedup, err := libamuse.ShowSignedup(acceptLanguages, mimetype) - render(signedup, err, w, acceptLanguages, mimetype) -} - func signup(w http.ResponseWriter, r *http.Request) { acceptLanguages := r.Header.Get("Accept-Language") mimetype := strings.Split(r.Header.Get("Accept"), ",")[0] @@ -291,6 +281,17 @@ signupGet(w, r, acceptLanguages, mimetype) } else if r.Method == "POST" { signupPost(w, r, acceptLanguages, mimetype) } +} + +func signedup(w http.ResponseWriter, r *http.Request) { + acceptLanguages := r.Header.Get("Accept-Language") + mimetype := strings.Split(r.Header.Get("Accept"), ",")[0] + recoveryCodes := r.URL.Query().Get("recoveryCodes") + + defer recovery(acceptLanguages, mimetype, w) + + signedup, err := libamuse.ShowSignedup(acceptLanguages, mimetype, recoveryCodes) + render(signedup, err, w, acceptLanguages, mimetype) } func static(w http.ResponseWriter, r *http.Request) { diff --git a/static/style/style.css b/static/style/style.css index c7b85e9496c5751c14d7554ed1f7b973824d052b..f5a6f83d9d6485ba4cb4f70fd6cd2ec92d31131e 100644 --- a/static/style/style.css +++ b/static/style/style.css @@ -787,6 +787,10 @@ } /* FONT STYLE */ +.monospace { + font-family: monospace; +} + .sans { font-family: Fira Sans, sans-serif; } diff --git a/templates/signedup.html b/templates/signedup.html new file mode 100644 index 0000000000000000000000000000000000000000..30284a587ae656885c90432b56942c62b7c24e50 --- /dev/null +++ b/templates/signedup.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>a·muse</title> + <link rel="stylesheet" href="/static/style/style.css" /> + <link rel="icon" type="image/svg+xml" href="/static/img/logo.svg"> + <link rel="apple-touch-icon" type="image/svg+xml" href="/static/img/logo.svg"> + </head> + <body class="flex flex-column height-all"> + <header class="w12 padding-bottom-_25 flex flex-row flex-justify-space flex-align-centre flex-content"> + <a href="/" class="decoration-none"> + <h1 class="inline valign-mid text sans margin-lr-1">a·muse</h1> + </a> + </header> + <main class="margin-lr-1 flex-fill"> + <div class="flex flex-column height-fill flex-centre"> + <div class="w12 flex flex-centre border-box left"> + <div> + <div class="sans italic centre">„Welcome to Rivendell, Frodo Baggins.”</div> + <hr/> + {{if gt (len .Data) 0}} + <p class="sans">Your second factor recovery Codes are:<br/><br/> + {{range .Data}}<span class="monospace font-1">{{.}}</span><br/>{{end}} + <br/> + Copy them and keep safe.<br/> + You’ll need them if You lose Your second factor device.</p> + {{end}} + <p class="sans">Now, You can <a href="/login">log in</a> and be amused.</p> + </div> + </div> + </div> + </main> + </body> +</html>