web

package
v0.4.7-1-testing-2025-... Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 3, 2025 License: GPL-2.0 Imports: 29 Imported by: 0

README

admin.go:type AdminPageData struct { admin.go:func (s *WebServer) getUptime() string { admin.go:func (s *WebServer) countEnabledAPITokens(tokens []*database.APIToken) int { admin.go:func (s *WebServer) adminCreateNewsgroup(c *gin.Context) { admin.go:func (s *WebServer) adminUpdateNewsgroup(c *gin.Context) { admin.go:func (s *WebServer) adminDeleteNewsgroup(c *gin.Context) { admin.go:func (s *WebServer) adminCreateProvider(c *gin.Context) { admin.go:func (s *WebServer) adminUpdateProvider(c *gin.Context) { admin.go:func (s *WebServer) adminDeleteProvider(c *gin.Context) { admin.go:func (s *WebServer) adminCreateAPIToken(c *gin.Context) { admin.go:func (s *WebServer) adminToggleAPIToken(c *gin.Context) { admin.go:func (s *WebServer) adminDeleteAPIToken(c *gin.Context) { admin.go:func (s *WebServer) adminCleanupExpiredTokens(c *gin.Context) { admin_userfuncs.go:func (s *WebServer) countAdminUsers(users []*models.User) int { admin_userfuncs.go:func (s *WebServer) countActiveSessions() int { admin_userfuncs.go:func (s *WebServer) adminPage(c *gin.Context) { admin_userfuncs.go:func (s *WebServer) adminCreateUser(c *gin.Context) { admin_userfuncs.go:func (s *WebServer) adminUpdateUser(c *gin.Context) { admin_userfuncs.go:func (s *WebServer) adminDeleteUser(c *gin.Context) { admin_userfuncs.go:func (s *WebServer) isAdmin(user *models.User) bool { aichatPage.go:type ChatMessage struct { aichatPage.go:type AIChatPageData struct { aichatPage.go:func (s *WebServer) aichatPage(c *gin.Context) { aichatPage.go:func (s *WebServer) aichatSend(c *gin.Context) { apiHandlers.go:func (s *WebServer) listGroups(c *gin.Context) { apiHandlers.go:func (s *WebServer) getGroupOverview(c *gin.Context) { apiHandlers.go:func (s *WebServer) getArticle(c *gin.Context) { apiHandlers.go:func (s *WebServer) getArticleByMessageId(c *gin.Context) { apiHandlers.go:func (s *WebServer) getGroupThreads(c *gin.Context) { apiHandlers.go:func (s *WebServer) getStats(c *gin.Context) { apitokens.go:func (s *WebServer) APIAuthRequired() gin.HandlerFunc { apitokens.go:func (s *WebServer) createAPITokenHandler(c *gin.Context) { apitokens.go:func (s *WebServer) listAPITokensHandler(c *gin.Context) { apitokens.go:func (s *WebServer) disableAPITokenHandler(c *gin.Context) { apitokens.go:func (s *WebServer) enableAPITokenHandler(c *gin.Context) { apitokens.go:func (s *WebServer) deleteAPITokenHandler(c *gin.Context) { apitokens.go:func (s *WebServer) cleanupExpiredTokensHandler(c *gin.Context) { articlePage.go:func (s *WebServer) articlePage(c *gin.Context) { articlePage.go:func (s *WebServer) articleByMessageIdPage(c *gin.Context) { auth.go:type AuthUser struct { auth.go:type SessionData struct { auth.go:func (s *WebServer) WebAuthRequired() gin.HandlerFunc { auth.go:func (s *WebServer) WebAdminRequired() gin.HandlerFunc { auth.go:func (s *WebServer) getWebSession(c *gin.Context) *SessionData { auth.go:func (s *WebServer) createWebSession(c *gin.Context, userID int64) error { auth.go:func (s *WebServer) destroyWebSession(c *gin.Context) { auth.go:func hashPassword(password string) (string, error) { auth.go:func checkPassword(password, hash string) bool { auth.go:func validateEmail(email string) bool { auth.go:func validateUsername(username string) error { auth.go:func validatePassword(password string) error { groupPage.go:func (s *WebServer) groupPage(c *gin.Context) { groupsPage.go:func (s *WebServer) groupsPage(c *gin.Context) { groupThreadsPage.go:func (s *WebServer) groupThreadsPage(c *gin.Context) { helpPage.go:func (s *WebServer) helpPage(c *gin.Context) { homePage.go:func (s *WebServer) homePage(c *gin.Context) { login.go:type LoginPageData struct { login.go:func (s *WebServer) loginPage(c *gin.Context) { login.go:func (s *WebServer) loginSubmit(c *gin.Context) { login.go:func (s *WebServer) logout(c *gin.Context) { login.go:func (s *WebServer) renderLoginError(c *gin.Context, errorMsg, redirectURL string) { profile.go:type ProfilePageData struct { profile.go:func (s *WebServer) profilePage(c *gin.Context) { profile.go:func (s *WebServer) profileUpdate(c *gin.Context) { register.go:type RegisterPageData struct { register.go:func (s *WebServer) registerPage(c *gin.Context) { register.go:func (s *WebServer) registerSubmit(c *gin.Context) { register.go:func (s *WebServer) createUser(username, email, passwordHash, displayName string) (*models.User, error) { register.go:func (s *WebServer) renderRegisterError(c *gin.Context, errorMsg, username, email string) { searchPage.go:func (s *WebServer) searchPage(c *gin.Context) { sectionsPage.go:func (s *WebServer) sectionsPage(c *gin.Context) { sectionsPage.go:func (s *WebServer) sectionPage(c *gin.Context) { sectionsPage.go:func (s *WebServer) sectionGroupPage(c *gin.Context) { sectionsPage.go:func (s *WebServer) sectionArticlePage(c *gin.Context) { sectionsPage.go:func (s *WebServer) sectionArticleByMessageIdPage(c *gin.Context) { server_core.go:type WebServer struct { server_core.go:type TemplateData struct { server_core.go:type GroupPageData struct { server_core.go:type ArticlePageData struct { server_core.go:type StatsPageData struct { server_core.go:type GroupsPageData struct { server_core.go:type SectionPageData struct { server_core.go:type SectionGroupPageData struct { server_core.go:type SectionArticlePageData struct { server_core.go:type SearchPageData struct { server_core.go:func NewServer(db *database.Database, webconfig *config.WebConfig, nntpconfig *nntp.NNTPServer) *WebServer { server_core.go:func (s *WebServer) setupRoutes() { server_core.go:func (s *WebServer) Start() error { statsPage.go:func (s *WebServer) statsPage(c *gin.Context) { threadPage.go:func (s *WebServer) singleThreadPage(c *gin.Context) { threadTreePage.go:func (s *WebServer) handleThreadTreeAPI(c *gin.Context) { threadTreePage.go:func (s *WebServer) threadTreePage(c *gin.Context) { threadTreePage.go:func (s *WebServer) sectionThreadTreePage(c *gin.Context) { threadTreePage.go:func (s *WebServer) threadTreeDemoPage(c *gin.Context) { utils.go:func (s *WebServer) GetPort() int { utils.go:func (s *WebServer) NNTPGetTCPPort() int { utils.go:func (s *WebServer) NNTPGetTLSPort() int { utils.go:func (s *WebServer) getBaseTemplateData(c *gin.Context, title string) TemplateData { utils.go:func (s *WebServer) isAdminUser(user *models.User) bool { utils.go:func (s *WebServer) renderError(c *gin.Context, statusCode int, message string, errstring string) { utils.go:func (s *WebServer) renderTemplate(c *gin.Context, templateName string, data interface{}) { utils.go:func (s *WebServer) GetGroupCount() int { utils.go:func referencesAnyInThread(references string, threadMessageIDs map[string]bool) bool { utils.go:func parseReferences(references string) []string {

Documentation

Overview

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Package web provides the HTTP server and web interface for go-pugleaf

Index

Constants

View Source
const APIAuthHeader = "X-API"
View Source
const OllamaHostname = "ollama-proxy.local:21434"
View Source
const ProxyURL = "http://" + OllamaHostname + "/models"
View Source
const ThreadMessages_perPage int = 50 // Static page size for optimal caching

This file should contain the thread-related page functions from server.go:

Functions to be moved from server.go:

  • func (s *WebServer) singleThreadPage(c *gin.Context) (line ~1394) Handles "/groups/:group/thread/:threadRoot" route to display a single thread flat view

This file will handle thread-specific page functionality for single thread flat views. Note: Tree-related functions are in threadTreePage.go

View Source
const Threads_perPage int64 = 50 // Static page size for optimal caching

Variables

View Source
var EmbeddedStaticFS embed.FS
View Source
var LIMIT_GROUPS_IN_HIERARCHY_TREE = 128
View Source
var LIMIT_groupPage = 128
View Source
var LIMIT_hierarchiesPage = 512
View Source
var LIMIT_hierarchyGroupsPage = 256
View Source
var LIMIT_hierarchyTreePage = 384
View Source
var LIMIT_listGroups = 128

This file should contain the API endpoint functions from server.go:

View Source
var LIMIT_sectionGroupPage = 128
View Source
var LIMIT_sectionPage = 128

This file should contain the sections page related functions from server.go:

Functions

func EmbeddedFileHandler

func EmbeddedFileHandler(filePath string) gin.HandlerFunc

EmbeddedFileHandler returns a Gin handler for serving a single embedded file

func EmbeddedStaticHandler

func EmbeddedStaticHandler(prefix string) gin.HandlerFunc

EmbeddedStaticHandler returns a Gin handler for serving embedded static files

func GetAndClearFlash

func GetAndClearFlash(sessionID string) (success, errorMsg string)

GetAndClearFlash retrieves and clears flash messages for a session

func ListEmbeddedFiles

func ListEmbeddedFiles() ([]string, error)

ListEmbeddedFiles returns a list of all embedded static files for debugging

func SetFlashError

func SetFlashError(sessionID, msg string)

SetFlashError sets a temporary error message for a session

func SetFlashSuccess

func SetFlashSuccess(sessionID, msg string)

SetFlashSuccess sets a temporary success message for a session

func UseEmbeddedStatic

func UseEmbeddedStatic() bool

UseEmbeddedStatic returns true if embedded static files are available

Types

type AIChatPageData

type AIChatPageData struct {
	TemplateData
	ChatHistory     []ChatMessage
	Error           string
	SessionToken    string            // Strong session token for chat history
	AvailableModels []*models.AIModel // Available AI models for selection
	DefaultModel    *models.AIModel   // Default selected model
	ChatCounts      map[string]int    // Chat message counts per model
	MaxInputLength  int               // Maximum input length for chat messages
}

AIChatPageData for the chat page template

type AdminPageData

type AdminPageData struct {
	TemplateData
	Users               []*models.User
	Newsgroups          []*models.Newsgroup
	NewsgroupPagination *models.PaginationInfo
	NewsgroupSearch     string
	Providers           []*models.Provider
	APITokens           []*database.APIToken
	AIModels            []*models.AIModel
	NNTPUsers           []*models.NNTPUser
	SiteNews            []*models.SiteNews     // Added for site news management
	Sections            []*models.Section      // Added for section management
	SectionGroups       []*models.SectionGroup // Added for section-newsgroup assignments
	SpamArticles        []*SpamArticleInfo     // Added for spam management
	SpamPagination      *models.PaginationInfo // Added for spam pagination
	CurrentUser         *models.User
	AdminCount          int
	EnabledTokensCount  int
	ActiveSessions      int
	ActiveNNTPUsers     int
	PostingNNTPUsers    int
	Uptime              string
	CacheStats          map[string]interface{} // Added for cache monitoring
	NewsgroupCacheStats map[string]interface{} // Added for newsgroup cache monitoring
	ArticleCacheStats   map[string]interface{} // Added for article cache monitoring
	NNTPAuthCacheStats  map[string]interface{} // Added for NNTP auth cache monitoring
	MessageIdCacheStats map[string]interface{} // Added for message ID cache monitoring
	RegistrationEnabled bool                   // Added for registration control
	Success             string
	Error               string
	ActiveTab           string // Added for tab state
}

AdminPageData represents data for admin page

type ArticlePageData

type ArticlePageData struct {
	TemplateData
	GroupName   string
	GroupPtr    *string
	ArticleNum  int64
	Article     *models.Article
	Thread      []*models.Overview
	PrevArticle int64
	NextArticle int64
}

ArticlePageData represents data for article page

type AuthUser

type AuthUser struct {
	ID          int64  `json:"id"`
	Username    string `json:"username"`
	Email       string `json:"email"`
	DisplayName string `json:"display_name"`
	CreatedAt   string `json:"created_at"`
}

AuthUser represents a user for authentication

type ChatMessage

type ChatMessage struct {
	Role    string // "user" or "assistant"
	Content string
}

ChatMessage represents a single chat message (extend as needed for frontend)

type FlashMessage

type FlashMessage struct {
	Type    string // "success" or "error"
	Message string
}

FlashMessage represents a temporary success/error message

type GroupPageData

type GroupPageData struct {
	TemplateData
	GroupName  string
	GroupPtr   *string
	Articles   []*models.Overview
	Pagination *models.PaginationInfo
}

GroupPageData represents data for group page

type GroupThreadsPageData

type GroupThreadsPageData struct {
	TemplateData
	GroupName     string
	ForumThreads  []*models.ForumThread
	TotalThreads  int64
	TotalMessages int
	CurrentPage   int64
	TotalPages    int64
	PerPage       int64
	HasPrevPage   bool
	HasNextPage   bool
	PrevPage      int64
	NextPage      int64
}

GroupThreadsPageData represents data for group threads page

type GroupsPageData

type GroupsPageData struct {
	TemplateData
	Groups     []*models.Newsgroup
	Pagination *models.PaginationInfo
	GroupCount int
}

GroupsPageData represents data for groups page

type HierarchiesPageData

type HierarchiesPageData struct {
	TemplateData
	Hierarchies []*models.Hierarchy
	Pagination  *models.PaginationInfo
	SortBy      string
}

HierarchiesPageData represents data for hierarchies page

type HierarchyBreadcrumb

type HierarchyBreadcrumb struct {
	Name   string
	Path   string
	IsLast bool
}

HierarchyBreadcrumb represents a breadcrumb item in hierarchy navigation

type HierarchyGroupsPageData

type HierarchyGroupsPageData struct {
	TemplateData
	HierarchyName string
	Groups        []*models.Newsgroup
	Pagination    *models.PaginationInfo
	SortBy        string
}

HierarchyGroupsPageData represents data for groups within a hierarchy

type HierarchyNode

type HierarchyNode struct {
	Name       string
	FullPath   string
	GroupCount int
	HasGroups  bool
}

HierarchyNode represents a node in the hierarchy tree

type HierarchyTreePageData

type HierarchyTreePageData struct {
	TemplateData
	HierarchyName  string
	CurrentPath    string
	RelativePath   string // Path relative to hierarchy (e.g., "arts" for "alt.arts")
	ParentPath     string
	Breadcrumbs    []HierarchyBreadcrumb
	SubHierarchies []HierarchyNode
	Groups         []*models.Newsgroup
	TotalSubItems  int
	TotalGroups    int
	ShowingGroups  bool
	SortBy         string
	Pagination     *models.PaginationInfo
	AtMaxDepth     bool // True if we're at the maximum supported hierarchy depth (level 3)
}

HierarchyTreePageData represents data for hierarchical tree navigation

type LoginPageData

type LoginPageData struct {
	TemplateData
	Error       string
	RedirectURL string
}

LoginPageData represents data for login page

type NewsPageData

type NewsPageData struct {
	TemplateData
}

NewsPageData represents data for news page

type ProfilePageData

type ProfilePageData struct {
	TemplateData
	User    *models.User
	Error   string
	Success string
}

ProfilePageData represents data for profile page

type ProxyModel

type ProxyModel struct {
	Name   string   `json:"name"`
	Post   string   `json:"post"`
	Caps   []string `json:"caps"`
	Size   int64    `json:"size"`
	Family string   `json:"family"`
}

type ProxyModelResponse

type ProxyModelResponse struct {
	Models []ProxyModel `json:"models"`
}

ProxyModelResponse represents the response from ollama-proxy /models endpoint

type RegisterPageData

type RegisterPageData struct {
	TemplateData
	Error    string
	Username string
	Email    string
}

RegisterPageData represents data for register page

type SearchPageData

type SearchPageData struct {
	TemplateData
	Query       string
	SearchType  string
	Results     interface{}
	ResultCount int
	HasResults  bool
	Pagination  *models.PaginationInfo
}

SearchPageData represents data for search page

type SectionArticlePageData

type SectionArticlePageData struct {
	TemplateData
	Section     *models.Section
	GroupName   string
	ArticleNum  int64
	Article     *models.Article
	Thread      []*models.Overview
	PrevArticle int64
	NextArticle int64
}

SectionArticlePageData represents data for article page within a section

type SectionGroupPageData

type SectionGroupPageData struct {
	TemplateData
	Section     *models.Section
	GroupName   string
	Articles    []*models.Overview
	Pagination  *models.PaginationInfo
	GroupExists bool
}

SectionGroupPageData represents data for group page within a section

type SectionPageData

type SectionPageData struct {
	TemplateData
	Section           *models.Section
	Groups            []*models.SectionGroup
	Pagination        *models.PaginationInfo
	TotalGroups       int
	AvailableSections []*models.Section
}

SectionPageData represents data for section page (shows groups in section)

type SessionData

type SessionData struct {
	SessionID  string
	UserID     int64
	User       *AuthUser
	ExpiresAt  time.Time
	TmpError   string // Temporary error message for rendering
	TmpSuccess string // Temporary success message for rendering
}

SessionData represents session information with user data

func (*SessionData) GetError

func (s *SessionData) GetError() string

GetError retrieves and clears the temporary error message

func (*SessionData) GetSuccess

func (s *SessionData) GetSuccess() string

GetSuccess retrieves and clears the temporary success message

func (*SessionData) SetError

func (s *SessionData) SetError(msg string)

SetError sets a temporary error message in session data

func (*SessionData) SetSuccess

func (s *SessionData) SetSuccess(msg string)

SetSuccess sets a temporary success message in session data

type SpamArticleInfo

type SpamArticleInfo struct {
	*models.Overview
	GroupName string
}

SpamArticleInfo wraps Overview with group name for admin spam management

type StatsPageData

type StatsPageData struct {
	TemplateData
	Groups        []*models.Newsgroup
	TotalArticles int64
}

StatsPageData represents data for stats page

type TemplateData

type TemplateData struct {
	Title               template.HTML
	CurrentTime         string
	Port                int
	NNTPtcpPort         int
	NNTPtlsPort         int
	GroupCount          int
	User                *AuthUser
	IsAdmin             bool
	AppVersion          string
	RegistrationEnabled bool
	SiteNews            []*models.SiteNews // For home page news display
	AvailableSections   []*models.Section  // For global sections navigation
	AvailableAIModels   []*models.AIModel  // For conditional AI chat navigation
}

TemplateData represents common template data

type WebServer

type WebServer struct {
	DB     *database.Database
	Router *gin.Engine
	Config *config.WebConfig
	NNTP   *nntp.NNTPServer

	StartTime     time.Time       // Track server start time for uptime calculations
	SectionsCache map[string]bool // In-memory cache of valid section names for route filtering
	// contains filtered or unexported fields
}

Server represents the web server

func NewServer

func NewServer(db *database.Database, webconfig *config.WebConfig, nntpconfig *nntp.NNTPServer) *WebServer

NewServer creates a new web server instance

func (*WebServer) APIAuthRequired

func (s *WebServer) APIAuthRequired() gin.HandlerFunc

AuthRequired middleware for API token authentication

func (*WebServer) ApacheLogFormat

func (s *WebServer) ApacheLogFormat() gin.HandlerFunc

func (*WebServer) AssignNewsgroupHandler

func (s *WebServer) AssignNewsgroupHandler(c *gin.Context)

AssignNewsgroupHandler handles assigning newsgroups to a section using pattern matching

func (*WebServer) BotDetectionMiddleware

func (s *WebServer) BotDetectionMiddleware() gin.HandlerFunc

Custom bot detection middleware

func (*WebServer) CreateSectionHandler

func (s *WebServer) CreateSectionHandler(c *gin.Context)

CreateSectionHandler handles creating a new section

func (*WebServer) DeleteSectionHandler

func (s *WebServer) DeleteSectionHandler(c *gin.Context)

DeleteSectionHandler handles deleting a section

func (*WebServer) GetGroupCount

func (s *WebServer) GetGroupCount() int

GetGroupCount returns the total number of active newsgroups

func (*WebServer) GetPort

func (s *WebServer) GetPort() int

GetPort returns the listening port from the config

func (*WebServer) NNTPGetTCPPort

func (s *WebServer) NNTPGetTCPPort() int

NNTPGetTCPPort returns the listening TCP port from the config

func (*WebServer) NNTPGetTLSPort

func (s *WebServer) NNTPGetTLSPort() int

NNTPGetTLSPort returns the listening TLS port from the config

func (*WebServer) ReverseProxyMiddleware

func (s *WebServer) ReverseProxyMiddleware() gin.HandlerFunc

ReverseProxyMiddleware handles X-Forwarded headers when running behind a reverse proxy

func (*WebServer) SectionsHandler

func (s *WebServer) SectionsHandler(c *gin.Context)

SectionsHandler handles the main sections admin page

func (*WebServer) Start

func (s *WebServer) Start() error

Start starts the web server with SSL support if configured

func (*WebServer) StartSessionCleanup

func (s *WebServer) StartSessionCleanup()

StartSessionCleanup starts a background goroutine to clean up expired sessions

func (*WebServer) UnassignNewsgroupHandler

func (s *WebServer) UnassignNewsgroupHandler(c *gin.Context)

UnassignNewsgroupHandler handles removing a newsgroup from a section

func (*WebServer) UpdateSectionHandler

func (s *WebServer) UpdateSectionHandler(c *gin.Context)

UpdateSectionHandler handles updating an existing section

func (*WebServer) WebAdminRequired

func (s *WebServer) WebAdminRequired() gin.HandlerFunc

WebAdminRequired middleware for admin-only routes

func (*WebServer) WebAuthRequired

func (s *WebServer) WebAuthRequired() gin.HandlerFunc

WebAuthRequired middleware for web authentication (different from API auth)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL