mirror of
https://github.com/h44z/wg-portal
synced 2025-02-26 05:49:14 +00:00
171 lines
4.0 KiB
Go
171 lines
4.0 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/h44z/wg-portal/internal/config"
|
|
"github.com/h44z/wg-portal/internal/domain"
|
|
"github.com/sirupsen/logrus"
|
|
evbus "github.com/vardius/message-bus"
|
|
)
|
|
|
|
type App struct {
|
|
Config *config.Config
|
|
bus evbus.MessageBus
|
|
|
|
Authenticator
|
|
UserManager
|
|
WireGuardManager
|
|
StatisticsCollector
|
|
ConfigFileManager
|
|
MailManager
|
|
ApiV1Manager
|
|
}
|
|
|
|
func New(
|
|
cfg *config.Config,
|
|
bus evbus.MessageBus,
|
|
authenticator Authenticator,
|
|
users UserManager,
|
|
wireGuard WireGuardManager,
|
|
stats StatisticsCollector,
|
|
cfgFiles ConfigFileManager,
|
|
mailer MailManager,
|
|
) (*App, error) {
|
|
|
|
a := &App{
|
|
Config: cfg,
|
|
bus: bus,
|
|
|
|
Authenticator: authenticator,
|
|
UserManager: users,
|
|
WireGuardManager: wireGuard,
|
|
StatisticsCollector: stats,
|
|
ConfigFileManager: cfgFiles,
|
|
MailManager: mailer,
|
|
}
|
|
|
|
startupContext, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
// Switch to admin user context
|
|
startupContext = domain.SetUserInfo(startupContext, domain.SystemAdminContextUserInfo())
|
|
|
|
if err := a.createDefaultUser(startupContext); err != nil {
|
|
return nil, fmt.Errorf("failed to create default user: %w", err)
|
|
}
|
|
|
|
if err := a.importNewInterfaces(startupContext); err != nil {
|
|
return nil, fmt.Errorf("failed to import new interfaces: %w", err)
|
|
}
|
|
|
|
if err := a.restoreInterfaceState(startupContext); err != nil {
|
|
return nil, fmt.Errorf("failed to restore interface state: %w", err)
|
|
}
|
|
|
|
return a, nil
|
|
}
|
|
|
|
func (a *App) Startup(ctx context.Context) error {
|
|
|
|
a.UserManager.StartBackgroundJobs(ctx)
|
|
a.StatisticsCollector.StartBackgroundJobs(ctx)
|
|
a.WireGuardManager.StartBackgroundJobs(ctx)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (a *App) importNewInterfaces(ctx context.Context) error {
|
|
if !a.Config.Core.ImportExisting {
|
|
logrus.Trace("skipping interface import - feature disabled")
|
|
return nil // feature disabled
|
|
}
|
|
|
|
importedCount, err := a.ImportNewInterfaces(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if importedCount > 0 {
|
|
logrus.Infof("%d new interfaces imported", importedCount)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *App) restoreInterfaceState(ctx context.Context) error {
|
|
if !a.Config.Core.RestoreState {
|
|
logrus.Trace("skipping interface state restore - feature disabled")
|
|
return nil // feature disabled
|
|
}
|
|
|
|
err := a.RestoreInterfaceState(ctx, true)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
logrus.Info("interface state restored")
|
|
return nil
|
|
}
|
|
|
|
func (a *App) createDefaultUser(ctx context.Context) error {
|
|
adminUserId := domain.UserIdentifier(a.Config.Core.AdminUser)
|
|
if adminUserId == "" {
|
|
logrus.Trace("skipping default user creation - admin user is blank")
|
|
return nil // empty admin user - do not create
|
|
}
|
|
|
|
_, err := a.GetUser(ctx, adminUserId)
|
|
if err != nil && !errors.Is(err, domain.ErrNotFound) {
|
|
return err
|
|
}
|
|
if err == nil {
|
|
logrus.Trace("skipping default user creation - admin user already exists")
|
|
return nil // admin user already exists
|
|
}
|
|
|
|
now := time.Now()
|
|
defaultAdmin := &domain.User{
|
|
BaseModel: domain.BaseModel{
|
|
CreatedBy: domain.CtxSystemAdminId,
|
|
UpdatedBy: domain.CtxSystemAdminId,
|
|
CreatedAt: now,
|
|
UpdatedAt: now,
|
|
},
|
|
Identifier: adminUserId,
|
|
Email: "admin@wgportal.local",
|
|
Source: domain.UserSourceDatabase,
|
|
ProviderName: "",
|
|
IsAdmin: true,
|
|
Firstname: "WireGuard Portal",
|
|
Lastname: "Admin",
|
|
Phone: "",
|
|
Department: "",
|
|
Notes: "default administrator user",
|
|
Password: domain.PrivateString(a.Config.Core.AdminPassword),
|
|
Disabled: nil,
|
|
DisabledReason: "",
|
|
Locked: nil,
|
|
LockedReason: "",
|
|
LinkedPeerCount: 0,
|
|
}
|
|
if a.Config.Core.AdminApiToken != "" {
|
|
if len(a.Config.Core.AdminApiToken) < 18 {
|
|
logrus.Warnf("[SECURITY WARNING] admin API token is too short, should be at least 18 characters long")
|
|
}
|
|
defaultAdmin.ApiToken = a.Config.Core.AdminApiToken
|
|
defaultAdmin.ApiTokenCreated = &now
|
|
}
|
|
|
|
admin, err := a.CreateUser(ctx, defaultAdmin)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
logrus.Infof("admin user %s created", admin.Identifier)
|
|
|
|
return nil
|
|
}
|