diff --git a/pkg/config/config.go b/pkg/config/config.go index 0b39a318d09..50e93e0aaf0 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -175,6 +175,8 @@ const ( WebhooksEnabled Key = `webhooks.enabled` WebhooksTimeoutSeconds Key = `webhooks.timeoutseconds` + WebhooksProxyURL Key = `webhooks.proxyurl` + WebhooksProxyPassword Key = `webhooks.proxypassword` ) // GetString returns a string config value diff --git a/pkg/models/webhooks.go b/pkg/models/webhooks.go index 4f32a84cafe..36debf4b3ac 100644 --- a/pkg/models/webhooks.go +++ b/pkg/models/webhooks.go @@ -26,9 +26,11 @@ import ( "code.vikunja.io/web" "crypto/hmac" "crypto/sha256" + "encoding/base64" "encoding/hex" "encoding/json" "net/http" + "net/url" "sort" "sync" "time" @@ -139,6 +141,27 @@ func (w *Webhook) Delete(s *xorm.Session, a web.Auth) (err error) { return } +func getWebhookHTTPClient() (client *http.Client) { + client = http.DefaultClient + client.Timeout = time.Duration(config.WebhooksTimeoutSeconds.GetInt()) * time.Second + + if config.WebhooksProxyURL.GetString() == "" || config.WebhooksProxyPassword.GetString() == "" { + return + } + + proxyURL, _ := url.Parse(config.WebhooksProxyURL.GetString()) + + client.Transport = &http.Transport{ + Proxy: http.ProxyURL(proxyURL), + ProxyConnectHeader: http.Header{ + "Proxy-Authorization": []string{"Basic " + base64.StdEncoding.EncodeToString([]byte("vikunja:"+config.WebhooksProxyPassword.GetString()))}, + "User-Agent": []string{"Vikunja/" + version.Version}, + }, + } + + return +} + func (w *Webhook) sendWebhookPayload(p *WebhookPayload) (err error) { payload, err := json.Marshal(p) if err != nil { @@ -162,9 +185,11 @@ func (w *Webhook) sendWebhookPayload(p *WebhookPayload) (err error) { req.Header.Add("User-Agent", "Vikunja/"+version.Version) - client := http.DefaultClient - client.Timeout = time.Duration(config.WebhooksTimeoutSeconds.GetInt()) * time.Second + if config.WebhooksProxyURL.GetString() != "" && config.WebhooksProxyPassword.GetString() != "" { + req.Header.Add("Proxy-Authorization", base64.StdEncoding.EncodeToString([]byte(config.WebhooksProxyPassword.GetString()))) + } + client := getWebhookHTTPClient() _, err = client.Do(req) if err == nil { log.Debugf("Sent webhook payload for webhook %d for event %s", w.ID, p.EventName)