summaryrefslogtreecommitdiff
path: root/services/worker/internal
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-07 01:44:12 -0800
committerFuwn <[email protected]>2026-02-07 01:44:12 -0800
commit504a0c1bed5b2086fec1e3b89027d328f9c09604 (patch)
tree3e92560239227426daef6a7d549bd7ea0ca14805 /services/worker/internal
parentfeat: asa.news RSS reader with developer tier, REST API, and webhooks (diff)
downloadasa.news-504a0c1bed5b2086fec1e3b89027d328f9c09604.tar.xz
asa.news-504a0c1bed5b2086fec1e3b89027d328f9c09604.zip
style: format Go worker with iku
Diffstat (limited to 'services/worker/internal')
-rw-r--r--services/worker/internal/fetcher/fetcher.go2
-rw-r--r--services/worker/internal/fetcher/ssrf_protection.go5
-rw-r--r--services/worker/internal/parser/parser.go5
-rw-r--r--services/worker/internal/scheduler/refresh.go1
-rw-r--r--services/worker/internal/webhook/webhook.go7
-rw-r--r--services/worker/internal/writer/writer.go2
6 files changed, 17 insertions, 5 deletions
diff --git a/services/worker/internal/fetcher/fetcher.go b/services/worker/internal/fetcher/fetcher.go
index 019bd39..bbeb622 100644
--- a/services/worker/internal/fetcher/fetcher.go
+++ b/services/worker/internal/fetcher/fetcher.go
@@ -30,6 +30,7 @@ func NewFetcher(fetchTimeout time.Duration) *Fetcher {
}
redirectValidationError := ValidateRedirectTarget(request.URL.String())
+
if redirectValidationError != nil {
return fmt.Errorf("blocked redirect to reserved address: %w", redirectValidationError)
}
@@ -48,6 +49,7 @@ func (feedFetcher *Fetcher) Fetch(
authenticationConfig AuthenticationConfiguration,
) (*FetchResult, error) {
urlValidationError := ValidateFeedURL(feedURL)
+
if urlValidationError != nil {
return nil, fmt.Errorf("blocked request to disallowed URL: %w", urlValidationError)
}
diff --git a/services/worker/internal/fetcher/ssrf_protection.go b/services/worker/internal/fetcher/ssrf_protection.go
index 1887e78..e88c8d7 100644
--- a/services/worker/internal/fetcher/ssrf_protection.go
+++ b/services/worker/internal/fetcher/ssrf_protection.go
@@ -33,16 +33,19 @@ func isReservedAddress(ipAddress net.IP) bool {
func ValidateFeedURL(feedURL string) error {
parsedURL, parseError := url.Parse(feedURL)
+
if parseError != nil {
return fmt.Errorf("invalid URL: %w", parseError)
}
scheme := strings.ToLower(parsedURL.Scheme)
+
if scheme != "http" && scheme != "https" {
return fmt.Errorf("unsupported scheme %q: only http and https are allowed", parsedURL.Scheme)
}
hostname := parsedURL.Hostname()
+
if hostname == "" {
return fmt.Errorf("URL has no hostname")
}
@@ -56,9 +59,11 @@ func ValidateFeedURL(feedURL string) error {
}
resolverContext, cancelResolver := context.WithTimeout(context.Background(), 5*time.Second)
+
defer cancelResolver()
resolvedAddresses, lookupError := net.DefaultResolver.LookupIPAddr(resolverContext, hostname)
+
if lookupError != nil {
return fmt.Errorf("failed to resolve hostname %q: %w", hostname, lookupError)
}
diff --git a/services/worker/internal/parser/parser.go b/services/worker/internal/parser/parser.go
index 1fb2f76..32611e7 100644
--- a/services/worker/internal/parser/parser.go
+++ b/services/worker/internal/parser/parser.go
@@ -36,18 +36,20 @@ func (feedParser *Parser) Parse(feedIdentifier string, ownerIdentifier *string,
}
feedEntries := make([]model.FeedEntry, 0, len(parsedFeed.Items))
-
audioEnclosureCount := 0
for _, feedItem := range parsedFeed.Items {
normalizedEntry := normalizeFeedItem(feedIdentifier, ownerIdentifier, feedItem)
+
if normalizedEntry.EnclosureURL != nil {
audioEnclosureCount++
}
+
feedEntries = append(feedEntries, normalizedEntry)
}
audioEnclosureRatio := 0.0
+
if len(feedEntries) > 0 {
audioEnclosureRatio = float64(audioEnclosureCount) / float64(len(feedEntries))
}
@@ -180,6 +182,7 @@ func resolveAudioEnclosure(feedItem *gofeed.Item) (*string, *string, *int64) {
enclosureType := enclosure.Type
var enclosureLength *int64
+
if enclosure.Length != "" {
if parsedLength, parseError := strconv.ParseInt(enclosure.Length, 10, 64); parseError == nil {
enclosureLength = &parsedLength
diff --git a/services/worker/internal/scheduler/refresh.go b/services/worker/internal/scheduler/refresh.go
index 8271fa0..229a20f 100644
--- a/services/worker/internal/scheduler/refresh.go
+++ b/services/worker/internal/scheduler/refresh.go
@@ -37,7 +37,6 @@ func ProcessRefreshRequest(
}
authenticationConfig := fetcher.AuthenticationConfiguration{}
-
entityTag := ""
if feed.EntityTag != nil {
diff --git a/services/worker/internal/webhook/webhook.go b/services/worker/internal/webhook/webhook.go
index c812820..cf063b9 100644
--- a/services/worker/internal/webhook/webhook.go
+++ b/services/worker/internal/webhook/webhook.go
@@ -129,7 +129,6 @@ func (webhookDispatcher *Dispatcher) findWebhookSubscribers(
AND up.webhook_enabled = true
AND up.webhook_url IS NOT NULL
`
-
rows, queryError := webhookDispatcher.databaseConnectionPool.Query(
queryContext,
subscriberQuery,
@@ -194,6 +193,7 @@ func (webhookDispatcher *Dispatcher) deliverWebhook(
}
retryDelays := []time.Duration{0, 1 * time.Second, 4 * time.Second, 16 * time.Second}
+
var lastError error
for attemptIndex, delay := range retryDelays {
@@ -240,7 +240,6 @@ func (webhookDispatcher *Dispatcher) deliverWebhook(
"user_identifier", subscriber.UserIdentifier,
"error", lastError,
)
-
webhookDispatcher.incrementConsecutiveFailures(deliveryContext, subscriber.UserIdentifier)
}
@@ -265,8 +264,11 @@ func (webhookDispatcher *Dispatcher) sendWebhookRequest(
if subscriber.WebhookSecret != nil && *subscriber.WebhookSecret != "" {
mac := hmac.New(sha256.New, []byte(*subscriber.WebhookSecret))
+
mac.Write(payloadBytes)
+
signature := hex.EncodeToString(mac.Sum(nil))
+
request.Header.Set("X-Asa-Signature-256", "sha256="+signature)
}
@@ -309,7 +311,6 @@ func (webhookDispatcher *Dispatcher) incrementConsecutiveFailures(
userIdentifier string,
) {
maximumConsecutiveFailures := 10
-
_, updateError := webhookDispatcher.databaseConnectionPool.Exec(
updateContext,
`UPDATE user_profiles
diff --git a/services/worker/internal/writer/writer.go b/services/worker/internal/writer/writer.go
index de81bfa..748deb0 100644
--- a/services/worker/internal/writer/writer.go
+++ b/services/worker/internal/writer/writer.go
@@ -129,11 +129,13 @@ func (feedWriter *Writer) UpdateFeedMetadata(
currentTime := time.Now().UTC()
var titleParameter *string
+
if feedTitle != "" {
titleParameter = &feedTitle
}
var siteURLParameter *string
+
if siteURL != "" {
siteURLParameter = &siteURL
}