diff --git a/pages/landing.tmpl b/pages/landing.tmpl index 397a261..ea72792 100644 --- a/pages/landing.tmpl +++ b/pages/landing.tmpl @@ -1,117 +1,195 @@ {{define "head"}} {{.SiteName}} {{end}} {{define "content"}}
-

{{if .Federation}}Start your blog in the fediverse{{else}}Start your minimalist blog{{end}}

-

Learn more...

+

{{if .Federation}}Start your blog in the fediverse{{else}}Start your blog{{end}}

+

Learn more...

{{if .Flashes}}
    {{range .Flashes}}
  • {{.}}
  • {{end}}
{{end}}
-
+
{{if .Federation}}
{{end}}
{{ if .Federation }}

Join the Fediverse

The fediverse is a large network of platforms that all speak a common language. Imagine if you could reply to Instagram posts from Twitter, or interact with your favorite Medium blogs from Facebook — federated alternatives like PixelFed, Mastodon, and Write Freely enable you to do these types of things.

Write More Socially

Write Freely can communicate with other federated platforms like Mastodon, so people can follow your blogs, bookmark their favorite posts, and boost them to their followers. Sign up above to create a blog and join the fediverse.

{{ end }} + + + {{end}} diff --git a/unregisteredusers.go b/unregisteredusers.go index 8cd3dec..bf4227b 100644 --- a/unregisteredusers.go +++ b/unregisteredusers.go @@ -1,121 +1,130 @@ package writefreely import ( "database/sql" "encoding/json" "github.com/writeas/impart" "github.com/writeas/web-core/log" "net/http" ) func handleWebSignup(app *app, w http.ResponseWriter, r *http.Request) error { reqJSON := IsJSON(r.Header.Get("Content-Type")) // Get params var ur userRegistration if reqJSON { decoder := json.NewDecoder(r.Body) err := decoder.Decode(&ur) if err != nil { log.Error("Couldn't parse signup JSON request: %v\n", err) return ErrBadJSON } } else { err := r.ParseForm() if err != nil { log.Error("Couldn't parse signup form request: %v\n", err) return ErrBadFormData } err = app.formDecoder.Decode(&ur, r.PostForm) if err != nil { log.Error("Couldn't decode signup form request: %v\n", err) return ErrBadFormData } } ur.Web = true + ur.Normalize = true _, err := signupWithRegistration(app, ur, w, r) if err != nil { + if err, ok := err.(impart.HTTPError); ok { + session, _ := app.sessionStore.Get(r, cookieName) + if session != nil { + session.AddFlash(err.Message) + session.Save(r, w) + return impart.HTTPError{http.StatusFound, "/"} + } + } return err } return impart.HTTPError{http.StatusFound, "/"} } // { "username": "asdf" } // result: { code: 204 } func handleUsernameCheck(app *app, w http.ResponseWriter, r *http.Request) error { reqJSON := IsJSON(r.Header.Get("Content-Type")) // Get params var d struct { Username string `json:"username"` } if reqJSON { decoder := json.NewDecoder(r.Body) err := decoder.Decode(&d) if err != nil { log.Error("Couldn't decode username check: %v\n", err) return ErrBadFormData } } else { return impart.HTTPError{http.StatusNotAcceptable, "Must be JSON request"} } // Check if username is okay finalUsername := getSlug(d.Username, "") if finalUsername == "" { errMsg := "Invalid username" if d.Username != "" { // Username was provided, but didn't convert into valid latin characters errMsg += " - must have at least 2 letters or numbers" } return impart.HTTPError{http.StatusBadRequest, errMsg + "."} } if app.db.PostIDExists(finalUsername) { return impart.HTTPError{http.StatusConflict, "Username is already taken."} } var un string err := app.db.QueryRow("SELECT username FROM users WHERE username = ?", finalUsername).Scan(&un) switch { case err == sql.ErrNoRows: return impart.WriteSuccess(w, finalUsername, http.StatusOK) case err != nil: log.Error("Couldn't SELECT username: %v", err) return impart.HTTPError{http.StatusInternalServerError, "We messed up."} } // Username was found, so it's taken return impart.HTTPError{http.StatusConflict, "Username is already taken."} } func getValidUsername(app *app, reqName, prevName string) (string, *impart.HTTPError) { // Check if username is okay finalUsername := getSlug(reqName, "") if finalUsername == "" { errMsg := "Invalid username" if reqName != "" { // Username was provided, but didn't convert into valid latin characters errMsg += " - must have at least 2 letters or numbers" } return "", &impart.HTTPError{http.StatusBadRequest, errMsg + "."} } if finalUsername == prevName { return "", &impart.HTTPError{http.StatusNotModified, "Username unchanged."} } if app.db.PostIDExists(finalUsername) { return "", &impart.HTTPError{http.StatusConflict, "Username is already taken."} } var un string err := app.db.QueryRow("SELECT username FROM users WHERE username = ?", finalUsername).Scan(&un) switch { case err == sql.ErrNoRows: return finalUsername, nil case err != nil: log.Error("Couldn't SELECT username: %v", err) return "", &impart.HTTPError{http.StatusInternalServerError, "We messed up."} } // Username was found, so it's taken return "", &impart.HTTPError{http.StatusConflict, "Username is already taken."} }