1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-18 11:46:23 -07:00

Add board ban migration and verify that no invalid bans were migrated

This commit is contained in:
Eggbertx 2025-01-03 23:39:45 -08:00
parent 9ca424f4da
commit a34a1f1d57
3 changed files with 50 additions and 22 deletions

View file

@ -1,6 +1,7 @@
package pre2021
import (
"database/sql"
"errors"
"net"
"strings"
@ -9,6 +10,7 @@ import (
"github.com/gochan-org/gochan/cmd/gochan-migration/internal/common"
"github.com/gochan-org/gochan/pkg/gcsql"
"github.com/gochan-org/gochan/pkg/gcutil"
"github.com/rs/zerolog"
)
type migrationBan struct {
@ -40,6 +42,27 @@ func (m *Pre2021Migrator) migrateBansInPlace() error {
return common.NewMigrationError("pre2021", "migrateBansInPlace not yet implemented")
}
func (m *Pre2021Migrator) migrateBan(tx *sql.Tx, ban *migrationBan, boardID *int, errEv *zerolog.Event) error {
migratedBan := &gcsql.IPBan{
BoardID: boardID,
RangeStart: ban.ip,
RangeEnd: ban.ip,
IssuedAt: ban.timestamp,
}
migratedBan.CanAppeal = ban.canAppeal
migratedBan.AppealAt = ban.appealAt
migratedBan.ExpiresAt = ban.expires
migratedBan.Permanent = ban.permaban
migratedBan.Message = ban.reason
migratedBan.StaffNote = ban.staffNote
if err := gcsql.NewIPBanTx(tx, migratedBan); err != nil {
errEv.Err(err).Caller().
Int("oldID", ban.oldID).Msg("Failed to migrate ban")
return err
}
return nil
}
func (m *Pre2021Migrator) migrateBansToNewDB() error {
errEv := common.LogError()
defer errEv.Discard()
@ -86,34 +109,29 @@ func (m *Pre2021Migrator) migrateBansToNewDB() error {
}
}
if len(ban.boardIDs) == 0 {
if ban.ip != "" {
if net.ParseIP(ban.ip) == nil {
gcutil.LogWarning().
Int("oldID", ban.oldID).
Str("ip", ban.ip).
Msg("Found ban with invalid IP address, skipping")
continue
if ban.ip != "" {
if net.ParseIP(ban.ip) == nil {
gcutil.LogWarning().
Int("oldID", ban.oldID).
Str("ip", ban.ip).
Msg("Found ban with invalid IP address, skipping")
continue
}
if len(ban.boardIDs) == 0 {
if err = m.migrateBan(tx, &ban, nil, errEv); err != nil {
return err
}
migratedBan := &gcsql.IPBan{
BoardID: nil,
RangeStart: ban.ip,
RangeEnd: ban.ip,
IssuedAt: ban.timestamp,
} else {
for b := range ban.boardIDs {
if err = m.migrateBan(tx, &ban, &ban.boardIDs[b], errEv); err != nil {
return err
}
}
migratedBan.CanAppeal = ban.canAppeal
migratedBan.AppealAt = ban.appealAt
migratedBan.ExpiresAt = ban.expires
migratedBan.Permanent = ban.permaban
migratedBan.Message = ban.reason
migratedBan.StaffNote = ban.staffNote
gcsql.NewIPBanTx(tx, migratedBan)
}
}
}
return nil
return tx.Commit()
}
func (m *Pre2021Migrator) MigrateBans() error {

View file

@ -3,6 +3,7 @@ package pre2021
import (
"testing"
"github.com/gochan-org/gochan/pkg/gcsql"
"github.com/stretchr/testify/assert"
)
@ -24,4 +25,13 @@ func TestMigrateBansToNewDB(t *testing.T) {
if !assert.NoError(t, migrator.MigrateBans()) {
t.FailNow()
}
bans, err := gcsql.GetIPBans(0, 200, false)
if !assert.NoError(t, err) {
t.FailNow()
}
assert.Equal(t, 4, len(bans), "Expected to have 4 valid bans")
var numInvalidBans int
assert.NoError(t, gcsql.QueryRowSQL("SELECT COUNT(*) FROM DBPREFIXip_ban WHERE message = ?", []any{"Full ban on 8.8.0.0/16"}, []any{&numInvalidBans}))
assert.Equal(t, 0, numInvalidBans, "Expected the invalid test to not be migrated")
}