From 47842ae614269ce193808493644c36442bfa96d4 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Wed, 19 Oct 2022 09:29:40 +0200 Subject: [PATCH] script based hooks: don't propagate global env vars env vars must be explicitly set Signed-off-by: Nicola Murino --- docs/check-password-hook.md | 2 +- docs/custom-actions.md | 4 ++-- docs/data-retention-hook.md | 2 +- docs/external-auth.md | 2 +- docs/full-configuration.md | 2 +- docs/keyboard-interactive.md | 2 +- docs/post-connect-hook.md | 2 +- docs/post-disconnect-hook.md | 2 +- docs/post-login-hook.md | 2 +- go.mod | 12 ++++++------ go.sum | 23 ++++++++++++----------- internal/command/command.go | 11 +++++------ internal/common/eventmanager.go | 11 +++++------ 13 files changed, 38 insertions(+), 39 deletions(-) diff --git a/docs/check-password-hook.md b/docs/check-password-hook.md index aad8cc10..214aec23 100644 --- a/docs/check-password-hook.md +++ b/docs/check-password-hook.md @@ -18,7 +18,7 @@ If the hook defines an external program it can read the following environment va - `SFTPGO_AUTHD_IP` - `SFTPGO_AUTHD_PROTOCOL`, possible values are `SSH`, `FTP`, `DAV`, `HTTP` -Previous global environment variables aren't cleared when the script is called. The content of these variables is _not_ quoted. They may contain special characters. They are under the control of a possibly malicious remote user. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must write, on its standard output, the expected JSON serialized response described above. diff --git a/docs/custom-actions.md b/docs/custom-actions.md index 5916469a..6450cf8f 100644 --- a/docs/custom-actions.md +++ b/docs/custom-actions.md @@ -51,7 +51,7 @@ If the `hook` defines a path to an external program, then this program can read - `SFTPGO_ACTION_OPEN_FLAGS`, integer. File open flags, can be non-zero for `pre-upload` action. If `SFTPGO_ACTION_FILE_SIZE` is greater than zero and `SFTPGO_ACTION_OPEN_FLAGS&512 == 0` the target file will not be truncated - `SFTPGO_ACTION_TIMESTAMP`, int64. Event timestamp as nanoseconds since epoch -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 30 seconds. If the `hook` defines an HTTP URL then this URL will be invoked as HTTP POST. The request body will contain a JSON serialized struct with the following fields: @@ -107,7 +107,7 @@ If the `hook` defines a path to an external program, then this program can read - `SFTPGO_PROVIDER_TIMESTAMP`, event timestamp as nanoseconds since epoch - `SFTPGO_PROVIDER_OBJECT`, object serialized as JSON with sensitive fields removed -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 15 seconds. If the `hook` defines an HTTP URL then this URL will be invoked as HTTP POST. The action, username, ip, object_type and object_name and timestamp are added to the query string, for example `?action=update&username=admin&ip=127.0.0.1&object_type=user&object_name=user1×tamp=1633860803249`, and the full object is sent serialized as JSON inside the POST body with sensitive fields removed. diff --git a/docs/data-retention-hook.md b/docs/data-retention-hook.md index 834d243f..605ec47f 100644 --- a/docs/data-retention-hook.md +++ b/docs/data-retention-hook.md @@ -8,7 +8,7 @@ If the hook defines an external program it can read the following environment va - `SFTPGO_DATA_RETENTION_RESULT`, it contains the data retention check result JSON serialized. -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 20 seconds. If the hook defines an HTTP URL then this URL will be invoked as HTTP POST and the POST body contains the data retention check result JSON serialized. diff --git a/docs/external-auth.md b/docs/external-auth.md index 806fcb74..022f21b4 100644 --- a/docs/external-auth.md +++ b/docs/external-auth.md @@ -13,7 +13,7 @@ The external program can read the following environment variables to get info ab - `SFTPGO_AUTHD_KEYBOARD_INTERACTIVE`, not empty for keyboard interactive authentication - `SFTPGO_AUTHD_TLS_CERT`, TLS client certificate PEM encoded. Not empty for TLS certificate authentication -Previous global environment variables aren't cleared when the script is called. The content of these variables is _not_ quoted. They may contain special characters. They are under the control of a possibly malicious remote user. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program can inspect the SFTPGo user, if it exists, using the `SFTPGO_AUTHD_USER` environment variable. The program must write, on its standard output: diff --git a/docs/full-configuration.md b/docs/full-configuration.md index e6a74778..9e89d61d 100644 --- a/docs/full-configuration.md +++ b/docs/full-configuration.md @@ -370,7 +370,7 @@ The configuration file contains the following sections: - `url`, string, optional. If not empty, the header will be added only if the request URL starts with the one specified here - **command**, configuration for external commands such as program based hooks - `timeout`, integer. Timeout specifies a time limit, in seconds, to execute external commands. Valid range: `1-300`. Default: `30` - - `env`, list of strings. Additional environment variable to pass to all the external commands. Each entry is of the form `key=value`. Do not use environment variables prefixed with `SFTPGO_` to avoid conflicts with environment variables that SFTPGo hooks can set. Default: empty + - `env`, list of strings. Environment variables to pass to all the external commands. Global environment variables are cleared, for security reasons, you have to explicitly set any environment variable such as `PATH` etc. if you need them. Each entry is of the form `key=value`. Do not use environment variables prefixed with `SFTPGO_` to avoid conflicts with environment variables that SFTPGo hooks can set. Default: empty - `commands`, list of structs. Allow to customize configuration per-command. Each struct has the following fields: - `path`, string. Define the command path as defined in the hook configuration - `timeout`, integer. This value overrides the global timeout if set diff --git a/docs/keyboard-interactive.md b/docs/keyboard-interactive.md index 58c3344a..61674b15 100644 --- a/docs/keyboard-interactive.md +++ b/docs/keyboard-interactive.md @@ -12,7 +12,7 @@ The external program can read the following environment variables to get info ab - `SFTPGO_AUTHD_IP` - `SFTPGO_AUTHD_PASSWORD`, this is the hashed password as stored inside the data provider -Previous global environment variables aren't cleared when the script is called. The content of these variables is _not_ quoted. They may contain special characters. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must write the questions on its standard output, in a single line, using the following struct JSON serialized: diff --git a/docs/post-connect-hook.md b/docs/post-connect-hook.md index cfac34e0..c2b0352c 100644 --- a/docs/post-connect-hook.md +++ b/docs/post-connect-hook.md @@ -13,7 +13,7 @@ If the hook defines an external program it can read the following environment va If the external command completes with a zero exit status the connection will be accepted otherwise rejected. -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 20 seconds. If the hook defines an HTTP URL then this URL will be invoked as HTTP GET with the following query parameters: diff --git a/docs/post-disconnect-hook.md b/docs/post-disconnect-hook.md index 6f799a1d..81778e08 100644 --- a/docs/post-disconnect-hook.md +++ b/docs/post-disconnect-hook.md @@ -13,7 +13,7 @@ If the hook defines an external program it can read the following environment va - `SFTPGO_CONNECTION_USERNAME`, can be empty if the channel is closed before user authentication - `SFTPGO_CONNECTION_DURATION`, connection duration in milliseconds -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 20 seconds. If the hook defines an HTTP URL then this URL will be invoked as HTTP GET with the following query parameters: diff --git a/docs/post-login-hook.md b/docs/post-login-hook.md index 5fe60f4d..06f965de 100644 --- a/docs/post-login-hook.md +++ b/docs/post-login-hook.md @@ -14,7 +14,7 @@ If the hook defines an external program it can reads the following environment v - `SFTPGO_LOGIND_STATUS`, 1 means login OK, 0 login KO - `SFTPGO_LOGIND_PROTOCOL`, possible values are `SSH`, `FTP`, `DAV`, `HTTP`, `OIDC` (OpenID Connect) -Previous global environment variables aren't cleared when the script is called. +Global environment variables are cleared, for security reasons, when the script is called. You can set additional environment variables in the "command" configuration section. The program must finish within 20 seconds. If the hook is an HTTP URL then it will be invoked as HTTP POST. The login method, the used protocol, the ip address and the status of the user are added to the query string, for example `?login_method=password&ip=1.2.3.4&protocol=SSH&status=1`. diff --git a/go.mod b/go.mod index 63dfe678..32375762 100644 --- a/go.mod +++ b/go.mod @@ -69,9 +69,9 @@ require ( golang.org/x/crypto v0.0.0-20221012134737-56aed061732a golang.org/x/net v0.0.0-20221014081412-f15817d10f9b golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 - golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 - golang.org/x/time v0.0.0-20220922220347-f3bd1da661af - google.golang.org/api v0.99.0 + golang.org/x/sys v0.1.0 + golang.org/x/time v0.1.0 + google.golang.org/api v0.100.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) @@ -142,7 +142,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect - github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -155,11 +155,11 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.opencensus.io v0.23.0 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/text v0.4.0 // indirect golang.org/x/tools v0.1.12 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a // indirect + google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 // indirect google.golang.org/grpc v1.50.1 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index e1f548ae..b9e2e520 100644 --- a/go.sum +++ b/go.sum @@ -1376,8 +1376,9 @@ github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1: github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1920,8 +1921,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43 h1:OK7RB6t2WQX54srQQYSXMW8dF5C6/8+oA/s5QBmmto4= -golang.org/x/sys v0.0.0-20221013171732-95e765b1cc43/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1936,8 +1937,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1950,8 +1951,8 @@ golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2099,8 +2100,8 @@ google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6F google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.91.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.99.0 h1:tsBtOIklCE2OFxhmcYSVqGwSAN/Y897srxmcvAQnwK8= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0 h1:LGUYIrbW9pzYQQ8NWXlaIVkgnfubVBZbMFb9P8TK374= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2211,8 +2212,8 @@ google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljW google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220802133213-ce4fa296bf78/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a h1:GH6UPn3ixhWcKDhpnEC55S75cerLPdpp3hrhfKYjZgw= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55 h1:U1u4KB2kx6KR/aJDjQ97hZ15wQs8ZPvDcGcRynBhkvg= +google.golang.org/genproto v0.0.0-20221018160656-63c7b68cfc55/go.mod h1:45EK0dUbEZ2NHjCeAd2LXmyjAgGUGrpGROgjhC3ADck= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/internal/command/command.go b/internal/command/command.go index 016ede35..ba32a2ba 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -17,7 +17,6 @@ package command import ( "fmt" - "os" "strings" "time" @@ -60,7 +59,7 @@ type Command struct { // Do not use variables with the SFTPGO_ prefix to avoid conflicts with env // vars that SFTPGo sets Timeout int `json:"timeout" mapstructure:"timeout"` - // Env defines additional environment variable for the command. + // Env defines environment variable for the command. // Each entry is of the form "key=value". // These values are added to the global environment variables if any Env []string `json:"env" mapstructure:"env"` @@ -75,7 +74,7 @@ type Command struct { type Config struct { // Timeout specifies a global time limit, in seconds, for the external commands execution Timeout int `json:"timeout" mapstructure:"timeout"` - // Env defines additional environment variable for the commands. + // Env defines environment variable for the commands. // Each entry is of the form "key=value". // Do not use variables with the SFTPGO_ prefix to avoid conflicts with env // vars that SFTPGo sets @@ -96,7 +95,7 @@ func (c Config) Initialize() error { return fmt.Errorf("invalid timeout %v", c.Timeout) } for _, env := range c.Env { - if len(strings.Split(env, "=")) != 2 { + if len(strings.SplitN(env, "=", 2)) != 2 { return fmt.Errorf("invalid env var %#v", env) } } @@ -112,7 +111,7 @@ func (c Config) Initialize() error { } } for _, env := range cmd.Env { - if len(strings.Split(env, "=")) != 2 { + if len(strings.SplitN(env, "=", 2)) != 2 { return fmt.Errorf("invalid env var %#v for command %#v", env, cmd.Path) } } @@ -129,7 +128,7 @@ func (c Config) Initialize() error { // GetConfig returns the configuration for the specified command func GetConfig(command, hook string) (time.Duration, []string, []string) { - env := os.Environ() + env := []string{} var args []string timeout := time.Duration(config.Timeout) * time.Second env = append(env, config.Env...) diff --git a/internal/common/eventmanager.go b/internal/common/eventmanager.go index 1d33c7a0..2304803b 100644 --- a/internal/common/eventmanager.go +++ b/internal/common/eventmanager.go @@ -1102,7 +1102,6 @@ func executeHTTPRuleAction(c dataprovider.EventActionHTTPConfig, params *EventPa } func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *EventParams) error { - envVars := make([]string, 0, len(c.EnvVars)) addObjectData := false if params.Object != nil { for _, k := range c.EnvVars { @@ -1114,9 +1113,7 @@ func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *E } replacements := params.getStringReplacements(addObjectData) replacer := strings.NewReplacer(replacements...) - for _, keyVal := range c.EnvVars { - envVars = append(envVars, fmt.Sprintf("%s=%s", keyVal.Key, replaceWithReplacer(keyVal.Value, replacer))) - } + args := make([]string, 0, len(c.Args)) for _, arg := range c.Args { args = append(args, replaceWithReplacer(arg, replacer)) @@ -1126,8 +1123,10 @@ func executeCommandRuleAction(c dataprovider.EventActionCommandConfig, params *E defer cancel() cmd := exec.CommandContext(ctx, c.Cmd, args...) - cmd.Env = append(cmd.Env, os.Environ()...) - cmd.Env = append(cmd.Env, envVars...) + cmd.Env = []string{} + for _, keyVal := range c.EnvVars { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", keyVal.Key, replaceWithReplacer(keyVal.Value, replacer))) + } startTime := time.Now() err := cmd.Run()