diff options
Diffstat (limited to 'pkg/handler')
| -rw-r--r-- | pkg/handler/about/handler.go | 4 | ||||
| -rw-r--r-- | pkg/handler/auth/login.go | 75 | ||||
| -rw-r--r-- | pkg/handler/git/handler.go | 24 | ||||
| -rw-r--r-- | pkg/handler/router.go | 5 | 
4 files changed, 89 insertions, 19 deletions
| diff --git a/pkg/handler/about/handler.go b/pkg/handler/about/handler.go index ac3d314..ee084cd 100644 --- a/pkg/handler/about/handler.go +++ b/pkg/handler/about/handler.go @@ -26,7 +26,7 @@ func NewAboutHandler(configRepo configurationRepository) *AboutHandler {  	return &AboutHandler{configRepo.GetRootReadme()}  } -func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error { +func (g *AboutHandler) About(w http.ResponseWriter, r *http.Request) error {  	f, err := os.Open(g.readmePath)  	if err != nil {  		return err @@ -50,6 +50,6 @@ func (g *AboutHandler) About(w http.ResponseWriter, _ *http.Request) error {  	gitList := &templates.AboutPage{  		Body: bs,  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } diff --git a/pkg/handler/auth/login.go b/pkg/handler/auth/login.go index 7e77a67..7014548 100644 --- a/pkg/handler/auth/login.go +++ b/pkg/handler/auth/login.go @@ -1,20 +1,87 @@  package auth  import ( +	"encoding/base64"  	"net/http" +	"time"  	"git.gabrielgio.me/cerrado/pkg/ext"  	"git.gabrielgio.me/cerrado/templates"  )  type ( -	LoginHandler struct{} +	LoginHandler struct { +		auth authService +	} + +	authService interface { +		CheckAuth(username, password string) bool +		IssueToken() ([]byte, error) +	}  ) +func NewLoginHandler(auth authService) *LoginHandler { +	return &LoginHandler{ +		auth: auth, +	} +} + +func (g *LoginHandler) Logout(w http.ResponseWriter, r *http.Request) error { +	cookie := &http.Cookie{ +		Name:    "auth", +		Value:   "", +		Path:    "/", +		Expires: time.Unix(0, 0), +	} + +	referer := r.Header.Get("Referer") +	if referer == "" { +		referer = "/" +	} + +	http.SetCookie(w, cookie) +	ext.Redirect(w, referer) +	return nil +} +  func (g *LoginHandler) Login(w http.ResponseWriter, r *http.Request) error { -	ext.SetHTML(w) +	if r.Method == "GET" { +		ext.SetHTML(w) + +		login := &templates.LoginPage{} +		templates.WritePageTemplate(w, login, r.Context()) +	} else if r.Method == "POST" { + +		username := r.FormValue("username") +		password := r.FormValue("password") + +		if !g.auth.CheckAuth(username, password) { +			login := &templates.LoginPage{ +				ErrorMessage: "Invalid login", +			} +			templates.WritePageTemplate(w, login, r.Context()) +		} else { + +			bytes, err := g.auth.IssueToken() +			if err != nil { +				return err +			} + +			cookie := &http.Cookie{ +				Name:     "auth", +				Value:    base64.StdEncoding.EncodeToString(bytes), +				Path:     "/", +				MaxAge:   3600, +				HttpOnly: true, +				Secure:   true, +				SameSite: http.SameSiteStrictMode, +			} + +			http.SetCookie(w, cookie) +			ext.Redirect(w, "/") +		} + +	} -	login := &templates.LoginPage{} -	templates.WritePageTemplate(w, login)  	return nil  } diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 5739c8e..4276159 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -43,7 +43,7 @@ func NewGitHandler(gitService *service.GitService, confRepo configurationReposit  	}  } -func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error { +func (g *GitHandler) List(w http.ResponseWriter, r *http.Request) error {  	repos, err := g.gitService.ListRepositories()  	if err != nil {  		return err @@ -73,7 +73,7 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error {  		Respositories: repos,  		About:         bs,  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -85,7 +85,7 @@ func (g *GitHandler) Archive(w http.ResponseWriter, r *http.Request) error {  	// TODO: remove it once we can support more than gzip  	if !strings.HasSuffix(file, ".tar.gz") { -		ext.NotFound(w) +		ext.NotFound(w, r)  		return nil  	} @@ -135,7 +135,7 @@ func (g *GitHandler) Summary(w http.ResponseWriter, r *http.Request) error {  			Commits:  commits,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -155,7 +155,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {  			GitItemBase: &templates.GitItemAboutPage{  				About: []byte("About file not configured properly"),  			}, -		}) +		}, r.Context())  		return nil  	}  	if err != nil { @@ -179,7 +179,7 @@ func (g *GitHandler) About(w http.ResponseWriter, r *http.Request) error {  			About: bs,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -210,7 +210,7 @@ func (g *GitHandler) Refs(w http.ResponseWriter, r *http.Request) error {  			Branches: branches,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -239,7 +239,7 @@ func (g *GitHandler) Tree(w http.ResponseWriter, r *http.Request) error {  			Tree: tree,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -270,7 +270,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {  				Content: []byte("Binary file"),  			},  		} -		templates.WritePageTemplate(w, gitList) +		templates.WritePageTemplate(w, gitList, r.Context())  		return nil  	} @@ -307,7 +307,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error {  			Content: code.Bytes(),  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -328,7 +328,7 @@ func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) error {  			Commits: commits,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } @@ -355,7 +355,7 @@ func (g *GitHandler) Commit(w http.ResponseWriter, r *http.Request) error {  			Diff:   diff,  		},  	} -	templates.WritePageTemplate(w, gitList) +	templates.WritePageTemplate(w, gitList, r.Context())  	return nil  } diff --git a/pkg/handler/router.go b/pkg/handler/router.go index 32bd78a..ee4081b 100644 --- a/pkg/handler/router.go +++ b/pkg/handler/router.go @@ -17,12 +17,13 @@ import (  // its sub package don't leak in other places.  func MountHandler(  	gitService *service.GitService, +	authService *service.AuthService,  	configRepo *serverconfig.ConfigurationRepository,  ) (http.Handler, error) {  	var (  		gitHandler   = git.NewGitHandler(gitService, configRepo)  		aboutHandler = about.NewAboutHandler(configRepo) -		loginHandler = &auth.LoginHandler{} +		loginHandler = auth.NewLoginHandler(authService)  	)  	staticHandler, err := static.ServeStaticHandler() @@ -32,10 +33,12 @@ func MountHandler(  	mux := ext.NewRouter()  	mux.AddMiddleware(ext.Compress) +	mux.AddMiddleware(ext.Authenticate(authService))  	mux.AddMiddleware(ext.Log)  	mux.HandleFunc("/static/{file}", staticHandler)  	mux.HandleFunc("/login/{$}", loginHandler.Login) +	mux.HandleFunc("/logout/{$}", loginHandler.Logout)  	mux.HandleFunc("/{name}/about/{$}", gitHandler.About)  	mux.HandleFunc("/{name}/", gitHandler.Summary)  	mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs) | 
