diff --git a/server/dbdata/tables.go b/server/dbdata/tables.go
index fccb102..6f389b4 100644
--- a/server/dbdata/tables.go
+++ b/server/dbdata/tables.go
@@ -41,17 +41,19 @@ type User struct {
}
type UserActLog struct {
- Id int `json:"id" xorm:"pk autoincr not null"`
- Username string `json:"username" xorm:"varchar(60)"`
- GroupName string `json:"group_name" xorm:"varchar(60)"`
- IpAddr string `json:"ip_addr" xorm:"varchar(32)"`
- RemoteAddr string `json:"remote_addr" xorm:"varchar(32)"`
- Os uint8 `json:"os" xorm:"not null default 0 Int"`
- Client uint8 `json:"client" xorm:"not null default 0 Int"`
- Version string `json:"version" xorm:"varchar(15)"`
- Status uint8 `json:"status" xorm:"not null default 0 Int"`
- Info string `json:"info" xorm:"varchar(255) not null default ''"` // 详情
- CreatedAt time.Time `json:"created_at" xorm:"DateTime created"`
+ Id int `json:"id" xorm:"pk autoincr not null"`
+ Username string `json:"username" xorm:"varchar(60)"`
+ GroupName string `json:"group_name" xorm:"varchar(60)"`
+ IpAddr string `json:"ip_addr" xorm:"varchar(32)"`
+ RemoteAddr string `json:"remote_addr" xorm:"varchar(32)"`
+ Os uint8 `json:"os" xorm:"not null default 0 Int"`
+ Client uint8 `json:"client" xorm:"not null default 0 Int"`
+ Version string `json:"version" xorm:"varchar(15)"`
+ DeviceType string `json:"device_type" xorm:"varchar(128) not null default ''"`
+ PlatformVersion string `json:"platform_version" xorm:"varchar(15) not null default ''"`
+ Status uint8 `json:"status" xorm:"not null default 0 Int"`
+ Info string `json:"info" xorm:"varchar(255) not null default ''"` // 详情
+ CreatedAt time.Time `json:"created_at" xorm:"DateTime created"`
}
type IpMap struct {
diff --git a/server/dbdata/user_act_log.go b/server/dbdata/user_act_log.go
index c3f4ce2..0a283dd 100644
--- a/server/dbdata/user_act_log.go
+++ b/server/dbdata/user_act_log.go
@@ -55,7 +55,7 @@ var (
},
InfoOps: []string{ // 信息
UserLogoutLose: "用户掉线",
- UserLogoutBanner: "用户取消弹窗",
+ UserLogoutBanner: "用户取消弹窗/客户端发起的logout",
UserLogoutClient: "用户/客户端主动断开",
UserLogoutTimeout: "Session过期被踢下线",
UserLogoutAdmin: "账号被管理员踢下线",
@@ -121,8 +121,8 @@ func (ua *UserActLogProcess) ParseUserAgent(userAgent string) (os_idx, client_id
if len(userAgent) == 0 {
return 5, 2, ""
}
- // os
- os_idx = 2
+ // OS
+ os_idx = 5
if strings.Contains(userAgent, "windows") {
os_idx = 0
} else if strings.Contains(userAgent, "mac os") || strings.Contains(userAgent, "darwin_i386") {
@@ -131,15 +131,17 @@ func (ua *UserActLogProcess) ParseUserAgent(userAgent string) (os_idx, client_id
os_idx = 4
} else if strings.Contains(userAgent, "android") {
os_idx = 3
+ } else if strings.Contains(userAgent, "linux") {
+ os_idx = 2
}
- // client
+ // Client
client_idx = 2
if strings.Contains(userAgent, "anyconnect") {
client_idx = 0
} else if strings.Contains(userAgent, "openconnect") {
client_idx = 1
}
- // ver
+ // Verion
uaSlice := strings.Split(userAgent, " ")
ver = uaSlice[len(uaSlice)-1]
if ver[0] == 'v' {
diff --git a/server/dbdata/user_act_log_test.go b/server/dbdata/user_act_log_test.go
index 0628a8b..2aa8e67 100644
--- a/server/dbdata/user_act_log_test.go
+++ b/server/dbdata/user_act_log_test.go
@@ -48,18 +48,18 @@ func TestParseUserAgent(t *testing.T) {
},
{
name: "linux",
- args: args{userAgent: "open anyconnect vpn agent v7.08"},
+ args: args{userAgent: "cisco anyconnect vpn agent for linux v7.08"},
want: res{os_idx: 2, client_idx: 0, ver: "7.08"},
},
{
name: "openconnect",
args: args{userAgent: "openconnect-gui 1.5.3 v7.08"},
- want: res{os_idx: 2, client_idx: 1, ver: "7.08"},
+ want: res{os_idx: 5, client_idx: 1, ver: "7.08"},
},
{
name: "unknown",
args: args{userAgent: "unknown 1.4.3 aabcd"},
- want: res{os_idx: 2, client_idx: 2, ver: ""},
+ want: res{os_idx: 5, client_idx: 2, ver: ""},
},
}
for _, tt := range tests {
diff --git a/server/handler/link_auth.go b/server/handler/link_auth.go
index 698f4b2..e7715fd 100644
--- a/server/handler/link_auth.go
+++ b/server/handler/link_auth.go
@@ -67,10 +67,12 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
}
// 用户活动日志
ua := dbdata.UserActLog{
- Username: cr.Auth.Username,
- GroupName: cr.GroupSelect,
- RemoteAddr: r.RemoteAddr,
- Status: dbdata.UserAuthSuccess,
+ Username: cr.Auth.Username,
+ GroupName: cr.GroupSelect,
+ RemoteAddr: r.RemoteAddr,
+ Status: dbdata.UserAuthSuccess,
+ DeviceType: cr.DeviceId.DeviceType,
+ PlatformVersion: cr.DeviceId.PlatformVersion,
}
// TODO 用户密码校验
err = dbdata.CheckUser(cr.Auth.Username, cr.Auth.Password, cr.GroupSelect)
@@ -100,6 +102,8 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
sess.MacAddr = strings.ToLower(cr.MacAddressList.MacAddress)
sess.UniqueIdGlobal = cr.DeviceId.UniqueIdGlobal
sess.UserAgent = userAgent
+ sess.DeviceType = ua.DeviceType
+ sess.PlatformVersion = ua.PlatformVersion
sess.RemoteAddr = r.RemoteAddr
// 获取客户端mac地址
macHw, err := net.ParseMAC(sess.MacAddr)
diff --git a/server/handler/link_tunnel.go b/server/handler/link_tunnel.go
index dda97b0..f7a4403 100644
--- a/server/handler/link_tunnel.go
+++ b/server/handler/link_tunnel.go
@@ -196,11 +196,13 @@ func LinkTunnel(w http.ResponseWriter, r *http.Request) {
return
}
dbdata.UserActLogIns.Add(dbdata.UserActLog{
- Username: sess.Username,
- GroupName: sess.Group,
- IpAddr: cSess.IpAddr.String(),
- RemoteAddr: cSess.RemoteAddr,
- Status: dbdata.UserConnected,
+ Username: sess.Username,
+ GroupName: sess.Group,
+ IpAddr: cSess.IpAddr.String(),
+ RemoteAddr: cSess.RemoteAddr,
+ DeviceType: sess.DeviceType,
+ PlatformVersion: sess.PlatformVersion,
+ Status: dbdata.UserConnected,
}, cSess.UserAgent)
go LinkCstp(conn, bufRW, cSess)
diff --git a/server/sessdata/session.go b/server/sessdata/session.go
index 4638f9b..6af9bc5 100644
--- a/server/sessdata/session.go
+++ b/server/sessdata/session.go
@@ -64,19 +64,21 @@ type DtlsSession struct {
}
type Session struct {
- mux sync.RWMutex
- Sid string // auth返回的 session-id
- Token string // session信息的唯一token
- DtlsSid string // dtls协议的 session_id
- MacAddr string // 客户端mac地址
- UniqueIdGlobal string // 客户端唯一标示
- MacHw net.HardwareAddr
- Username string // 用户名
- Group string
- AuthStep string
- AuthPass string
- RemoteAddr string
- UserAgent string
+ mux sync.RWMutex
+ Sid string // auth返回的 session-id
+ Token string // session信息的唯一token
+ DtlsSid string // dtls协议的 session_id
+ MacAddr string // 客户端mac地址
+ UniqueIdGlobal string // 客户端唯一标示
+ MacHw net.HardwareAddr
+ Username string // 用户名
+ Group string
+ AuthStep string
+ AuthPass string
+ RemoteAddr string
+ UserAgent string
+ DeviceType string
+ PlatformVersion string
LastLogin time.Time
IsActive bool
@@ -455,11 +457,13 @@ func DelSessByStoken(stoken string) {
func AddUserActLog(cs *ConnSession) {
ua := dbdata.UserActLog{
- Username: cs.Sess.Username,
- GroupName: cs.Sess.Group,
- IpAddr: cs.IpAddr.String(),
- RemoteAddr: cs.RemoteAddr,
- Status: dbdata.UserLogout,
+ Username: cs.Sess.Username,
+ GroupName: cs.Sess.Group,
+ IpAddr: cs.IpAddr.String(),
+ RemoteAddr: cs.RemoteAddr,
+ DeviceType: cs.Sess.DeviceType,
+ PlatformVersion: cs.Sess.PlatformVersion,
+ Status: dbdata.UserLogout,
}
ua.Info = dbdata.UserActLogIns.GetInfoOpsById(cs.UserLogoutCode)
dbdata.UserActLogIns.Add(ua, cs.UserAgent)
@@ -467,12 +471,14 @@ func AddUserActLog(cs *ConnSession) {
func AddUserActLogBySess(sess *Session) {
ua := dbdata.UserActLog{
- Username: sess.Username,
- GroupName: sess.Group,
- IpAddr: "",
- RemoteAddr: sess.RemoteAddr,
- Status: dbdata.UserLogout,
+ Username: sess.Username,
+ GroupName: sess.Group,
+ IpAddr: "",
+ RemoteAddr: sess.RemoteAddr,
+ DeviceType: sess.DeviceType,
+ PlatformVersion: sess.PlatformVersion,
+ Status: dbdata.UserLogout,
}
- ua.Info = dbdata.UserActLogIns.GetInfoOpsById(1)
+ ua.Info = dbdata.UserActLogIns.GetInfoOpsById(dbdata.UserLogoutBanner)
dbdata.UserActLogIns.Add(ua, sess.UserAgent)
}
diff --git a/web/src/components/audit/ActLog.vue b/web/src/components/audit/ActLog.vue
index 0f1f4fc..ab0e79e 100644
--- a/web/src/components/audit/ActLog.vue
+++ b/web/src/components/audit/ActLog.vue
@@ -67,12 +67,12 @@
prop="id"
label="ID"
sortable="custom"
- width="60">
+ width="100">