From e6b01a990387d0f9fa205ad17d957d3ab5e27260 Mon Sep 17 00:00:00 2001 From: onyx-flame <62136362+onyx-flame@users.noreply.github.com> Date: Sat, 23 Dec 2023 14:56:52 +0300 Subject: [PATCH] Feature (v1): add latest handshake data to API response (#203) * feature: updated handshake-related fields type * feature: updated handshake representations in templates * feature: added handshake field to Swagger schema --- assets/tpl/admin_index.html | 10 +++++++++- assets/tpl/user_index.html | 10 +++++++++- internal/common/util.go | 8 ++++++++ internal/server/docs/docs.go | 3 +++ internal/server/server.go | 1 + internal/wireguard/peermanager.go | 19 +++++++++---------- 6 files changed, 39 insertions(+), 12 deletions(-) diff --git a/assets/tpl/admin_index.html b/assets/tpl/admin_index.html index f4e5544..b7a9f22 100644 --- a/assets/tpl/admin_index.html +++ b/assets/tpl/admin_index.html @@ -181,7 +181,15 @@ {{if eq $.Device.Type "client"}} {{$p.Endpoint}} {{end}} - {{$p.LastHandshake}} + + + {{$p.LastHandshakeRelativeTime}} + + {{if eq $.Session.IsAdmin true}} diff --git a/assets/tpl/user_index.html b/assets/tpl/user_index.html index 1968aba..f42b4c6 100644 --- a/assets/tpl/user_index.html +++ b/assets/tpl/user_index.html @@ -55,7 +55,15 @@ {{$p.Email}} {{$p.IPsStr}} {{$p.DeviceName}} - {{$p.LastHandshake}} + + + {{$p.LastHandshakeRelativeTime}} + + {{if eq $.UserManagePeers true}} diff --git a/internal/common/util.go b/internal/common/util.go index e33ebf9..17ee7a6 100644 --- a/internal/common/util.go +++ b/internal/common/util.go @@ -93,3 +93,11 @@ func FormatDateHTML(t *time.Time) string { return t.Format("2006-01-02") } + +func FormatToUnixTime(t *time.Time) string { + if t == nil { + return "" + } + + return t.Format(time.UnixDate) +} diff --git a/internal/server/docs/docs.go b/internal/server/docs/docs.go index d57115f..697a0e7 100644 --- a/internal/server/docs/docs.go +++ b/internal/server/docs/docs.go @@ -1512,6 +1512,9 @@ const docTemplate = `{ "IgnoreGlobalSettings": { "type": "boolean" }, + "LastHandshakeTime": { + "type": "string" + }, "Mtu": { "description": "Global Device Settings (can be ignored, only make sense if device is in server mode)", "type": "integer", diff --git a/internal/server/server.go b/internal/server/server.go index 5ccce9c..ca588f5 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -128,6 +128,7 @@ func (s *Server) Setup(ctx context.Context) error { s.server.Use(sessions.Sessions("authsession", cookieStore)) s.server.SetFuncMap(template.FuncMap{ "formatDate": common.FormatDateHTML, + "formatTime": common.FormatToUnixTime, "formatBytes": common.ByteCountSI, "urlEncode": url.QueryEscape, "startsWith": strings.HasPrefix, diff --git a/internal/wireguard/peermanager.go b/internal/wireguard/peermanager.go index 2381c92..537150c 100644 --- a/internal/wireguard/peermanager.go +++ b/internal/wireguard/peermanager.go @@ -100,10 +100,10 @@ type Peer struct { Email string `gorm:"index" form:"mail" binding:"required,email"` IgnoreGlobalSettings bool `form:"ignoreglobalsettings"` - IsOnline bool `gorm:"-" json:"-"` - IsNew bool `gorm:"-" json:"-"` - LastHandshake string `gorm:"-" json:"-"` - LastHandshakeTime string `gorm:"-" json:"-"` + IsOnline bool `gorm:"-" json:"-"` + IsNew bool `gorm:"-" json:"-"` + LastHandshakeTime time.Time `gorm:"-"` + LastHandshakeRelativeTime string `gorm:"-" json:"-"` // Core WireGuard Settings PublicKey string `gorm:"primaryKey" form:"pubkey" binding:"required,base64"` // the public key of the peer itself @@ -610,8 +610,7 @@ func (m *PeerManager) populatePeerData(peer *Peer) { // set data from WireGuard interface peer.Peer, _ = m.wg.GetPeer(peer.DeviceName, peer.PublicKey) - peer.LastHandshake = "never" - peer.LastHandshakeTime = "Never connected, or user is disabled." + peer.LastHandshakeRelativeTime = "never" if peer.Peer != nil { since := time.Since(peer.Peer.LastHandshakeTime) sinceSeconds := int(since.Round(time.Second).Seconds()) @@ -619,13 +618,13 @@ func (m *PeerManager) populatePeerData(peer *Peer) { sinceSeconds -= sinceMinutes * 60 if sinceMinutes > 2*10080 { // 2 weeks - peer.LastHandshake = "a while ago" + peer.LastHandshakeRelativeTime = "a while ago" } else if sinceMinutes > 10080 { // 1 week - peer.LastHandshake = "a week ago" + peer.LastHandshakeRelativeTime = "a week ago" } else { - peer.LastHandshake = fmt.Sprintf("%02dm %02ds", sinceMinutes, sinceSeconds) + peer.LastHandshakeRelativeTime = fmt.Sprintf("%02dm %02ds", sinceMinutes, sinceSeconds) } - peer.LastHandshakeTime = peer.Peer.LastHandshakeTime.Format(time.UnixDate) + peer.LastHandshakeTime = peer.Peer.LastHandshakeTime } peer.IsOnline = false }