Tighten opaque plugin content boundaries
This commit is contained in:
@@ -1398,7 +1398,7 @@ func TestPluginBridgeExecuteAPI(t *testing.T) {
|
||||
t.Fatalf("expected permission denied safe envelope, got %+v", denied)
|
||||
}
|
||||
|
||||
unsafe := requestJSONWithAuth(t, router, http.MethodPost, "/api/v1/plugin-bridge/execute", dto.PluginBridgeExecuteRequest{
|
||||
unsafe := postOKJSONWithAuth[dto.PluginBridgeExecuteResponse](t, router, "/api/v1/plugin-bridge/execute", dto.PluginBridgeExecuteRequest{
|
||||
RequestID: "bridge-unsafe-1",
|
||||
PluginID: "game.example",
|
||||
RouteKey: "logs",
|
||||
@@ -1406,9 +1406,11 @@ func TestPluginBridgeExecuteAPI(t *testing.T) {
|
||||
Action: string(domain.PluginBridgeActionFilesRequest),
|
||||
Payload: map[string]string{"key": "/Users/tasia/.ssh/id_rsa", "idempotencyKey": "idem-unsafe"},
|
||||
}, ownerSession)
|
||||
assertErrorResponse(t, unsafe, http.StatusBadRequest, errorCodeValidation)
|
||||
if unsafe.Status != "error" || unsafe.Error == nil || unsafe.Error.Code != "execution_failed" {
|
||||
t.Fatalf("expected scoped file validation envelope, got %+v", unsafe)
|
||||
}
|
||||
|
||||
for _, body := range []string{mustJSON(t, serverRead), mustJSON(t, logs), mustJSON(t, lifecycle), mustJSON(t, lifecycleMismatch), mustJSON(t, fileDispatch), mustJSON(t, aiResponse), mustJSON(t, denied)} {
|
||||
for _, body := range []string{mustJSON(t, serverRead), mustJSON(t, logs), mustJSON(t, lifecycle), mustJSON(t, lifecycleMismatch), mustJSON(t, fileDispatch), mustJSON(t, aiResponse), mustJSON(t, denied), mustJSON(t, unsafe)} {
|
||||
for _, forbidden := range []string{"/Users/", "unix://", "Bearer ", "sk-", "password=", "apiKeyRef", "rawApiKey"} {
|
||||
if strings.Contains(body, forbidden) {
|
||||
t.Fatalf("bridge response exposed forbidden fragment %q: %s", forbidden, body)
|
||||
|
||||
Reference in New Issue
Block a user