Skip to content

Commit

Permalink
activity: fix IP parsing, drop all columns with malformed ips
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewpi committed Jan 24, 2023
1 parent a36cab1 commit 18de96d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 39 deletions.
41 changes: 34 additions & 7 deletions internal/cron/activity_cron.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cron

import (
"context"
"net"

"emperror.dev/errors"

Expand All @@ -17,9 +18,9 @@ type activityCron struct {
max int
}

// Run executes the cronjob and ensures we fetch and send all of the stored activity to the
// Run executes the cronjob and ensures we fetch and send all the stored activity to the
// Panel instance. Once activity is sent it is deleted from the local database instance. Any
// SFTP specific events are not handled in this cron, they're handled seperately to account
// SFTP specific events are not handled in this cron, they're handled separately to account
// for de-duplication and event merging.
func (ac *activityCron) Run(ctx context.Context) error {
// Don't execute this cron if there is currently one running. Once this task is completed
Expand All @@ -34,23 +35,49 @@ func (ac *activityCron) Run(ctx context.Context) error {
Where("event NOT LIKE ?", "server:sftp.%").
Limit(ac.max).
Find(&activity)

if tx.Error != nil {
return errors.WithStack(tx.Error)
}
if len(activity) == 0 {
return nil
}

if err := ac.manager.Client().SendActivityLogs(ctx, activity); err != nil {
// ids to delete from the database.
ids := make([]int, 0, len(activity))
// activities to send to the panel.
activities := make([]models.Activity, 0, len(activity))
for _, v := range activity {
// Delete any activity that has an invalid IP address. This is a fix for
// a bug that truncated the last octet of an IPv6 address in the database.
if err := net.ParseIP(v.IP); err != nil {
ids = append(ids, v.ID)
continue
}
activities = append(activities, v)
}

if len(ids) > 0 {
tx = database.Instance().WithContext(ctx).Where("id IN ?", ids).Delete(&models.Activity{})
if tx.Error != nil {
return errors.WithStack(tx.Error)
}
}

if len(activities) == 0 {
return nil
}

if err := ac.manager.Client().SendActivityLogs(ctx, activities); err != nil {
return errors.WrapIf(err, "cron: failed to send activity events to Panel")
}

var ids []int
for _, v := range activity {
ids = append(ids, v.ID)
// Add all the successful activities to the list of IDs to delete.
ids = make([]int, len(activities))
for i, v := range activities {
ids[i] = v.ID
}

// Delete all the activities that were sent to the Panel (or that were invalid).
tx = database.Instance().WithContext(ctx).Where("id IN ?", ids).Delete(&models.Activity{})
if tx.Error != nil {
return errors.WithStack(tx.Error)
Expand Down
8 changes: 5 additions & 3 deletions internal/models/activity.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package models

import (
"net"
"strings"
"time"

"gorm.io/gorm"

"github.com/pterodactyl/wings/system"
)

type Event string
Expand Down Expand Up @@ -57,7 +57,9 @@ func (a Activity) SetUser(u string) *Activity {
// is trimmed down to remove any extraneous data, and the timestamp is set to the current
// system time and then stored as UTC.
func (a *Activity) BeforeCreate(_ *gorm.DB) error {
a.IP = system.TrimIPSuffix(a.IP)
if ip, _, err := net.SplitHostPort(strings.TrimSpace(a.IP)); err == nil {
a.IP = ip
}
if a.Timestamp.IsZero() {
a.Timestamp = time.Now()
}
Expand Down
29 changes: 0 additions & 29 deletions system/strings.go

This file was deleted.

0 comments on commit 18de96d

Please sign in to comment.