diff options
| author | Fuwn <[email protected]> | 2026-02-07 01:44:12 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-07 01:44:12 -0800 |
| commit | 504a0c1bed5b2086fec1e3b89027d328f9c09604 (patch) | |
| tree | 3e92560239227426daef6a7d549bd7ea0ca14805 /services/worker/internal | |
| parent | feat: asa.news RSS reader with developer tier, REST API, and webhooks (diff) | |
| download | asa.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.go | 2 | ||||
| -rw-r--r-- | services/worker/internal/fetcher/ssrf_protection.go | 5 | ||||
| -rw-r--r-- | services/worker/internal/parser/parser.go | 5 | ||||
| -rw-r--r-- | services/worker/internal/scheduler/refresh.go | 1 | ||||
| -rw-r--r-- | services/worker/internal/webhook/webhook.go | 7 | ||||
| -rw-r--r-- | services/worker/internal/writer/writer.go | 2 |
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 } |