Add support for IP-based bans (#1703)

* Add support for IP-based bans. Closes #1534

* Linter cleanup
This commit is contained in:
Gabe Kangas
2022-03-06 20:34:49 -08:00
committed by GitHub
parent 78c27ddbdd
commit 19b9a8bdf6
21 changed files with 488 additions and 98 deletions

View File

@@ -34,3 +34,9 @@ type ApOutbox struct {
CreatedAt sql.NullTime
LiveNotification sql.NullBool
}
type IpBan struct {
IpAddress string
Notes sql.NullString
CreatedAt sql.NullTime
}

View File

@@ -58,3 +58,15 @@ SELECT count(*) FROM ap_accepted_activities WHERE iri = $1 AND actor = $2 AND TY
-- name: UpdateFollowerByIRI :exec
UPDATE ap_followers SET inbox = $1, name = $2, username = $3, image = $4 WHERE iri = $5;
-- name: BanIPAddress :exec
INSERT INTO ip_bans(ip_address, notes) values($1, $2);
-- name: RemoveIPAddressBan :exec
DELETE FROM ip_bans WHERE ip_address = $1;
-- name: IsIPAddressBlocked :one
SELECT count(*) FROM ip_bans WHERE ip_address = $1;
-- name: GetIPAddressBans :many
SELECT * FROM ip_bans;

View File

@@ -92,6 +92,20 @@ func (q *Queries) ApproveFederationFollower(ctx context.Context, arg ApproveFede
return err
}
const banIPAddress = `-- name: BanIPAddress :exec
INSERT INTO ip_bans(ip_address, notes) values($1, $2)
`
type BanIPAddressParams struct {
IpAddress string
Notes sql.NullString
}
func (q *Queries) BanIPAddress(ctx context.Context, arg BanIPAddressParams) error {
_, err := q.db.ExecContext(ctx, banIPAddress, arg.IpAddress, arg.Notes)
return err
}
const doesInboundActivityExist = `-- name: DoesInboundActivityExist :one
SELECT count(*) FROM ap_accepted_activities WHERE iri = $1 AND actor = $2 AND TYPE = $3
`
@@ -236,6 +250,33 @@ func (q *Queries) GetFollowerCount(ctx context.Context) (int64, error) {
return count, err
}
const getIPAddressBans = `-- name: GetIPAddressBans :many
SELECT ip_address, notes, created_at FROM ip_bans
`
func (q *Queries) GetIPAddressBans(ctx context.Context) ([]IpBan, error) {
rows, err := q.db.QueryContext(ctx, getIPAddressBans)
if err != nil {
return nil, err
}
defer rows.Close()
var items []IpBan
for rows.Next() {
var i IpBan
if err := rows.Scan(&i.IpAddress, &i.Notes, &i.CreatedAt); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getInboundActivitiesWithOffset = `-- name: GetInboundActivitiesWithOffset :many
SELECT iri, actor, type, timestamp FROM ap_accepted_activities ORDER BY timestamp DESC LIMIT $1 OFFSET $2
`
@@ -405,6 +446,17 @@ func (q *Queries) GetRejectedAndBlockedFollowers(ctx context.Context) ([]GetReje
return items, nil
}
const isIPAddressBlocked = `-- name: IsIPAddressBlocked :one
SELECT count(*) FROM ip_bans WHERE ip_address = $1
`
func (q *Queries) IsIPAddressBlocked(ctx context.Context, ipAddress string) (int64, error) {
row := q.db.QueryRowContext(ctx, isIPAddressBlocked, ipAddress)
var count int64
err := row.Scan(&count)
return count, err
}
const rejectFederationFollower = `-- name: RejectFederationFollower :exec
UPDATE ap_followers SET approved_at = null, disabled_at = $1 WHERE iri = $2
`
@@ -428,6 +480,15 @@ func (q *Queries) RemoveFollowerByIRI(ctx context.Context, iri string) error {
return err
}
const removeIPAddressBan = `-- name: RemoveIPAddressBan :exec
DELETE FROM ip_bans WHERE ip_address = $1
`
func (q *Queries) RemoveIPAddressBan(ctx context.Context, ipAddress string) error {
_, err := q.db.ExecContext(ctx, removeIPAddressBan, ipAddress)
return err
}
const updateFollowerByIRI = `-- name: UpdateFollowerByIRI :exec
UPDATE ap_followers SET inbox = $1, name = $2, username = $3, image = $4 WHERE iri = $5
`

View File

@@ -35,3 +35,9 @@ CREATE TABLE IF NOT EXISTS ap_accepted_activities (
"timestamp" TIMESTAMP NOT NULL
);
CREATE INDEX iri_actor_index ON ap_accepted_activities (iri,actor);
CREATE TABLE IF NOT EXISTS ip_bans (
"ip_address" TEXT NOT NULL PRIMARY KEY,
"notes" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);