diff --git a/handler/user/session/terminate/terminate.go b/handler/user/session/terminate/terminate.go
index 66d2d04..c8c0a72 100644
--- a/handler/user/session/terminate/terminate.go
+++ b/handler/user/session/terminate/terminate.go
@@ -1,48 +1,43 @@
package userSessionTerminateHandler
import (
+ "errors"
"github.com/fossyy/filekeeper/app"
"github.com/fossyy/filekeeper/session"
"github.com/fossyy/filekeeper/types"
- "github.com/fossyy/filekeeper/view/client/user"
"net/http"
)
func DELETE(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
mySession := r.Context().Value("user").(types.User)
+ mySessionID := r.Context().Value("sessionID").(string)
+
+ if id == mySessionID {
+ w.Header().Set("HX-Redirect", "/logout")
+ w.WriteHeader(http.StatusOK)
+ return
+ }
+
otherSession := session.Get(id)
- if _, err := session.GetSessionInfo(mySession.Email, otherSession.ID); err != nil {
- w.WriteHeader(http.StatusUnauthorized)
+ err := session.RemoveSessionInfo(mySession.Email, otherSession.ID)
+ if err != nil {
+ if errors.Is(err, session.ErrorSessionNotFound) {
+ w.WriteHeader(http.StatusUnauthorized)
+ return
+ }
+ w.WriteHeader(http.StatusInternalServerError)
+ app.Server.Logger.Error(err.Error())
return
}
- err := otherSession.Delete()
+ err = otherSession.Delete()
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
app.Server.Logger.Error(err.Error())
return
}
- err = session.RemoveSessionInfo(mySession.Email, otherSession.ID)
- if err != nil {
- w.WriteHeader(http.StatusInternalServerError)
- app.Server.Logger.Error(err.Error())
- return
- }
-
- sessions, err := session.GetSessions(mySession.Email)
- if err != nil {
- w.WriteHeader(http.StatusInternalServerError)
- app.Server.Logger.Error(err.Error())
- return
- }
- component := userView.SessionTable(sessions)
-
- err = component.Render(r.Context(), w)
- if err != nil {
- w.WriteHeader(http.StatusInternalServerError)
- return
- }
+ w.WriteHeader(http.StatusOK)
return
}
diff --git a/middleware/middleware.go b/middleware/middleware.go
index 32bdaf2..7585385 100644
--- a/middleware/middleware.go
+++ b/middleware/middleware.go
@@ -86,6 +86,7 @@ func Auth(next http.HandlerFunc, w http.ResponseWriter, r *http.Request) {
switch status {
case session.Authorized:
ctx := context.WithValue(r.Context(), "user", user)
+ ctx = context.WithValue(ctx, "sessionID", sessionID)
req := r.WithContext(ctx)
next.ServeHTTP(w, req)
return
diff --git a/session/session.go b/session/session.go
index 7803bf8..fc5a2bf 100644
--- a/session/session.go
+++ b/session/session.go
@@ -16,10 +16,14 @@ import (
"github.com/fossyy/filekeeper/utils"
)
+var ErrorSessionNotFound = errors.New("session not found")
+
type Session struct {
ID string
}
+type UserStatus string
+
type SessionInfo struct {
SessionID string
Browser string
@@ -30,8 +34,6 @@ type SessionInfo struct {
Location string
}
-type UserStatus string
-
const (
Authorized UserStatus = "authorized"
Unauthorized UserStatus = "unauthorized"
@@ -115,6 +117,9 @@ func RemoveSessionInfo(email string, id string) error {
key := "UserSessionInfo:" + email + ":" + id
err := app.Server.Cache.DeleteCache(context.Background(), key)
if err != nil {
+ if errors.Is(err, redis.Nil) {
+ return ErrorSessionNotFound
+ }
return err
}
return nil
@@ -150,7 +155,7 @@ func GetSessionInfo(email string, id string) (*SessionInfo, error) {
sessionInfoData, err := app.Server.Cache.GetCache(context.Background(), key)
if err != nil {
if errors.Is(err, redis.Nil) {
- return nil, nil
+ return nil, ErrorSessionNotFound
}
return nil, err
}
diff --git a/view/client/user/user.templ b/view/client/user/user.templ
index a628937..b2cd295 100644
--- a/view/client/user/user.templ
+++ b/view/client/user/user.templ
@@ -111,26 +111,28 @@ templ MainContent(title string, user types.User, allowance *types.Allowance, Lis
-
- for _, ses := range ListSession {
-
- {ses.IP}
- |
- {ses.Browser + ses.Version}
- |
- {ses.OS + ses.OSVersion}
- |
-
-
- |
-
+
+ for _, session := range ListSession {
+
+ {session.IP}
+ |
+ {session.Browser + session.Version}
+ |
+ {session.OS + session.OSVersion}
+ |
+
+
+ |
+
}
@@ -307,31 +309,6 @@ templ MainContent(title string, user types.User, allowance *types.Allowance, Lis
}
-templ SessionTable(ListSession []*session.SessionInfo){
-
- for _, ses := range ListSession {
-
- {ses.IP}
- |
- {ses.Browser + ses.Version}
- |
- {ses.OS + ses.OSVersion}
- |
-
-
- |
-
- }
-
-}
-
templ Main(title string, user types.User, allowance *types.Allowance, ListSession []*session.SessionInfo, message types.Message) {
@content(message, title, user, allowance, ListSession)
}
\ No newline at end of file
diff --git a/view/client/user/user_templ.go b/view/client/user/user_templ.go
index 54f4135..a03b241 100644
--- a/view/client/user/user_templ.go
+++ b/view/client/user/user_templ.go
@@ -133,15 +133,15 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- for _, ses := range ListSession {
+ for _, session := range ListSession {
templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 6)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var7 string
- templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(ses.IP)
+ templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs("session-" + session.SessionID)
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 118, Col: 118}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 117, Col: 84}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
if templ_7745c5c3_Err != nil {
@@ -152,9 +152,9 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var8 string
- templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(ses.Browser + ses.Version)
+ templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(session.IP)
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 120, Col: 137}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 118, Col: 126}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
if templ_7745c5c3_Err != nil {
@@ -165,9 +165,9 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var9 string
- templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(ses.OS + ses.OSVersion)
+ templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(session.Browser + session.Version)
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 122, Col: 134}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 120, Col: 149}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
if templ_7745c5c3_Err != nil {
@@ -178,9 +178,9 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
return templ_7745c5c3_Err
}
var templ_7745c5c3_Var10 string
- templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("/user/session/terminate/" + ses.SessionID)
+ templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(session.OS + session.OSVersion)
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 129, Col: 107}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 122, Col: 146}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
if templ_7745c5c3_Err != nil {
@@ -190,61 +190,87 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 11)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- switch message.Code {
- case 0:
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 12)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
var templ_7745c5c3_Var11 string
- templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(message.Message)
+ templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs("/user/session/terminate/" + session.SessionID)
if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 147, Col: 48}
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 129, Col: 115}
}
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 13)
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 11)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var12 string
+ templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs("#session-" + session.SessionID)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 130, Col: 100}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 12)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
}
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 14)
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 13)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- var templ_7745c5c3_Var12 string
- templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(allowance.AllowanceUsedByte)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 250, Col: 84}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 15)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var13 string
- templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(allowance.AllowanceByte)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 250, Col: 112}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
+ switch message.Code {
+ case 0:
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 14)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var13 string
+ templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(message.Message)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 149, Col: 48}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 15)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
}
templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 16)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
+ var templ_7745c5c3_Var14 string
+ templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(allowance.AllowanceUsedByte)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 252, Col: 84}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 17)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ var templ_7745c5c3_Var15 string
+ templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(allowance.AllowanceByte)
+ if templ_7745c5c3_Err != nil {
+ return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 252, Col: 112}
+ }
+ _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 18)
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
templ_7745c5c3_Err = layout.Footer().Render(ctx, templ_7745c5c3_Buffer)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
@@ -253,7 +279,7 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 17)
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 19)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -261,98 +287,7 @@ func MainContent(title string, user types.User, allowance *types.Allowance, List
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 18)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- return templ_7745c5c3_Err
- })
-}
-
-func SessionTable(ListSession []*session.SessionInfo) templ.Component {
- return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
- templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
- if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
- return templ_7745c5c3_CtxErr
- }
- templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
- if !templ_7745c5c3_IsBuffer {
- defer func() {
- templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
- if templ_7745c5c3_Err == nil {
- templ_7745c5c3_Err = templ_7745c5c3_BufErr
- }
- }()
- }
- ctx = templ.InitializeContext(ctx)
- templ_7745c5c3_Var14 := templ.GetChildren(ctx)
- if templ_7745c5c3_Var14 == nil {
- templ_7745c5c3_Var14 = templ.NopComponent
- }
- ctx = templ.ClearChildren(ctx)
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 19)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- for _, ses := range ListSession {
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 20)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var15 string
- templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(ses.IP)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 315, Col: 82}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 21)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var16 string
- templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(ses.Browser + ses.Version)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 317, Col: 101}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 22)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var17 string
- templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(ses.OS + ses.OSVersion)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 319, Col: 98}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 23)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- var templ_7745c5c3_Var18 string
- templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs("/user/session/terminate/" + ses.SessionID)
- if templ_7745c5c3_Err != nil {
- return templ.Error{Err: templ_7745c5c3_Err, FileName: `view/client/user/user.templ`, Line: 326, Col: 71}
- }
- _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 24)
- if templ_7745c5c3_Err != nil {
- return templ_7745c5c3_Err
- }
- }
- templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 25)
+ templ_7745c5c3_Err = templ.WriteWatchModeString(templ_7745c5c3_Buffer, 20)
if templ_7745c5c3_Err != nil {
return templ_7745c5c3_Err
}
@@ -376,9 +311,9 @@ func Main(title string, user types.User, allowance *types.Allowance, ListSession
}()
}
ctx = templ.InitializeContext(ctx)
- templ_7745c5c3_Var19 := templ.GetChildren(ctx)
- if templ_7745c5c3_Var19 == nil {
- templ_7745c5c3_Var19 = templ.NopComponent
+ templ_7745c5c3_Var16 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var16 == nil {
+ templ_7745c5c3_Var16 = templ.NopComponent
}
ctx = templ.ClearChildren(ctx)
templ_7745c5c3_Err = content(message, title, user, allowance, ListSession).Render(ctx, templ_7745c5c3_Buffer)