feat: initial wip frontend

This commit is contained in:
Stavros
2026-04-28 19:11:36 +03:00
parent a5677d2558
commit 3971710e87
7 changed files with 158 additions and 12 deletions
+15 -10
View File
@@ -11,16 +11,17 @@ import (
)
type UserContextResponse struct {
Status int `json:"status"`
Message string `json:"message"`
IsLoggedIn bool `json:"isLoggedIn"`
Username string `json:"username"`
Name string `json:"name"`
Email string `json:"email"`
Provider string `json:"provider"`
OAuth bool `json:"oauth"`
TotpPending bool `json:"totpPending"`
OAuthName string `json:"oauthName"`
Status int `json:"status"`
Message string `json:"message"`
IsLoggedIn bool `json:"isLoggedIn"`
Username string `json:"username"`
Name string `json:"name"`
Email string `json:"email"`
Provider string `json:"provider"`
OAuth bool `json:"oauth"`
TotpPending bool `json:"totpPending"`
OAuthName string `json:"oauthName"`
TailscaleNodeName string `json:"tailscaleNodeName"`
}
type AppContextResponse struct {
@@ -91,6 +92,10 @@ func (controller *ContextController) userContextHandler(c *gin.Context) {
OAuthName: context.OAuthName,
}
if context.Tailscale != nil {
userContext.TailscaleNodeName = context.Tailscale.NodeName
}
if err != nil {
tlog.App.Debug().Err(err).Msg("No user context found in request")
userContext.Status = 401
+48
View File
@@ -46,6 +46,7 @@ func (controller *UserController) SetupRoutes() {
userGroup.POST("/login", controller.loginHandler)
userGroup.POST("/logout", controller.logoutHandler)
userGroup.POST("/totp", controller.totpHandler)
userGroup.POST("/tailscale", controller.tailscaleHandler)
}
func (controller *UserController) loginHandler(c *gin.Context) {
@@ -309,3 +310,50 @@ func (controller *UserController) totpHandler(c *gin.Context) {
"message": "Login successful",
})
}
func (controller *UserController) tailscaleHandler(c *gin.Context) {
context, err := utils.GetContext(c)
if err != nil {
tlog.App.Error().Err(err).Msg("Failed to get user context")
c.JSON(500, gin.H{
"status": 500,
"message": "Internal Server Error",
})
return
}
if context.Tailscale == nil {
tlog.App.Warn().Msg("Tailscale session requested but Tailscale device not found")
c.JSON(404, gin.H{
"status": 404,
"message": "Not Found",
})
return
}
sessionCookie := repository.Session{
Username: context.Tailscale.LoginName,
Name: context.Tailscale.DisplayName,
Email: context.Tailscale.LoginName,
Provider: "tailscale",
}
tlog.App.Trace().Interface("session_cookie", sessionCookie).Msg("Creating session cookie")
err = controller.auth.CreateSessionCookie(c, &sessionCookie)
if err != nil {
tlog.App.Error().Err(err).Msg("Failed to create session cookie")
c.JSON(500, gin.H{
"status": 500,
"message": "Internal Server Error",
})
return
}
c.JSON(200, gin.H{
"status": 200,
"message": "Login successful",
})
}
+14
View File
@@ -63,6 +63,8 @@ func (m *ContextMiddleware) Middleware() gin.HandlerFunc {
return
}
tlog.App.Trace().Interface("cookies", c.Request.Cookies()).Msg("cookies")
cookie, err := m.auth.GetSessionCookie(c)
if err != nil {
@@ -134,6 +136,18 @@ func (m *ContextMiddleware) Middleware() gin.HandlerFunc {
c.Set("context", &ctx)
c.Next()
return
case "tailscale":
m.auth.RefreshSessionCookie(c)
ctx := m.addTailscaleContext(c, config.UserContext{
Username: cookie.Username,
Name: cookie.Name,
Email: cookie.Email,
Provider: cookie.Provider,
IsLoggedIn: true,
})
c.Set("context", &ctx)
c.Next()
return
default:
_, exists := m.broker.GetService(cookie.Provider)
+10
View File
@@ -327,6 +327,16 @@ func (auth *AuthService) CreateSessionCookie(c *gin.Context, data *repository.Se
return err
}
if data.Provider == "tailscale" {
// TODO: use domain from tailscale to set cookie, this is mostly a hack for now
tsCookieDomain, err := utils.GetCookieDomain(fmt.Sprintf("https://%s", c.Request.Host))
if err != nil {
return err
}
c.SetCookie(auth.config.SessionCookieName, session.UUID, expiry, "/", fmt.Sprintf(".%s", tsCookieDomain), auth.config.SecureCookie, true)
return nil
}
c.SetCookie(auth.config.SessionCookieName, session.UUID, expiry, "/", fmt.Sprintf(".%s", auth.config.CookieDomain), auth.config.SecureCookie, true)
return nil