Add functionality for session termination
This commit is contained in:
23
handler/user/session/terminate/terminate.go
Normal file
23
handler/user/session/terminate/terminate.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package userSessionTerminateHandler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/fossyy/filekeeper/session"
|
||||||
|
userView "github.com/fossyy/filekeeper/view/user"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func DELETE(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id := r.PathValue("id")
|
||||||
|
|
||||||
|
_, mySession, _ := session.GetSession(r)
|
||||||
|
otherSession, _ := session.Get(id)
|
||||||
|
otherSession.Delete()
|
||||||
|
session.RemoveSessionInfo(mySession.Email, otherSession.ID)
|
||||||
|
|
||||||
|
component := userView.SessionTable(session.GetSessions(mySession.Email))
|
||||||
|
err := component.Render(r.Context(), w)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
@ -17,6 +17,7 @@ import (
|
|||||||
uploadHandler "github.com/fossyy/filekeeper/handler/upload"
|
uploadHandler "github.com/fossyy/filekeeper/handler/upload"
|
||||||
"github.com/fossyy/filekeeper/handler/upload/initialisation"
|
"github.com/fossyy/filekeeper/handler/upload/initialisation"
|
||||||
userHandler "github.com/fossyy/filekeeper/handler/user"
|
userHandler "github.com/fossyy/filekeeper/handler/user"
|
||||||
|
userSessionTerminateHandler "github.com/fossyy/filekeeper/handler/user/session/terminate"
|
||||||
userHandlerTotpSetup "github.com/fossyy/filekeeper/handler/user/totp"
|
userHandlerTotpSetup "github.com/fossyy/filekeeper/handler/user/totp"
|
||||||
"github.com/fossyy/filekeeper/middleware"
|
"github.com/fossyy/filekeeper/middleware"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -92,6 +93,10 @@ func SetupRoutes() *http.ServeMux {
|
|||||||
middleware.Auth(userHandler.GET, w, r)
|
middleware.Auth(userHandler.GET, w, r)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
handler.HandleFunc("DELETE /user/session/terminate/{id}", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
middleware.Auth(userSessionTerminateHandler.DELETE, w, r)
|
||||||
|
})
|
||||||
|
|
||||||
handler.HandleFunc("GET /user/totp/setup", func(w http.ResponseWriter, r *http.Request) {
|
handler.HandleFunc("GET /user/totp/setup", func(w http.ResponseWriter, r *http.Request) {
|
||||||
middleware.Auth(userHandlerTotpSetup.GET, w, r)
|
middleware.Auth(userHandlerTotpSetup.GET, w, r)
|
||||||
})
|
})
|
||||||
|
@ -109,7 +109,7 @@ templ content(title string, user types.User, ListSession []*session.SessionInfo)
|
|||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="[&_tr:last-child]:border-0">
|
<tbody class="[&_tr:last-child]:border-0" id="session-tables">
|
||||||
for _, ses := range ListSession {
|
for _, ses := range ListSession {
|
||||||
<tr
|
<tr
|
||||||
class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
|
class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
|
||||||
@ -122,13 +122,13 @@ templ content(title string, user types.User, ListSession []*session.SessionInfo)
|
|||||||
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.AccessAt}
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.AccessAt}
|
||||||
</td>
|
</td>
|
||||||
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
|
||||||
<a
|
<button
|
||||||
class="hover:bg-gray-200 inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2"
|
class="hover:bg-gray-200 inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2"
|
||||||
type="button" id="radix-:rq:" aria-haspopup="menu"
|
type="button" id="radix-:rq:" aria-haspopup="menu"
|
||||||
aria-expanded="false" data-state="closed"
|
aria-expanded="false" data-state="closed"
|
||||||
href="/">
|
hx-delete={"/user/session/terminate/"+ses.SessionID} hx-target="#session-tables" hx-swap="outerHTML">
|
||||||
Terminate
|
Terminate
|
||||||
</a>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@ -262,6 +262,33 @@ templ content(title string, user types.User, ListSession []*session.SessionInfo)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
templ SessionTable(ListSession []*session.SessionInfo){
|
||||||
|
<tbody class="[&_tr:last-child]:border-0" id="session-tables">
|
||||||
|
for _, ses := range ListSession {
|
||||||
|
<tr
|
||||||
|
class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
|
||||||
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.IP}
|
||||||
|
</td>
|
||||||
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.Browser + ses.Version}
|
||||||
|
</td>
|
||||||
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.OS + ses.OSVersion}
|
||||||
|
</td>
|
||||||
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">{ses.AccessAt}
|
||||||
|
</td>
|
||||||
|
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
|
||||||
|
<button
|
||||||
|
class="hover:bg-gray-200 inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2"
|
||||||
|
type="button" id="radix-:rq:" aria-haspopup="menu"
|
||||||
|
aria-expanded="false" data-state="closed"
|
||||||
|
hx-delete={"/user/session/terminate/"+ses.SessionID} hx-target="#session-tables" hx-swap="outerHTML">
|
||||||
|
Terminate
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
}
|
||||||
|
|
||||||
templ Main(title string, user types.User, ListSession []*session.SessionInfo) {
|
templ Main(title string, user types.User, ListSession []*session.SessionInfo) {
|
||||||
@content(title, user, ListSession)
|
@content(title, user, ListSession)
|
||||||
}
|
}
|
Reference in New Issue
Block a user