commit
f42a813516
@ -17,6 +17,69 @@ func LoginGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
|||||||
return e.Rends(w, r, "users/login")
|
return e.Rends(w, r, "users/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SignupGETHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||||
|
return e.Rends(w, r, "users/signup")
|
||||||
|
}
|
||||||
|
|
||||||
|
func SignupPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||||
|
type newForm struct {
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
PasswordVerify string
|
||||||
|
}
|
||||||
|
e.Log.Debugf("creating new user ...")
|
||||||
|
|
||||||
|
err := r.ParseForm()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
form := new(newForm)
|
||||||
|
decoder := schema.NewDecoder()
|
||||||
|
err = decoder.Decode(form, r.PostForm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
user := User{
|
||||||
|
Name: form.Username,
|
||||||
|
}
|
||||||
|
if form.Password != "" || form.PasswordVerify != "" {
|
||||||
|
if form.Password != form.PasswordVerify {
|
||||||
|
data.SetData(r, "Errors", "Password mismatch")
|
||||||
|
return e.Rends(w, r, "users/signup")
|
||||||
|
}
|
||||||
|
user.Hash, err = e.Auth.GenHash(form.Password)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = user.NewConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = user.Add(e.Database)
|
||||||
|
if err != nil {
|
||||||
|
pretty.Println(err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
e.Log.Debugf("new user %s created ...", form.Username)
|
||||||
|
|
||||||
|
err = e.Auth.Login(w, r, form.Username, form.Password)
|
||||||
|
if err != nil {
|
||||||
|
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
|
||||||
|
data.SetData(r, "Errors", "Error invalid user or password")
|
||||||
|
return e.Rends(w, r, "users/signup")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error {
|
||||||
type loginForm struct {
|
type loginForm struct {
|
||||||
Username string
|
Username string
|
||||||
@ -38,7 +101,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
|
|||||||
err = e.Auth.Login(w, r, form.Username, form.Password)
|
err = e.Auth.Login(w, r, form.Username, form.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
|
if err == auth.ErrInvalidPassword || err == ErrUnknownUser {
|
||||||
data.SetData(r, "FormErrors", "Error invalid user or password")
|
data.SetData(r, "Errors", "Error invalid user or password")
|
||||||
return e.Rends(w, r, "users/login")
|
return e.Rends(w, r, "users/login")
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@ -49,6 +112,7 @@ func LoginPOSTHandler(e *web.Env, w http.ResponseWriter, r *http.Request) error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Log.Debugf("redirecting to %s", path)
|
e.Log.Debugf("redirecting to %s", path)
|
||||||
if path != "" {
|
if path != "" {
|
||||||
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
|
http.Redirect(w, r, path, http.StatusTemporaryRedirect)
|
||||||
|
@ -75,6 +75,17 @@ func (u *User) SetConfig(key string, v interface{}) error {
|
|||||||
return u.RawConfig.UnmarshalJSON(b)
|
return u.RawConfig.UnmarshalJSON(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewConfig creates a new empty config
|
||||||
|
func (u *User) NewConfig() error {
|
||||||
|
var configMap map[string]*json.RawMessage
|
||||||
|
b, err := json.Marshal(configMap)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.RawConfig.UnmarshalJSON(b)
|
||||||
|
}
|
||||||
|
|
||||||
// Token represents a token
|
// Token represents a token
|
||||||
type Token struct {
|
type Token struct {
|
||||||
sqly.BaseModel
|
sqly.BaseModel
|
||||||
|
@ -72,6 +72,8 @@ func main() {
|
|||||||
env.Handle("/", movies.ExplorePopular).Name("movies.home")
|
env.Handle("/", movies.ExplorePopular).Name("movies.home")
|
||||||
env.Handle("/users/login", users.LoginGETHandler).Name("users.login").Methods("GET")
|
env.Handle("/users/login", users.LoginGETHandler).Name("users.login").Methods("GET")
|
||||||
env.Handle("/users/login", users.LoginPOSTHandler).Name("users.login").Methods("POST")
|
env.Handle("/users/login", users.LoginPOSTHandler).Name("users.login").Methods("POST")
|
||||||
|
env.Handle("/users/signup", users.SignupGETHandler).Name("users.signup").Methods("GET")
|
||||||
|
env.Handle("/users/signup", users.SignupPOSTHandler).Name("users.signup").Methods("POST")
|
||||||
env.Handle("/users/logout", users.LogoutHandler).Name("users.logout")
|
env.Handle("/users/logout", users.LogoutHandler).Name("users.logout")
|
||||||
env.Handle("/users/details", users.DetailsHandler).Name("users.details").WithRole(users.UserRole)
|
env.Handle("/users/details", users.DetailsHandler).Name("users.details").WithRole(users.UserRole)
|
||||||
env.Handle("/users/edit", users.EditHandler).Name("users.edit").WithRole(users.UserRole)
|
env.Handle("/users/edit", users.EditHandler).Name("users.edit").WithRole(users.UserRole)
|
||||||
|
9
src/templates/errors.tmpl
Normal file
9
src/templates/errors.tmpl
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{{ if $.Data.Errors }}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 col-md-offset-3 col-xs-12">
|
||||||
|
<div class="alert alert-warning">
|
||||||
|
<p>{{ $.Data.Errors }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
{{ template "errors" $ }}
|
||||||
|
{{ template "success" $ }}
|
||||||
{{ template "navbar" $ }}
|
{{ template "navbar" $ }}
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<nav class="navbar navbar-inverse navbar-fixed-top">
|
<nav class="navbar navbar-inverse navbar-fixed-top">
|
||||||
|
<div class="container">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<!-- Brand and toggle get grouped for better mobile display -->
|
<!-- Brand and toggle get grouped for better mobile display -->
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
@ -14,17 +15,27 @@
|
|||||||
<!-- Collect the nav links, forms, and other content for toggling -->
|
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||||
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||||
<ul class="nav navbar-nav">
|
<ul class="nav navbar-nav">
|
||||||
<li><p class="navbar-text">Library: </p></li>
|
|
||||||
<li {{ if eq $.Route "movies.polochon" }}class="active"{{ end }}>
|
|
||||||
<a href="{{ URL "movies.polochon" }}?limit=10">Movies{{ if eq $.Route "movies.polochon" }}<span class="sr-only">(current)</span>{{ end }}</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li><a href="#">TV Shows</a></li>
|
|
||||||
|
|
||||||
<li><p class="navbar-text">Explore: </p></li>
|
|
||||||
<li><a href="{{ URL "movies.explore.popular"}}">Movies</a></li>
|
<li><a href="{{ URL "movies.explore.popular"}}">Movies</a></li>
|
||||||
<li><a href="#">TV Shows</a></li>
|
<li><a href="#">TV Shows</a></li>
|
||||||
|
{{ if $.Data.user }}
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<i class="fa fa-list"></i>
|
||||||
|
My Library
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu">
|
||||||
|
<li {{ if eq $.Route "movies.polochon" }}class="active"{{ end }}>
|
||||||
|
<a href="{{ URL "movies.polochon" }}?limit=10">Movies{{ if eq $.Route "movies.polochon" }}<span class="sr-only">Movies</span>{{ end }}</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">
|
||||||
|
TVShows
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
@ -45,14 +56,16 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<ul class="nav navbar-nav navbar-right">
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ URL "users.login"}}">Sign in</a>
|
<a href="{{ URL "users.login"}}">Sign in</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
<li>
|
||||||
|
<a href="{{ URL "users.signup"}}">Sign up</a>
|
||||||
|
</li>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</div><!-- /.navbar-collapse -->
|
</div><!-- /.navbar-collapse -->
|
||||||
</div><!-- /.container-fluid -->
|
</div><!-- /.container-fluid -->
|
||||||
|
</div><!-- /.container -->
|
||||||
</nav>
|
</nav>
|
||||||
|
9
src/templates/success.tmpl
Normal file
9
src/templates/success.tmpl
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{{ if $.Data.Success }}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<div class="alert alert-success">
|
||||||
|
{{ $.Data.Success }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
39
src/templates/users/signup.tmpl
Normal file
39
src/templates/users/signup.tmpl
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<div class="container">
|
||||||
|
<div class="content-fluid">
|
||||||
|
<div class="col-md-6 col-md-offset-3 col-xs-12">
|
||||||
|
<h2>Sign up</h2>
|
||||||
|
<hr>
|
||||||
|
<form accept-charset="UTF-8" action="{{ URL "users.signup" }}" method="POST" class="form-horizontal" id="new_user">
|
||||||
|
<div>
|
||||||
|
<p class="">
|
||||||
|
<label for="user_email">Username</label>
|
||||||
|
<br>
|
||||||
|
<input autofocus="autofocus" class="form-control" id="username" name="Username" type="username" value="">
|
||||||
|
<span class="error"></span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="">
|
||||||
|
<label for="user_password">Password</label>
|
||||||
|
<br>
|
||||||
|
<input autocomplete="off" class="form-control" id="password" name="Password" type="password" value="">
|
||||||
|
<span class="error"></span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p class="">
|
||||||
|
<label for="user_password">Confirm Password</label>
|
||||||
|
<br>
|
||||||
|
<input autocomplete="off" class="form-control" id="passwordVerify" name="PasswordVerify" type="password" value="">
|
||||||
|
<span class="error"></span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<input class="btn btn-primary pull-right" type="submit" value="Sign up">
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
<a class="btn btn-default btn-sm pull-left" href="/movies/%3cnil%3e">Cancel</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
Loading…
x
Reference in New Issue
Block a user