Add user session management and auditing

This commit is contained in:
Eric Lesiuta committed 2026-03-20 21:26:30 -04:00
1 parent 455dd20365
commit 0b354c8048
25 files changed
+1299 -11

No files matched your search

+21 -1
View File
@@ -7,13 +7,16 @@ package auth
import (
"errors"
"fmt"
"net"
"net/http"
auth_model "code.gitea.io/gitea/models/auth"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/auth/webauthn"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/session"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/web/middleware"
user_service "code.gitea.io/gitea/services/user"
)
@@ -39,7 +42,7 @@ func Init() {
}
// handleSignIn clears existing session variables and stores new ones for the specified user object
func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore, user *user_model.User) {
func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore, user *user_model.User, loginMethod string) {
// We need to regenerate the session...
newSess, err := session.RegenerateSession(resp, req)
if err != nil {
@@ -65,6 +68,23 @@ func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore
log.Error(fmt.Sprintf("Error setting session: %v", err))
}
// Create tracked user session record
ip := req.RemoteAddr
if host, _, err := net.SplitHostPort(ip); err == nil {
ip = host
}
if err := auth_model.CreateUserSession(req.Context(), &auth_model.UserSession{
ID: sess.ID(),
UserID: user.ID,
LoginIP: ip,
LastIP: ip,
UserAgent: req.UserAgent(),
LoginMethod: loginMethod,
LastAccessUnix: timeutil.TimeStampNow(),
}); err != nil {
log.Error("Failed to create user session record: %v", err)
}
// Language setting of the user overwrites the one previously set
// If the user does not have a locale set, we save the current one.
if len(user.Language) == 0 {
+1 -1
View File
@@ -119,7 +119,7 @@ func (r *ReverseProxy) Verify(req *http.Request, w http.ResponseWriter, store Da
if r.CreateSession {
if sess != nil && (sess.Get("uid") == nil || sess.Get("uid").(int64) != user.ID) {
handleSignIn(w, req, sess, user)
handleSignIn(w, req, sess, user, "reverse_proxy")
}
}
store.GetData()["IsReverseProxy"] = true
+1 -1
View File
@@ -121,7 +121,7 @@ func (s *SSPI) Verify(req *http.Request, w http.ResponseWriter, store DataStore,
}
if s.CreateSession {
handleSignIn(w, req, sess, user)
handleSignIn(w, req, sess, user, "sspi")
}
log.Trace("SSPI Authorization: Logged in user %-v", user)