mirror of
https://github.com/osmarks/mycorrhiza.git
synced 2025-07-05 11:02:49 +00:00
Implement logging out
This commit is contained in:
parent
a0d1099b75
commit
f4ba0f5498
62
http_auth.go
Normal file
62
http_auth.go
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/bouncepaw/mycorrhiza/templates"
|
||||||
|
"github.com/bouncepaw/mycorrhiza/user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
http.HandleFunc("/login", handlerLogin)
|
||||||
|
http.HandleFunc("/login-data", handlerLoginData)
|
||||||
|
http.HandleFunc("/logout", handlerLogout)
|
||||||
|
http.HandleFunc("/logout-confirm", handlerLogoutConfirm)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handlerLogout(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
var (
|
||||||
|
u = user.FromRequest(rq)
|
||||||
|
can = u != nil
|
||||||
|
)
|
||||||
|
w.Header().Set("Content-Type", "text/html;charset=utf-8")
|
||||||
|
if can {
|
||||||
|
log.Println("User", u.Name, "tries to log out")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
} else {
|
||||||
|
log.Println("Unknown user tries to log out")
|
||||||
|
w.WriteHeader(http.StatusForbidden)
|
||||||
|
}
|
||||||
|
w.Write([]byte(base("Logout?", templates.LogoutHTML(can))))
|
||||||
|
}
|
||||||
|
|
||||||
|
func handlerLogoutConfirm(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
user.LogoutFromRequest(w, rq)
|
||||||
|
http.Redirect(w, rq, "/", http.StatusSeeOther)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handlerLoginData(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
log.Println(rq.URL)
|
||||||
|
var (
|
||||||
|
username = CanonicalName(rq.PostFormValue("username"))
|
||||||
|
password = rq.PostFormValue("password")
|
||||||
|
err = user.LoginDataHTTP(w, rq, username, password)
|
||||||
|
)
|
||||||
|
if err != "" {
|
||||||
|
w.Write([]byte(base(err, templates.LoginErrorHTML(err))))
|
||||||
|
} else {
|
||||||
|
http.Redirect(w, rq, "/", http.StatusSeeOther)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handlerLogin(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
log.Println(rq.URL)
|
||||||
|
w.Header().Set("Content-Type", "text/html;charset=utf-8")
|
||||||
|
if user.AuthUsed {
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusForbidden)
|
||||||
|
}
|
||||||
|
w.Write([]byte(base("Login", templates.LoginHTML())))
|
||||||
|
}
|
29
main.go
29
main.go
@ -15,7 +15,6 @@ import (
|
|||||||
|
|
||||||
"github.com/bouncepaw/mycorrhiza/history"
|
"github.com/bouncepaw/mycorrhiza/history"
|
||||||
"github.com/bouncepaw/mycorrhiza/templates"
|
"github.com/bouncepaw/mycorrhiza/templates"
|
||||||
"github.com/bouncepaw/mycorrhiza/user"
|
|
||||||
"github.com/bouncepaw/mycorrhiza/util"
|
"github.com/bouncepaw/mycorrhiza/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -110,31 +109,6 @@ func handlerStyle(w http.ResponseWriter, rq *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handlerLoginData(w http.ResponseWriter, rq *http.Request) {
|
|
||||||
log.Println(rq.URL)
|
|
||||||
var (
|
|
||||||
username = CanonicalName(rq.PostFormValue("username"))
|
|
||||||
password = rq.PostFormValue("password")
|
|
||||||
err = user.LoginDataHTTP(w, rq, username, password)
|
|
||||||
)
|
|
||||||
if err != "" {
|
|
||||||
w.Write([]byte(base(err, templates.LoginErrorHTML(err))))
|
|
||||||
} else {
|
|
||||||
http.Redirect(w, rq, "/", http.StatusSeeOther)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handlerLogin(w http.ResponseWriter, rq *http.Request) {
|
|
||||||
log.Println(rq.URL)
|
|
||||||
w.Header().Set("Content-Type", "text/html;charset=utf-8")
|
|
||||||
if user.AuthUsed {
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
} else {
|
|
||||||
w.WriteHeader(http.StatusForbidden)
|
|
||||||
}
|
|
||||||
w.Write([]byte(base("Login", templates.LoginHTML())))
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("Running MycorrhizaWiki β")
|
log.Println("Running MycorrhizaWiki β")
|
||||||
parseCliArgs()
|
parseCliArgs()
|
||||||
@ -151,6 +125,7 @@ func main() {
|
|||||||
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(WikiDir+"/static"))))
|
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(WikiDir+"/static"))))
|
||||||
// See http_readers.go for /page/, /text/, /binary/, /history/.
|
// See http_readers.go for /page/, /text/, /binary/, /history/.
|
||||||
// See http_mutators.go for /upload-binary/, /upload-text/, /edit/, /delete-ask/, /delete-confirm/, /rename-ask/, /rename-confirm/.
|
// See http_mutators.go for /upload-binary/, /upload-text/, /edit/, /delete-ask/, /delete-confirm/, /rename-ask/, /rename-confirm/.
|
||||||
|
// See http_auth.go for /login, /login-data, /logout, /logout-confirm
|
||||||
http.HandleFunc("/list", handlerList)
|
http.HandleFunc("/list", handlerList)
|
||||||
http.HandleFunc("/reindex", handlerReindex)
|
http.HandleFunc("/reindex", handlerReindex)
|
||||||
http.HandleFunc("/random", handlerRandom)
|
http.HandleFunc("/random", handlerRandom)
|
||||||
@ -159,8 +134,6 @@ func main() {
|
|||||||
http.ServeFile(w, rq, WikiDir+"/static/favicon.ico")
|
http.ServeFile(w, rq, WikiDir+"/static/favicon.ico")
|
||||||
})
|
})
|
||||||
http.HandleFunc("/static/common.css", handlerStyle)
|
http.HandleFunc("/static/common.css", handlerStyle)
|
||||||
http.HandleFunc("/login", handlerLogin)
|
|
||||||
http.HandleFunc("/login-data", handlerLoginData)
|
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, rq *http.Request) {
|
http.HandleFunc("/", func(w http.ResponseWriter, rq *http.Request) {
|
||||||
http.Redirect(w, rq, "/page/"+util.HomePage, http.StatusSeeOther)
|
http.Redirect(w, rq, "/page/"+util.HomePage, http.StatusSeeOther)
|
||||||
})
|
})
|
||||||
|
@ -43,3 +43,18 @@
|
|||||||
</main>
|
</main>
|
||||||
{% endfunc %}
|
{% endfunc %}
|
||||||
|
|
||||||
|
{% func LogoutHTML(can bool) %}
|
||||||
|
<main>
|
||||||
|
<section>
|
||||||
|
{% if can %}
|
||||||
|
<h1>Log out?</h1>
|
||||||
|
<p><a href="/logout-confirm"><strong>Confirm</strong></a></p>
|
||||||
|
<p><a href="/">Cancel</a></p>
|
||||||
|
{% else %}
|
||||||
|
<p>You cannot log out because you are not logged in.</p>
|
||||||
|
<p><a href="/login">Login</a></p>
|
||||||
|
<p><a href="/login">← Home</a></p>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
{% endfunc %}
|
218
templates/auth.qtpl.go
Normal file
218
templates/auth.qtpl.go
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
// Code generated by qtc from "auth.qtpl". DO NOT EDIT.
|
||||||
|
// See https://github.com/valyala/quicktemplate for details.
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:1
|
||||||
|
package templates
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:1
|
||||||
|
import "github.com/bouncepaw/mycorrhiza/user"
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:3
|
||||||
|
import (
|
||||||
|
qtio422016 "io"
|
||||||
|
|
||||||
|
qt422016 "github.com/valyala/quicktemplate"
|
||||||
|
)
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:3
|
||||||
|
var (
|
||||||
|
_ = qtio422016.Copy
|
||||||
|
_ = qt422016.AcquireByteBuffer
|
||||||
|
)
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:3
|
||||||
|
func StreamLoginHTML(qw422016 *qt422016.Writer) {
|
||||||
|
//line templates/auth.qtpl:3
|
||||||
|
qw422016.N().S(`
|
||||||
|
<main>
|
||||||
|
<section>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:6
|
||||||
|
if user.AuthUsed {
|
||||||
|
//line templates/auth.qtpl:6
|
||||||
|
qw422016.N().S(`
|
||||||
|
<h1>Login</h1>
|
||||||
|
<form method="post" action="/login-data" id="login-form" enctype="multipart/form-data">
|
||||||
|
<p>Use the data you were given by the administrator.</p>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Username</legend>
|
||||||
|
<input type="text" required autofocus name="username" autocomplete="on">
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Password</legend>
|
||||||
|
<input type="password" required name="password" autocomplete="on">
|
||||||
|
</fieldset>
|
||||||
|
<p>By submitting this form you give this wiki a permission to store cookies in your browser. It lets the engine associate your edits with you.</p>
|
||||||
|
<input type="submit">
|
||||||
|
<a href="/">Cancel</a>
|
||||||
|
</form>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:22
|
||||||
|
} else {
|
||||||
|
//line templates/auth.qtpl:22
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p>Administrator of this wiki have not configured any authorization method. You can make edits anonymously.</p>
|
||||||
|
<p><a href="/">← Go home</a></p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:25
|
||||||
|
}
|
||||||
|
//line templates/auth.qtpl:25
|
||||||
|
qw422016.N().S(`
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
func WriteLoginHTML(qq422016 qtio422016.Writer) {
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
StreamLoginHTML(qw422016)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
func LoginHTML() string {
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
WriteLoginHTML(qb422016)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
return qs422016
|
||||||
|
//line templates/auth.qtpl:28
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:30
|
||||||
|
func StreamLoginErrorHTML(qw422016 *qt422016.Writer, err string) {
|
||||||
|
//line templates/auth.qtpl:30
|
||||||
|
qw422016.N().S(`
|
||||||
|
<main>
|
||||||
|
<section>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:33
|
||||||
|
switch err {
|
||||||
|
//line templates/auth.qtpl:34
|
||||||
|
case "unknown username":
|
||||||
|
//line templates/auth.qtpl:34
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p class="error">Unknown username.</p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:36
|
||||||
|
case "wrong password":
|
||||||
|
//line templates/auth.qtpl:36
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p class="error">Wrong password.</p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:38
|
||||||
|
default:
|
||||||
|
//line templates/auth.qtpl:38
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p class="error">`)
|
||||||
|
//line templates/auth.qtpl:39
|
||||||
|
qw422016.E().S(err)
|
||||||
|
//line templates/auth.qtpl:39
|
||||||
|
qw422016.N().S(`</p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:40
|
||||||
|
}
|
||||||
|
//line templates/auth.qtpl:40
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p><a href="/login">← Try again</a></p>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
func WriteLoginErrorHTML(qq422016 qtio422016.Writer, err string) {
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
StreamLoginErrorHTML(qw422016, err)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
func LoginErrorHTML(err string) string {
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
WriteLoginErrorHTML(qb422016, err)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
return qs422016
|
||||||
|
//line templates/auth.qtpl:44
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:46
|
||||||
|
func StreamLogoutHTML(qw422016 *qt422016.Writer, can bool) {
|
||||||
|
//line templates/auth.qtpl:46
|
||||||
|
qw422016.N().S(`
|
||||||
|
<main>
|
||||||
|
<section>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:49
|
||||||
|
if can {
|
||||||
|
//line templates/auth.qtpl:49
|
||||||
|
qw422016.N().S(`
|
||||||
|
<h1>Log out?</h1>
|
||||||
|
<p><a href="/logout-confirm"><strong>Confirm</strong></a></p>
|
||||||
|
<p><a href="/">Cancel</a></p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:53
|
||||||
|
} else {
|
||||||
|
//line templates/auth.qtpl:53
|
||||||
|
qw422016.N().S(`
|
||||||
|
<p>You cannot log out because you are not logged in.</p>
|
||||||
|
<p><a href="/login">Login</a></p>
|
||||||
|
<p><a href="/login">← Home</a></p>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:57
|
||||||
|
}
|
||||||
|
//line templates/auth.qtpl:57
|
||||||
|
qw422016.N().S(`
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
`)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
func WriteLogoutHTML(qq422016 qtio422016.Writer, can bool) {
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
qw422016 := qt422016.AcquireWriter(qq422016)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
StreamLogoutHTML(qw422016, can)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
qt422016.ReleaseWriter(qw422016)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
}
|
||||||
|
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
func LogoutHTML(can bool) string {
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
qb422016 := qt422016.AcquireByteBuffer()
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
WriteLogoutHTML(qb422016, can)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
qs422016 := string(qb422016.B)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
qt422016.ReleaseByteBuffer(qb422016)
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
return qs422016
|
||||||
|
//line templates/auth.qtpl:60
|
||||||
|
}
|
@ -1,159 +0,0 @@
|
|||||||
// Code generated by qtc from "login.qtpl". DO NOT EDIT.
|
|
||||||
// See https://github.com/valyala/quicktemplate for details.
|
|
||||||
|
|
||||||
//line templates/login.qtpl:1
|
|
||||||
package templates
|
|
||||||
|
|
||||||
//line templates/login.qtpl:1
|
|
||||||
import "github.com/bouncepaw/mycorrhiza/user"
|
|
||||||
|
|
||||||
//line templates/login.qtpl:3
|
|
||||||
import (
|
|
||||||
qtio422016 "io"
|
|
||||||
|
|
||||||
qt422016 "github.com/valyala/quicktemplate"
|
|
||||||
)
|
|
||||||
|
|
||||||
//line templates/login.qtpl:3
|
|
||||||
var (
|
|
||||||
_ = qtio422016.Copy
|
|
||||||
_ = qt422016.AcquireByteBuffer
|
|
||||||
)
|
|
||||||
|
|
||||||
//line templates/login.qtpl:3
|
|
||||||
func StreamLoginHTML(qw422016 *qt422016.Writer) {
|
|
||||||
//line templates/login.qtpl:3
|
|
||||||
qw422016.N().S(`
|
|
||||||
<main>
|
|
||||||
<section>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:6
|
|
||||||
if user.AuthUsed {
|
|
||||||
//line templates/login.qtpl:6
|
|
||||||
qw422016.N().S(`
|
|
||||||
<h1>Login</h1>
|
|
||||||
<form method="post" action="/login-data" id="login-form" enctype="multipart/form-data">
|
|
||||||
<p>Use the data you were given by the administrator.</p>
|
|
||||||
<fieldset>
|
|
||||||
<legend>Username</legend>
|
|
||||||
<input type="text" required autofocus name="username" autocomplete="on">
|
|
||||||
</fieldset>
|
|
||||||
<fieldset>
|
|
||||||
<legend>Password</legend>
|
|
||||||
<input type="password" required name="password" autocomplete="on">
|
|
||||||
</fieldset>
|
|
||||||
<p>By submitting this form you give this wiki a permission to store cookies in your browser. It lets the engine associate your edits with you.</p>
|
|
||||||
<input type="submit">
|
|
||||||
<a href="/">Cancel</a>
|
|
||||||
</form>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:22
|
|
||||||
} else {
|
|
||||||
//line templates/login.qtpl:22
|
|
||||||
qw422016.N().S(`
|
|
||||||
<p>Administrator of this wiki have not configured any authorization method. You can make edits anonymously.</p>
|
|
||||||
<p><a href="/">← Go home</a></p>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:25
|
|
||||||
}
|
|
||||||
//line templates/login.qtpl:25
|
|
||||||
qw422016.N().S(`
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
}
|
|
||||||
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
func WriteLoginHTML(qq422016 qtio422016.Writer) {
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
StreamLoginHTML(qw422016)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
qt422016.ReleaseWriter(qw422016)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
}
|
|
||||||
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
func LoginHTML() string {
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
WriteLoginHTML(qb422016)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
qs422016 := string(qb422016.B)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
return qs422016
|
|
||||||
//line templates/login.qtpl:28
|
|
||||||
}
|
|
||||||
|
|
||||||
//line templates/login.qtpl:30
|
|
||||||
func StreamLoginErrorHTML(qw422016 *qt422016.Writer, err string) {
|
|
||||||
//line templates/login.qtpl:30
|
|
||||||
qw422016.N().S(`
|
|
||||||
<main>
|
|
||||||
<section>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:33
|
|
||||||
switch err {
|
|
||||||
//line templates/login.qtpl:34
|
|
||||||
case "unknown username":
|
|
||||||
//line templates/login.qtpl:34
|
|
||||||
qw422016.N().S(`
|
|
||||||
<p class="error">Unknown username.</p>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:36
|
|
||||||
case "wrong password":
|
|
||||||
//line templates/login.qtpl:36
|
|
||||||
qw422016.N().S(`
|
|
||||||
<p class="error">Wrong password.</p>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:38
|
|
||||||
default:
|
|
||||||
//line templates/login.qtpl:38
|
|
||||||
qw422016.N().S(`
|
|
||||||
<p class="error">`)
|
|
||||||
//line templates/login.qtpl:39
|
|
||||||
qw422016.E().S(err)
|
|
||||||
//line templates/login.qtpl:39
|
|
||||||
qw422016.N().S(`</p>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:40
|
|
||||||
}
|
|
||||||
//line templates/login.qtpl:40
|
|
||||||
qw422016.N().S(`
|
|
||||||
<p><a href="/login">← Try again</a></p>
|
|
||||||
</section>
|
|
||||||
</main>
|
|
||||||
`)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
}
|
|
||||||
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
func WriteLoginErrorHTML(qq422016 qtio422016.Writer, err string) {
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
qw422016 := qt422016.AcquireWriter(qq422016)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
StreamLoginErrorHTML(qw422016, err)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
qt422016.ReleaseWriter(qw422016)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
}
|
|
||||||
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
func LoginErrorHTML(err string) string {
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
qb422016 := qt422016.AcquireByteBuffer()
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
WriteLoginErrorHTML(qb422016, err)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
qs422016 := string(qb422016.B)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
qt422016.ReleaseByteBuffer(qb422016)
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
return qs422016
|
|
||||||
//line templates/login.qtpl:44
|
|
||||||
}
|
|
37
user/user.go
37
user/user.go
@ -10,6 +10,29 @@ import (
|
|||||||
"github.com/bouncepaw/mycorrhiza/util"
|
"github.com/bouncepaw/mycorrhiza/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func LogoutFromRequest(w http.ResponseWriter, rq *http.Request) {
|
||||||
|
cookieFromUser, err := rq.Cookie("mycorrhiza_token")
|
||||||
|
if err == nil {
|
||||||
|
http.SetCookie(w, cookie("token", "", time.Unix(0, 0)))
|
||||||
|
terminateSession(cookieFromUser.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (us *FixedUserStorage) userByToken(token string) *User {
|
||||||
|
if user, ok := us.Tokens[token]; ok {
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func FromRequest(rq *http.Request) *User {
|
||||||
|
cookie, err := rq.Cookie("mycorrhiza_token")
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return UserStorage.userByToken(cookie.Value)
|
||||||
|
}
|
||||||
|
|
||||||
func LoginDataHTTP(w http.ResponseWriter, rq *http.Request, username, password string) string {
|
func LoginDataHTTP(w http.ResponseWriter, rq *http.Request, username, password string) string {
|
||||||
w.Header().Set("Content-Type", "text/html;charset=utf-8")
|
w.Header().Set("Content-Type", "text/html;charset=utf-8")
|
||||||
if !HasUsername(username) {
|
if !HasUsername(username) {
|
||||||
@ -36,12 +59,20 @@ func LoginDataHTTP(w http.ResponseWriter, rq *http.Request, username, password s
|
|||||||
func AddSession(username string) (string, error) {
|
func AddSession(username string) (string, error) {
|
||||||
token, err := util.RandomString(16)
|
token, err := util.RandomString(16)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
UserStorage.Tokens[token] = username
|
for _, user := range UserStorage.Users {
|
||||||
|
if user.Name == username {
|
||||||
|
UserStorage.Tokens[token] = user
|
||||||
|
}
|
||||||
|
}
|
||||||
log.Println("New token for", username, "is", token)
|
log.Println("New token for", username, "is", token)
|
||||||
}
|
}
|
||||||
return token, err
|
return token, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func terminateSession(token string) {
|
||||||
|
delete(UserStorage.Tokens, token)
|
||||||
|
}
|
||||||
|
|
||||||
func HasUsername(username string) bool {
|
func HasUsername(username string) bool {
|
||||||
for _, user := range UserStorage.Users {
|
for _, user := range UserStorage.Users {
|
||||||
if user.Name == username {
|
if user.Name == username {
|
||||||
@ -62,10 +93,10 @@ func CredentialsOK(username, password string) bool {
|
|||||||
|
|
||||||
type FixedUserStorage struct {
|
type FixedUserStorage struct {
|
||||||
Users []*User
|
Users []*User
|
||||||
Tokens map[string]string
|
Tokens map[string]*User
|
||||||
}
|
}
|
||||||
|
|
||||||
var UserStorage = FixedUserStorage{Tokens: make(map[string]string)}
|
var UserStorage = FixedUserStorage{Tokens: make(map[string]*User)}
|
||||||
|
|
||||||
func PopulateFixedUserStorage() {
|
func PopulateFixedUserStorage() {
|
||||||
contents, err := ioutil.ReadFile(util.FixedCredentialsPath)
|
contents, err := ioutil.ReadFile(util.FixedCredentialsPath)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user