mirror of
https://github.com/DJSundog/wg-portal.git
synced 2024-11-27 09:00:03 -05:00
136 lines
3.7 KiB
Go
136 lines
3.7 KiB
Go
package server
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func (s *Server) GetLogin(c *gin.Context) {
|
|
currentSession := s.getSessionData(c)
|
|
if currentSession.LoggedIn {
|
|
c.Redirect(http.StatusSeeOther, "/") // already logged in
|
|
}
|
|
|
|
authError := c.DefaultQuery("err", "")
|
|
errMsg := "Unknown error occurred, try again!"
|
|
switch authError {
|
|
case "missingdata":
|
|
errMsg = "Invalid login data retrieved, please fill out all fields and try again!"
|
|
case "authfail":
|
|
errMsg = "Authentication failed!"
|
|
case "loginreq":
|
|
errMsg = "Login required!"
|
|
}
|
|
|
|
c.HTML(http.StatusOK, "login.html", gin.H{
|
|
"error": authError != "",
|
|
"message": errMsg,
|
|
"static": s.getStaticData(),
|
|
})
|
|
}
|
|
|
|
func (s *Server) PostLogin(c *gin.Context) {
|
|
currentSession := s.getSessionData(c)
|
|
if currentSession.LoggedIn {
|
|
// already logged in
|
|
c.Redirect(http.StatusSeeOther, "/")
|
|
return
|
|
}
|
|
|
|
username := strings.ToLower(c.PostForm("username"))
|
|
password := c.PostForm("password")
|
|
|
|
// Validate form input
|
|
if strings.Trim(username, " ") == "" || strings.Trim(password, " ") == "" {
|
|
c.Redirect(http.StatusSeeOther, "/auth/login?err=missingdata")
|
|
return
|
|
}
|
|
|
|
adminAuthenticated := false
|
|
if s.config.Core.AdminUser != "" && username == s.config.Core.AdminUser && password == s.config.Core.AdminPassword {
|
|
adminAuthenticated = true
|
|
}
|
|
|
|
// Check if user is in cache, avoid unnecessary ldap requests
|
|
if !adminAuthenticated && !s.ldapUsers.UserExists(username) {
|
|
c.Redirect(http.StatusSeeOther, "/auth/login?err=authfail")
|
|
}
|
|
|
|
// Check if username and password match
|
|
if !adminAuthenticated && !s.ldapAuth.CheckLogin(username, password) {
|
|
c.Redirect(http.StatusSeeOther, "/auth/login?err=authfail")
|
|
return
|
|
}
|
|
|
|
var sessionData SessionData
|
|
if adminAuthenticated {
|
|
sessionData = SessionData{
|
|
LoggedIn: true,
|
|
IsAdmin: true,
|
|
Email: "autodetected@example.com",
|
|
UID: "adminuid",
|
|
UserName: username,
|
|
Firstname: "System",
|
|
Lastname: "Administrator",
|
|
SortedBy: "mail",
|
|
SortDirection: "asc",
|
|
Search: "",
|
|
}
|
|
} else {
|
|
dn := s.ldapUsers.GetUserDN(username)
|
|
userData := s.ldapUsers.GetUserData(dn)
|
|
sessionData = SessionData{
|
|
LoggedIn: true,
|
|
IsAdmin: s.ldapUsers.IsInGroup(username, s.config.AdminLdapGroup),
|
|
UID: userData.GetUID(),
|
|
UserName: username,
|
|
Email: userData.Mail,
|
|
Firstname: userData.Firstname,
|
|
Lastname: userData.Lastname,
|
|
SortedBy: "mail",
|
|
SortDirection: "asc",
|
|
Search: "",
|
|
}
|
|
}
|
|
|
|
// Check if user already has a peer setup, if not create one
|
|
if s.config.Core.CreateInterfaceOnLogin && !adminAuthenticated {
|
|
users := s.users.GetUsersByMail(sessionData.Email)
|
|
|
|
if len(users) == 0 { // Create vpn peer
|
|
err := s.CreateUser(User{
|
|
Identifier: sessionData.Firstname + " " + sessionData.Lastname + " (Default)",
|
|
Email: sessionData.Email,
|
|
CreatedBy: sessionData.Email,
|
|
UpdatedBy: sessionData.Email,
|
|
})
|
|
log.Errorf("Failed to automatically create vpn peer for %s: %v", sessionData.Email, err)
|
|
}
|
|
}
|
|
|
|
if err := s.updateSessionData(c, sessionData); err != nil {
|
|
s.GetHandleError(c, http.StatusInternalServerError, "login error", "failed to save session")
|
|
return
|
|
}
|
|
c.Redirect(http.StatusSeeOther, "/")
|
|
}
|
|
|
|
func (s *Server) GetLogout(c *gin.Context) {
|
|
currentSession := s.getSessionData(c)
|
|
|
|
if !currentSession.LoggedIn { // Not logged in
|
|
c.Redirect(http.StatusSeeOther, "/")
|
|
return
|
|
}
|
|
|
|
if err := s.destroySessionData(c); err != nil {
|
|
s.GetHandleError(c, http.StatusInternalServerError, "logout error", "failed to destroy session")
|
|
return
|
|
}
|
|
c.Redirect(http.StatusSeeOther, "/")
|
|
}
|