@@ -66,12 +66,14 @@ import org.a2aproject.sdk.spec.MessageSendParams; import org.a2aproject.sdk.spec.StreamingEventKind; import org.a2aproject.sdk.spec.Task;
Show 8 hidden lines
+import org.a2aproject.sdk.spec.TaskArtifactUpdateEvent; import org.a2aproject.sdk.spec.TaskIdParams; import org.a2aproject.sdk.spec.TaskNotCancelableError; import org.a2aproject.sdk.spec.TaskNotFoundError; import org.a2aproject.sdk.spec.TaskPushNotificationConfig; import org.a2aproject.sdk.spec.TaskQueryParams; import org.a2aproject.sdk.spec.TaskState;+import org.a2aproject.sdk.spec.TaskStatusUpdateEvent;
import org.a2aproject.sdk.spec.UnsupportedOperationError; import org.a2aproject.sdk.util.Assert; import org.jspecify.annotations.NonNull;@@ -199,6 +201,7 @@ public class DefaultRequestHandler implements RequestHandler { private static final String A2A_BLOCKING_CONSUMPTION_TIMEOUT_SECONDS = "a2a.blocking.consumption.timeout.seconds"; private static final String A2A_BLOCKING_RECONCILIATION_TIMEOUT_SECONDS = "a2a.blocking.reconciliation.timeout.seconds"; private static final String A2A_REQUEST_CONTEXT_POPULATE_REFERRED_TASKS = "a2a.request-context.populate-referred-tasks";+ private static final String A2A_AUTHORIZATION_REQUIRED = "a2a.authorization.required"; @Inject A2AConfigProvider configProvider;@@ -216,8 +219,12 @@ public class DefaultRequestHandler implements RequestHandler { @Nullable Instance<AgentExecutorRouter> agentExecutorRouterInstance; private @Nullable TaskAuthorizationProvider authorizationProvider;+ private @Nullable AgentExecutorRouter agentExecutorRouter; + private boolean authorizationRequired = true;++ /**
Show 3 hidden lines
* Timeout in seconds to wait for agent execution to complete in blocking calls. * This allows slow agents (LLM-based, data processing, external APIs) sufficient time.@@ -332,6 +339,8 @@ void initConfig() {
agentExecutorRouter = CdiUtils.getIfResolvable(agentExecutorRouterInstance); boolean populateReferredTasks = Boolean.parseBoolean( configProvider.getValue(A2A_REQUEST_CONTEXT_POPULATE_REFERRED_TASKS));+ this.authorizationRequired = Boolean.parseBoolean(+ configProvider.getValue(A2A_AUTHORIZATION_REQUIRED)); this.requestContextBuilder = () -> new SimpleRequestContextBuilder(taskStore, populateReferredTasks, authorizationProvider); }
Show 2 hidden lines
@@ -351,6 +360,7 @@ public static class Builder {
private Executor eventConsumerExecutor; private @Nullable TaskAuthorizationProvider authorizationProvider; private @Nullable AgentExecutorRouter agentExecutorRouter;+ private boolean authorizationRequired = true; private boolean populateReferredTasks; public Builder agentExecutor(AgentExecutor agentExecutor) {
Show 1 hidden lines
@@ -404,6 +414,11 @@ public Builder agentExecutorRouter(@Nullable AgentExecutorRouter agentExecutorRo
return this; } + public Builder authorizationRequired(boolean authorizationRequired) {+ this.authorizationRequired = authorizationRequired;+ return this;+ }+ public Builder populateReferredTasks(boolean populateReferredTasks) { this.populateReferredTasks = populateReferredTasks; return this;@@ -425,6 +440,7 @@ public DefaultRequestHandler build() { handler.reconciliationTimeoutSeconds = 1; handler.authorizationProvider = authorizationProvider; handler.agentExecutorRouter = agentExecutorRouter;+ handler.authorizationRequired = authorizationRequired; handler.requestContextBuilder = () -> new SimpleRequestContextBuilder(taskStore, populateReferredTasks, authorizationProvider); return handler;@@ -434,6 +450,7 @@ public DefaultRequestHandler build() { @Override public Task onGetTask(TaskQueryParams params, ServerCallContext context) throws A2AError { LOGGER.debug("onGetTask {}", params.id());
Show 9 hidden lines
+ enforceRead(context, params.id(), TaskOperation.GET_TASK); Task task = taskStore.get(params.id()); if (task == null) { LOGGER.debug("No task found for {}. Throwing TaskNotFoundError", params.id());@@ -466,8 +483,79 @@ private static Task limitTaskHistory(Task task, @Nullable Integer historyLength) .build(); } + private static final String LIST_TASKS_SCOPE_ID = "";
++ private void enforceRead(ServerCallContext context, String taskId, TaskOperation operation) throws A2AError {+ if (authorizationProvider == null) {+ if (authorizationRequired) {
DefaultRequestHandler now defaults authorizationRequired to true and reads a2a.authorization.required during initialization. This makes task authorization fail closed unless an application explicitly disables the requirement.