|
|
@ -3,7 +3,6 @@ package controllers |
|
|
|
import ( |
|
|
|
"errors" |
|
|
|
"fmt" |
|
|
|
"log" |
|
|
|
"net/http" |
|
|
|
|
|
|
|
"git.kirsle.net/apps/gophertype/pkg/constants" |
|
|
@ -23,81 +22,86 @@ func init() { |
|
|
|
Middleware: []mux.MiddlewareFunc{ |
|
|
|
middleware.ExampleMiddleware, |
|
|
|
}, |
|
|
|
Handler: func(w http.ResponseWriter, r *http.Request) { |
|
|
|
// See if we already have an admin account.
|
|
|
|
if _, err := models.FirstAdmin(); err == nil { |
|
|
|
responses.Panic(w, http.StatusForbidden, "This site is already initialized.") |
|
|
|
return |
|
|
|
} |
|
|
|
Handler: InitialSetup, |
|
|
|
}) |
|
|
|
|
|
|
|
// Template variables.
|
|
|
|
v := responses.NewTemplateVars(w, r) |
|
|
|
v.SetupNeeded = false // supress the banner on this page.
|
|
|
|
} |
|
|
|
|
|
|
|
// POST handler: create the admin account.
|
|
|
|
for r.Method == http.MethodPost { |
|
|
|
form, err := forms.Parse(r) |
|
|
|
if err != nil { |
|
|
|
responses.Error(w, r, http.StatusBadRequest, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
// InitialSetup at "/admin/setup"
|
|
|
|
func InitialSetup(w http.ResponseWriter, r *http.Request) { |
|
|
|
// Template variables.
|
|
|
|
v := responses.NewTemplateVars(w, r) |
|
|
|
v.SetupNeeded = false // supress the banner on this page.
|
|
|
|
|
|
|
|
v.FormValues = form.Values |
|
|
|
// See if we already have an admin account.
|
|
|
|
if _, err := models.FirstAdmin(); err == nil { |
|
|
|
v.Message = "This site is already initialized." |
|
|
|
responses.Forbidden(w, r, "This site has already been initialized.") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// Validate form parameters.
|
|
|
|
val := form.Validator() |
|
|
|
val.Require("email") |
|
|
|
val.MatchEmail("email") |
|
|
|
val.MinLength("password", 8) |
|
|
|
val.Require("password2") |
|
|
|
val.Equal("password", "password2") |
|
|
|
if val.HasErrors() { |
|
|
|
v.Error = fmt.Errorf("validation error") |
|
|
|
v.ValidationError = val.ErrorMap() |
|
|
|
log.Printf("validation: %+v", v.ValidationError) |
|
|
|
break |
|
|
|
} |
|
|
|
// POST handler: create the admin account.
|
|
|
|
for r.Method == http.MethodPost { |
|
|
|
form, err := forms.Parse(r) |
|
|
|
if err != nil { |
|
|
|
responses.Error(w, r, http.StatusBadRequest, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
var ( |
|
|
|
email = form.Get("email") |
|
|
|
displayName = form.Get("name") |
|
|
|
password = form.Get("password") |
|
|
|
password2 = form.Get("password2") |
|
|
|
) |
|
|
|
v.FormValues = form.Values |
|
|
|
|
|
|
|
// Username and display name validation happens in CreateUser.
|
|
|
|
// Validate the passwords match here.
|
|
|
|
if len(password) < constants.PasswordMinLength { |
|
|
|
v.Error = fmt.Errorf("your password is too short (must be %d+ characters)", constants.PasswordMinLength) |
|
|
|
} |
|
|
|
if password != password2 { |
|
|
|
v.Error = errors.New("your passwords don't match") |
|
|
|
} else { |
|
|
|
admin := models.User{ |
|
|
|
Email: email, |
|
|
|
Name: displayName, |
|
|
|
IsAdmin: true, |
|
|
|
} |
|
|
|
admin.SetPassword(password) |
|
|
|
// Validate form parameters.
|
|
|
|
val := form.Validator() |
|
|
|
val.Require("email") |
|
|
|
val.MatchEmail("email") |
|
|
|
val.MinLength("password", 8) |
|
|
|
val.Require("password2") |
|
|
|
val.Equal("password", "password2") |
|
|
|
if val.HasErrors() { |
|
|
|
v.Error = fmt.Errorf("validation error") |
|
|
|
v.ValidationError = val.ErrorMap() |
|
|
|
break |
|
|
|
} |
|
|
|
|
|
|
|
if err := models.CreateUser(admin); err != nil { |
|
|
|
v.Error = err |
|
|
|
} else { |
|
|
|
// Admin created! Make the default config.
|
|
|
|
cfg := settings.Load() |
|
|
|
cfg.Initialized = true |
|
|
|
cfg.Save() |
|
|
|
var ( |
|
|
|
email = form.Get("email") |
|
|
|
displayName = form.Get("name") |
|
|
|
password = form.Get("password") |
|
|
|
password2 = form.Get("password2") |
|
|
|
) |
|
|
|
|
|
|
|
responses.Redirect(w, r, "/login") |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
// Username and display name validation happens in CreateUser.
|
|
|
|
// Validate the passwords match here.
|
|
|
|
if len(password) < constants.PasswordMinLength { |
|
|
|
v.Error = fmt.Errorf("your password is too short (must be %d+ characters)", constants.PasswordMinLength) |
|
|
|
} |
|
|
|
if password != password2 { |
|
|
|
v.Error = errors.New("your passwords don't match") |
|
|
|
} else { |
|
|
|
admin := models.User{ |
|
|
|
Email: email, |
|
|
|
Name: displayName, |
|
|
|
IsAdmin: true, |
|
|
|
} |
|
|
|
admin.SetPassword(password) |
|
|
|
|
|
|
|
break |
|
|
|
if err := models.CreateUser(admin); err != nil { |
|
|
|
v.Error = err |
|
|
|
} else { |
|
|
|
// Admin created! Make the default config.
|
|
|
|
cfg := settings.Load() |
|
|
|
cfg.Initialized = true |
|
|
|
if err := cfg.Save(); err != nil { |
|
|
|
v.Error = err |
|
|
|
} else { |
|
|
|
responses.Redirect(w, r, "/login") |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
responses.RenderTemplate(w, r, "_builtin/initial_setup.gohtml", v) |
|
|
|
}, |
|
|
|
}) |
|
|
|
break |
|
|
|
} |
|
|
|
|
|
|
|
responses.RenderTemplate(w, r, "_builtin/initial_setup.gohtml", v) |
|
|
|
} |
|
|
|