Files
sessiongurad/internal/model/types.go
jbergner f369ea5f52
All checks were successful
release-tag / release-image (push) Successful in 2m1s
release-main / release-images (push) Successful in 4m14s
Major Bugfix
2026-08-24 22:19:20 +02:00

474 lines
19 KiB
Go

package model
import "time"
const ProtocolVersion = 4
type OIDCConfig struct {
Issuer string `json:"issuer"`
ClientID string `json:"client_id"`
ClientSecret string `json:"client_secret"`
RedirectURL string `json:"redirect_url"`
LogoutRedirectURL string `json:"logout_redirect_url,omitempty"`
AdminGroups []string `json:"admin_groups,omitempty"`
SecureCookie bool `json:"secure_cookie"`
}
// AccessAuthConfig configures the SessionGuard Master as a Traefik ForwardAuth
// endpoint for browser-facing services such as Apache Guacamole. It deliberately
// has its own redirect/cookie scope because the SessionGuard admin UI and the
// protected application may live on different DNS domains. Blank issuer/client
// fields inherit their values from the primary OIDC configuration.
type AccessAuthConfig struct {
Enabled bool `json:"enabled"`
Issuer string `json:"issuer,omitempty"`
ClientID string `json:"client_id,omitempty"`
ClientSecret string `json:"client_secret,omitempty"`
RedirectURL string `json:"redirect_url"`
LogoutRedirectURL string `json:"logout_redirect_url,omitempty"`
CookieName string `json:"cookie_name,omitempty"`
CookieDomain string `json:"cookie_domain,omitempty"`
SecureCookie bool `json:"secure_cookie"`
SessionHours int `json:"session_hours,omitempty"`
UsernameClaim string `json:"username_claim,omitempty"`
AllowedGroups []string `json:"allowed_groups,omitempty"`
AllowedHosts []string `json:"allowed_hosts,omitempty"`
}
// AuthSession is an opaque, server-side browser session. SessionGuard stores
// only the SHA-256 hash of the random browser token as the map key.
type AuthSession struct {
ID string `json:"id"`
TokenHash string `json:"token_hash"`
Subject string `json:"subject"`
SID string `json:"sid,omitempty"`
Username string `json:"username"`
Email string `json:"email,omitempty"`
Name string `json:"name,omitempty"`
Groups []string `json:"groups,omitempty"`
IDToken string `json:"id_token,omitempty"`
CreatedAt time.Time `json:"created_at"`
ExpiresAt time.Time `json:"expires_at"`
}
type RBACConfig struct {
DefaultRole string `json:"default_role,omitempty"`
Groups map[string][]string `json:"groups,omitempty"`
}
type BrokerConfig struct {
Enabled bool `json:"enabled"`
APIKey string `json:"api_key,omitempty"`
LeaseSeconds int `json:"lease_seconds"`
MinHealthScore int `json:"min_health_score"`
ReconnectExisting bool `json:"reconnect_existing"`
SingleSession bool `json:"single_session_per_user"`
DefaultFarmID string `json:"default_farm_id,omitempty"`
}
type AlertConfig struct {
Enabled bool `json:"enabled"`
WebhookURL string `json:"webhook_url,omitempty"`
CPUPercent int `json:"cpu_percent"`
MemoryPercent int `json:"memory_percent"`
DiskFreeGB int `json:"disk_free_gb"`
HealthScore int `json:"health_score"`
OfflineSeconds int `json:"offline_seconds"`
ProfileFailures int `json:"profile_failures"`
DisconnectedSessions int `json:"disconnected_sessions"`
LogonDurationSeconds int `json:"logon_duration_seconds"`
NotificationMinInterval int `json:"notification_min_interval_seconds"`
}
type CleanupPolicy struct {
Enabled bool `json:"enabled"`
GraceSeconds int `json:"grace_seconds"`
PollSeconds int `json:"poll_seconds"`
RetrySeconds int `json:"retry_seconds"`
DryRun bool `json:"dry_run"`
ExcludeUsers []string `json:"exclude_users,omitempty"`
ExcludeSIDs []string `json:"exclude_sids,omitempty"`
AllowedProfileRoots []string `json:"allowed_profile_roots,omitempty"`
}
type ProfileFolder struct {
Path string `json:"path"`
ExcludeGlobs []string `json:"exclude_globs,omitempty"`
}
type ProfilePolicy struct {
Enabled bool `json:"enabled"`
StoreRoot string `json:"store_root,omitempty"`
BackupOnLogoff bool `json:"backup_on_logoff"`
RestoreOnLogon bool `json:"restore_on_logon"`
BackupDelaySeconds int `json:"backup_delay_seconds"`
RetrySeconds int `json:"retry_seconds"`
RestoreWindowSeconds int `json:"restore_window_seconds"`
KeepVersions int `json:"keep_versions"`
ExcludeUsers []string `json:"exclude_users,omitempty"`
ExcludeSIDs []string `json:"exclude_sids,omitempty"`
Folders []ProfileFolder `json:"folders,omitempty"`
}
type SessionPolicy struct {
ControlEnabled bool `json:"control_enabled"`
DisconnectedLogoffEnabled bool `json:"disconnected_logoff_enabled"`
DisconnectedTimeoutSeconds int `json:"disconnected_timeout_seconds"`
ExcludeUsers []string `json:"exclude_users,omitempty"`
ExcludeSIDs []string `json:"exclude_sids,omitempty"`
}
type ShortcutSpec struct {
Target string `json:"target"`
Arguments string `json:"arguments,omitempty"`
WorkingDirectory string `json:"working_directory,omitempty"`
IconLocation string `json:"icon_location,omitempty"`
Description string `json:"description,omitempty"`
}
type TemplateItem struct {
ID string `json:"id"`
Kind string `json:"kind"`
Target string `json:"target"`
Source string `json:"source,omitempty"`
Content string `json:"content,omitempty"`
ContentBase64 string `json:"content_base64,omitempty"`
URL string `json:"url,omitempty"`
Shortcut *ShortcutSpec `json:"shortcut,omitempty"`
Overwrite bool `json:"overwrite"`
}
type Policy struct {
Revision string `json:"revision"`
UpdatedAt time.Time `json:"updated_at"`
Cleanup CleanupPolicy `json:"cleanup"`
Profiles ProfilePolicy `json:"profiles"`
Sessions SessionPolicy `json:"sessions"`
Templates []TemplateItem `json:"templates,omitempty"`
}
// RemoteAppSpec describes the desired RemoteApp registration on an RD Session Host.
// ResourceID binds the local Windows publication back to the SessionGuard resource.
type RemoteAppSpec struct {
ResourceID string `json:"resource_id"`
Alias string `json:"alias"`
DisplayName string `json:"display_name"`
Path string `json:"path"`
IconPath string `json:"icon_path,omitempty"`
IconIndex int32 `json:"icon_index,omitempty"`
CommandLineSetting uint32 `json:"command_line_setting"` // 0=deny, 1=allow, 2=require
RequiredCommandLine string `json:"required_command_line,omitempty"`
ShowInPortal bool `json:"show_in_portal,omitempty"`
}
// RemoteAppStatus is the agent-observed state of a RemoteApp publication.
type RemoteAppStatus struct {
ResourceID string `json:"resource_id,omitempty"`
Alias string `json:"alias"`
DisplayName string `json:"display_name,omitempty"`
Path string `json:"path,omitempty"`
VPath string `json:"vpath,omitempty"`
PathExists bool `json:"path_exists"`
Published bool `json:"published"`
Managed bool `json:"managed"`
Owned bool `json:"owned,omitempty"` // registration was created by SessionGuard
InSync bool `json:"in_sync"`
CommandLineSetting uint32 `json:"command_line_setting,omitempty"`
RequiredCommandLine string `json:"required_command_line,omitempty"`
Error string `json:"error,omitempty"`
ObservedAt time.Time `json:"observed_at"`
}
type Session struct {
ID uint32 `json:"id"`
State string `json:"state"`
User string `json:"user,omitempty"`
Domain string `json:"domain,omitempty"`
SID string `json:"sid,omitempty"`
ClientName string `json:"client_name,omitempty"`
ClientAddress string `json:"client_address,omitempty"`
StationName string `json:"station_name,omitempty"`
LogonAt *time.Time `json:"logon_at,omitempty"`
ConnectAt *time.Time `json:"connect_at,omitempty"`
LastInputAt *time.Time `json:"last_input_at,omitempty"`
DisconnectedSince *time.Time `json:"disconnected_since,omitempty"`
IdleSeconds int64 `json:"idle_seconds,omitempty"`
}
type ProcessInfo struct {
PID uint32 `json:"pid"`
SessionID uint32 `json:"session_id"`
Name string `json:"name"`
UserSID string `json:"user_sid,omitempty"`
MemoryBytes uint64 `json:"memory_bytes,omitempty"`
}
type ServerInfo struct {
Hostname string `json:"hostname"`
OS string `json:"os"`
Version string `json:"version,omitempty"`
Build string `json:"build,omitempty"`
UptimeSeconds uint64 `json:"uptime_seconds"`
MemoryTotal uint64 `json:"memory_total"`
MemoryAvailable uint64 `json:"memory_available"`
CPUPercent float64 `json:"cpu_percent,omitempty"`
DiskTotal uint64 `json:"disk_total,omitempty"`
DiskFree uint64 `json:"disk_free,omitempty"`
}
type HealthCheck struct {
Name string `json:"name"`
OK bool `json:"ok"`
Message string `json:"message,omitempty"`
}
type HealthStatus struct {
Score int `json:"score"`
ProfileStoreOK bool `json:"profile_store_ok"`
RDPListenerOK bool `json:"rdp_listener_ok"`
Checks []HealthCheck `json:"checks,omitempty"`
CalculatedAt time.Time `json:"calculated_at"`
}
type SessionTelemetry struct {
SessionID uint32 `json:"session_id"`
SID string `json:"sid,omitempty"`
User string `json:"user,omitempty"`
FirstSeenAt time.Time `json:"first_seen_at"`
LogonAt time.Time `json:"logon_at,omitempty"`
RestoreStartedAt time.Time `json:"restore_started_at,omitempty"`
RestoreFinishedAt time.Time `json:"restore_finished_at,omitempty"`
ReadyAt time.Time `json:"ready_at,omitempty"`
RestoreDurationMS int64 `json:"restore_duration_ms,omitempty"`
ObservedLogonMS int64 `json:"observed_logon_ms,omitempty"`
}
type CleanupJob struct {
SID string `json:"sid"`
User string `json:"user"`
ProfilePath string `json:"profile_path"`
DueAt time.Time `json:"due_at"`
Attempts int `json:"attempts"`
LastError string `json:"last_error,omitempty"`
}
type ProfileJob struct {
ID string `json:"id"`
Operation string `json:"operation"`
SID string `json:"sid"`
User string `json:"user"`
SessionID uint32 `json:"session_id,omitempty"`
ProfilePath string `json:"profile_path"`
Reason string `json:"reason,omitempty"`
CreatedAt time.Time `json:"created_at"`
DueAt time.Time `json:"due_at"`
Attempts int `json:"attempts"`
LastError string `json:"last_error,omitempty"`
}
type ProfileStatus struct {
SID string `json:"sid"`
User string `json:"user,omitempty"`
LastBackupAt time.Time `json:"last_backup_at,omitempty"`
LastRestoreAt time.Time `json:"last_restore_at,omitempty"`
LastBackupError string `json:"last_backup_error,omitempty"`
LastRestoreError string `json:"last_restore_error,omitempty"`
}
type AgentEvent struct {
Time time.Time `json:"time"`
Level string `json:"level"`
Type string `json:"type"`
User string `json:"user,omitempty"`
Message string `json:"message"`
}
type SessionCommand struct {
ID string `json:"id"`
Action string `json:"action"`
SessionID uint32 `json:"session_id,omitempty"`
PID uint32 `json:"pid,omitempty"`
Title string `json:"title,omitempty"`
Message string `json:"message,omitempty"`
RequestedBy string `json:"requested_by,omitempty"`
CreatedAt time.Time `json:"created_at"`
ExpiresAt time.Time `json:"expires_at"`
}
type CommandResult struct {
ID string `json:"id"`
Action string `json:"action"`
SessionID uint32 `json:"session_id,omitempty"`
PID uint32 `json:"pid,omitempty"`
CompletedAt time.Time `json:"completed_at"`
Success bool `json:"success"`
Error string `json:"error,omitempty"`
}
type SessionActionRequest struct {
Action string `json:"action"`
PID uint32 `json:"pid,omitempty"`
Title string `json:"title,omitempty"`
Message string `json:"message,omitempty"`
}
type AuditEntry struct {
Time time.Time `json:"time"`
Actor string `json:"actor"`
Action string `json:"action"`
Target string `json:"target,omitempty"`
Result string `json:"result"`
Details string `json:"details,omitempty"`
}
type AgentSnapshot struct {
ProtocolVersion int `json:"protocol_version"`
AgentID string `json:"agent_id"`
Server ServerInfo `json:"server"`
Health HealthStatus `json:"health"`
Sessions []Session `json:"sessions"`
Processes []ProcessInfo `json:"processes,omitempty"`
Telemetry map[uint32]SessionTelemetry `json:"telemetry,omitempty"`
PendingCleanup []CleanupJob `json:"pending_cleanup,omitempty"`
ProfileJobs []ProfileJob `json:"profile_jobs,omitempty"`
ProfileStatus map[string]ProfileStatus `json:"profile_status,omitempty"`
Events []AgentEvent `json:"events,omitempty"`
CommandResults []CommandResult `json:"command_results,omitempty"`
RemoteApps []RemoteAppStatus `json:"remote_apps,omitempty"`
Policy Policy `json:"policy"`
PolicyRevision string `json:"policy_revision"`
AgentVersion string `json:"agent_version"`
Time time.Time `json:"time"`
}
type AgentRecord struct {
ID string `json:"id"`
Name string `json:"name"`
MachineID string `json:"machine_id"`
TokenHash string `json:"token_hash"`
EnrolledAt time.Time `json:"enrolled_at"`
LastSeen time.Time `json:"last_seen"`
Snapshot AgentSnapshot `json:"snapshot"`
DesiredPolicy *Policy `json:"desired_policy,omitempty"`
PendingCommands []SessionCommand `json:"pending_commands,omitempty"`
Tags map[string]string `json:"tags,omitempty"`
FarmIDs []string `json:"farm_ids,omitempty"`
MaintenanceMode string `json:"maintenance_mode,omitempty"` // online, drain, maintenance
RestartWhenDrained bool `json:"restart_when_drained,omitempty"`
}
type Farm struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description,omitempty"`
AgentIDs []string `json:"agent_ids,omitempty"`
RequiredTags map[string]string `json:"required_tags,omitempty"`
Policy *Policy `json:"policy,omitempty"`
Enabled bool `json:"enabled"`
}
type Resource struct {
ID string `json:"id"`
Name string `json:"name"`
Kind string `json:"kind"` // desktop, remoteapp
FarmID string `json:"farm_id"`
GuacamoleConnectionID string `json:"guacamole_connection_id,omitempty"`
GuacamoleConnectionName string `json:"guacamole_connection_name,omitempty"`
RemoteApp string `json:"remote_app,omitempty"`
RemoteAppDir string `json:"remote_app_dir,omitempty"`
RemoteAppArgs string `json:"remote_app_args,omitempty"`
ManageRemoteApp bool `json:"manage_remote_app,omitempty"`
RemoteAppPath string `json:"remote_app_path,omitempty"`
RemoteAppIconPath string `json:"remote_app_icon_path,omitempty"`
RemoteAppIconIndex int32 `json:"remote_app_icon_index,omitempty"`
RemoteAppCommandLine uint32 `json:"remote_app_command_line_setting,omitempty"` // 0=deny, 1=allow, 2=require
RemoteAppRequiredArgs string `json:"remote_app_required_command_line,omitempty"`
RemoteAppShowInPortal bool `json:"remote_app_show_in_portal,omitempty"`
Enabled bool `json:"enabled"`
}
type UserLease struct {
UserKey string `json:"user_key"`
AgentID string `json:"agent_id"`
FarmID string `json:"farm_id,omitempty"`
ResourceID string `json:"resource_id,omitempty"`
CreatedAt time.Time `json:"created_at"`
ExpiresAt time.Time `json:"expires_at"`
Reason string `json:"reason,omitempty"`
}
type BrokerRequest struct {
Username string `json:"username"`
ConnectionID string `json:"connection_id,omitempty"`
ConnectionName string `json:"connection_name,omitempty"`
ResourceID string `json:"resource_id,omitempty"`
FarmID string `json:"farm_id,omitempty"`
}
type BrokerResponse struct {
AgentID string `json:"agent_id"`
Hostname string `json:"hostname"`
FarmID string `json:"farm_id,omitempty"`
ResourceID string `json:"resource_id,omitempty"`
Reconnect bool `json:"reconnect"`
Reason string `json:"reason"`
HealthScore int `json:"health_score"`
Tokens map[string]string `json:"tokens"`
LeaseExpires time.Time `json:"lease_expires"`
}
type SessionHistoryEvent struct {
Time time.Time `json:"time"`
AgentID string `json:"agent_id"`
Hostname string `json:"hostname"`
SessionID uint32 `json:"session_id"`
User string `json:"user,omitempty"`
SID string `json:"sid,omitempty"`
Event string `json:"event"`
State string `json:"state,omitempty"`
ClientName string `json:"client_name,omitempty"`
Details string `json:"details,omitempty"`
}
type PolicyVersion struct {
ID string `json:"id"`
Target string `json:"target"`
Revision string `json:"revision"`
CreatedAt time.Time `json:"created_at"`
Actor string `json:"actor"`
Policy Policy `json:"policy"`
}
type Alert struct {
ID string `json:"id"`
Key string `json:"key"`
Severity string `json:"severity"`
AgentID string `json:"agent_id,omitempty"`
Hostname string `json:"hostname,omitempty"`
Type string `json:"type"`
Message string `json:"message"`
Active bool `json:"active"`
FirstSeenAt time.Time `json:"first_seen_at"`
LastSeenAt time.Time `json:"last_seen_at"`
ResolvedAt time.Time `json:"resolved_at,omitempty"`
LastNotifiedAt time.Time `json:"last_notified_at,omitempty"`
}
type EnrollRequest struct {
EnrollmentToken string `json:"enrollment_token"`
Name string `json:"name"`
MachineID string `json:"machine_id"`
}
type EnrollResponse struct {
AgentID string `json:"agent_id"`
Token string `json:"token"`
}
type HeartbeatResponse struct {
DesiredPolicy *Policy `json:"desired_policy,omitempty"`
DesiredRemoteApps []RemoteAppSpec `json:"desired_remote_apps"`
Commands []SessionCommand `json:"commands,omitempty"`
ServerTime time.Time `json:"server_time"`
}