package webserver import ( "net/http" "strings" "text/template" ) type LoginPageData struct { IsHiddenClassList string LoginData CustomizableLoginData } type AuthStyle int const ( AuthStylePassword AuthStyle = 0 AuthStyleOAuth AuthStyle = 1 ) type AuthData interface{} type PasswordAuthData struct { Username string Password string } type OAuthAuthData struct { Username string Password string } type CustomizableLoginData struct { ServiceName string AuthRequestFunction func(AuthStyle, AuthData) bool } var LoginPageDataCustomizations CustomizableLoginData func loginHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") tmpl := template.Must(template.ParseFiles("webserver/pages/login_page.html")) if r.Method == http.MethodGet { tmpl.Execute(w, LoginPageData{IsHiddenClassList: "hidden", LoginData: LoginPageDataCustomizations}) return } if r.Method == http.MethodPost { action := r.FormValue("action") if action == "password" { username := r.FormValue("username") if strings.Contains(username, "/") { tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) } password := r.FormValue("password") auth_success := LoginPageDataCustomizations.AuthRequestFunction(AuthStylePassword, PasswordAuthData{ Username: username, Password: password, }) if auth_success == false { tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) } } else { auth_success := LoginPageDataCustomizations.AuthRequestFunction(AuthStyleOAuth, OAuthAuthData{}) if auth_success == false { tmpl.Execute(w, LoginPageData{IsHiddenClassList: "", LoginData: LoginPageDataCustomizations}) } } } }