Skip to content

Commit eabfe52

Browse files
dobracdjeebus
andauthored
feat: add mask request host (#1479)
Co-authored-by: Joe Lombrozo <[email protected]>
1 parent 3d9a17e commit eabfe52

File tree

29 files changed

+622
-302
lines changed

29 files changed

+622
-302
lines changed

packages/api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ require (
6565
go.opentelemetry.io/otel/sdk/metric v1.38.0
6666
go.opentelemetry.io/otel/trace v1.38.0
6767
go.uber.org/zap v1.27.0
68+
golang.org/x/net v0.44.0
6869
golang.org/x/sync v0.17.0
6970
google.golang.org/grpc v1.75.1
7071
google.golang.org/protobuf v1.36.9
@@ -279,7 +280,6 @@ require (
279280
golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b // indirect
280281
golang.org/x/image v0.25.0 // indirect
281282
golang.org/x/mod v0.27.0 // indirect
282-
golang.org/x/net v0.44.0 // indirect
283283
golang.org/x/oauth2 v0.30.0 // indirect
284284
golang.org/x/sys v0.36.0 // indirect
285285
golang.org/x/text v0.29.0 // indirect

packages/api/internal/api/spec.gen.go

Lines changed: 115 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/api/internal/api/types.gen.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/api/internal/handlers/sandbox_create.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package handlers
33
import (
44
"errors"
55
"fmt"
6+
"net"
67
"net/http"
8+
"strings"
79
"time"
810

911
"github.com/gin-gonic/gin"
1012
"go.opentelemetry.io/otel/attribute"
1113
"go.opentelemetry.io/otel/trace"
1214
"go.uber.org/zap"
15+
"golang.org/x/net/idna"
1316

1417
"github.com/e2b-dev/infra/packages/api/internal/api"
1518
"github.com/e2b-dev/infra/packages/api/internal/auth"
@@ -160,9 +163,36 @@ func (a *APIStore) PostSandboxes(c *gin.Context) {
160163

161164
var network *types.SandboxNetworkConfig
162165
if body.Network != nil {
166+
maskRequestHost := body.Network.MaskRequestHost
167+
if maskRequestHost != nil {
168+
hostname, _, err := splitHostPortOptional(*maskRequestHost)
169+
if err != nil {
170+
telemetry.ReportError(ctx, "error when splitting mask request host", err, telemetry.WithSandboxID(sandboxID))
171+
a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Invalid mask request host: %s", err))
172+
173+
return
174+
}
175+
176+
host, err := idna.Display.ToASCII(hostname)
177+
if err != nil {
178+
telemetry.ReportError(ctx, "error when parsing mask request host", err, telemetry.WithSandboxID(sandboxID))
179+
a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Invalid mask request host: %s", err))
180+
181+
return
182+
}
183+
184+
if !strings.EqualFold(host, hostname) {
185+
telemetry.ReportError(ctx, "mask request host is not ASCII", nil, telemetry.WithSandboxID(sandboxID), attribute.String("mask_request_host", hostname), attribute.String("mask_request_host_ascii", host))
186+
a.sendAPIStoreError(c, http.StatusBadRequest, fmt.Sprintf("Mask request host '%s' is not ASCII. Please use ASCII characters only.", hostname))
187+
188+
return
189+
}
190+
}
191+
163192
network = &types.SandboxNetworkConfig{
164193
Ingress: &types.SandboxNetworkIngressConfig{
165194
AllowPublicAccess: sharedUtils.DerefOrDefault(body.Network.AllowPublicTraffic, true),
195+
MaskRequestHost: maskRequestHost,
166196
},
167197
Egress: &types.SandboxNetworkEgressConfig{
168198
AllowedAddresses: sharedUtils.DerefOrDefault(body.Network.AllowOut, nil),
@@ -266,3 +296,16 @@ func firstAlias(aliases []string) string {
266296

267297
return aliases[0]
268298
}
299+
300+
func splitHostPortOptional(hostport string) (host string, port string, err error) {
301+
host, port, err = net.SplitHostPort(hostport)
302+
if err != nil {
303+
if strings.Contains(err.Error(), "missing port") {
304+
return hostport, "", nil
305+
}
306+
307+
return "", "", err
308+
}
309+
310+
return host, port, nil
311+
}

packages/api/internal/orchestrator/create_instance.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ func buildNetworkConfig(network *types.SandboxNetworkConfig, allowInternetAccess
5959
orchNetwork.Egress.DeniedCidrs = addressStringsToCIDRs(network.Egress.DeniedAddresses)
6060
}
6161

62+
if network != nil && network.Ingress != nil {
63+
orchNetwork.Ingress.MaskRequestHost = network.Ingress.MaskRequestHost
64+
}
65+
6266
// Handle the case where internet access is explicitly disabled
6367
// This should be applied after copying the network config to preserve allowed addresses
6468
if allowInternetAccess != nil && !*allowInternetAccess {

packages/api/internal/orchestrator/nodemanager/sandboxes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func (n *Node) GetSandboxes(ctx context.Context) ([]sandbox.Sandbox, error) {
5151
network := &types.SandboxNetworkConfig{
5252
Ingress: &types.SandboxNetworkIngressConfig{
5353
AllowPublicAccess: networkTrafficAccessToken == nil,
54+
MaskRequestHost: config.GetNetwork().GetIngress().MaskRequestHost,
5455
},
5556
Egress: &types.SandboxNetworkEgressConfig{
5657
AllowedAddresses: config.GetNetwork().GetEgress().GetAllowedCidrs(),

packages/client-proxy/go.sum

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/db/go.sum

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/db/types/types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ type SandboxNetworkEgressConfig struct {
1818
}
1919

2020
type SandboxNetworkIngressConfig struct {
21-
AllowPublicAccess bool `json:"allowPublicAccess,omitempty"`
21+
AllowPublicAccess bool `json:"allowPublicAccess,omitempty"`
22+
MaskRequestHost *string `json:"maskRequestHost,omitempty"`
2223
}
2324

2425
type SandboxNetworkConfig struct {

packages/docker-reverse-proxy/go.sum

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)