44import org .springframework .security .core .Authentication ;
55import org .springframework .security .core .context .SecurityContextHolder ;
66
7+ /**
8+ * Execution origin + mutation privileges for a SQL run.
9+ *
10+ * <p>{@code actorMayMutate} is true for built-in ADMIN and DBA (wired from
11+ * {@code AccessControlService.currentUserMayMutateSql()}). It gates Editor/MCP
12+ * DDL/DML; chat stays {@link MutationMode#READ_ONLY_ONLY}. The same flag is
13+ * consulted by data-access policy during query execution so mutators are not
14+ * blocked by schema redaction meant for read-only roles.
15+ */
716public record QueryExecutionContext (
817 QueryExecutionOrigin origin ,
918 MutationMode mutationMode ,
1019 String actorUsername ,
11- boolean actorIsAdmin ,
20+ boolean actorMayMutate ,
1221 boolean mutationConfirmed
1322) {
1423
@@ -27,12 +36,12 @@ public static QueryExecutionContext chat() {
2736 );
2837 }
2938
30- public static QueryExecutionContext editor (String actorUsername , boolean actorIsAdmin , boolean mutationConfirmed ) {
39+ public static QueryExecutionContext editor (String actorUsername , boolean actorMayMutate , boolean mutationConfirmed ) {
3140 return new QueryExecutionContext (
3241 QueryExecutionOrigin .EDITOR ,
33- actorIsAdmin ? MutationMode .MAY_MUTATE : MutationMode .READ_ONLY_ONLY ,
42+ actorMayMutate ? MutationMode .MAY_MUTATE : MutationMode .READ_ONLY_ONLY ,
3443 actorUsername ,
35- actorIsAdmin ,
44+ actorMayMutate ,
3645 mutationConfirmed
3746 );
3847 }
@@ -51,39 +60,39 @@ public static QueryExecutionContext mcp(String actorUsername) {
5160 return mcp (actorUsername , false );
5261 }
5362
54- public static QueryExecutionContext mcp (String actorUsername , boolean actorIsAdmin ) {
55- return mcp (actorUsername , actorIsAdmin , false );
63+ public static QueryExecutionContext mcp (String actorUsername , boolean actorMayMutate ) {
64+ return mcp (actorUsername , actorMayMutate , false );
5665 }
5766
5867 /**
59- * MCP / coding-agent SQL. Developers stay read-only. Admins may run
68+ * MCP / coding-agent SQL. Developers stay read-only. Admins and DBAs may run
6069 * non-destructive DDL/DML after the same confirmation gate as the Editor.
6170 * DROP and TRUNCATE stay blocked in {@link QueryExecutionPolicyService}.
6271 */
6372 public static QueryExecutionContext mcp (
6473 String actorUsername ,
65- boolean actorIsAdmin ,
74+ boolean actorMayMutate ,
6675 boolean mutationConfirmed
6776 ) {
6877 return new QueryExecutionContext (
6978 QueryExecutionOrigin .MCP ,
70- actorIsAdmin ? MutationMode .MAY_MUTATE : MutationMode .READ_ONLY_ONLY ,
79+ actorMayMutate ? MutationMode .MAY_MUTATE : MutationMode .READ_ONLY_ONLY ,
7180 actorUsername ,
72- actorIsAdmin ,
81+ actorMayMutate ,
7382 mutationConfirmed
7483 );
7584 }
7685
7786 public static QueryExecutionContext forSqlSurface (
7887 boolean mcpBearer ,
7988 String actorUsername ,
80- boolean actorIsAdmin ,
89+ boolean actorMayMutate ,
8190 boolean mutationConfirmed
8291 ) {
8392 if (mcpBearer ) {
84- return mcp (actorUsername , actorIsAdmin , mutationConfirmed );
93+ return mcp (actorUsername , actorMayMutate , mutationConfirmed );
8594 }
86- return editor (actorUsername , actorIsAdmin , mutationConfirmed );
95+ return editor (actorUsername , actorMayMutate , mutationConfirmed );
8796 }
8897
8998 public static QueryExecutionContext scheduled () {
@@ -100,12 +109,16 @@ public static QueryExecutionContext api(String actorUsername) {
100109 return api (actorUsername , false );
101110 }
102111
103- public static QueryExecutionContext api (String actorUsername , boolean actorIsAdmin ) {
112+ /**
113+ * API / dashboard SQL is always read-only. The {@code actorMayMutate} flag here
114+ * only influences data-access policy bypass (admins), not mutation mode.
115+ */
116+ public static QueryExecutionContext api (String actorUsername , boolean actorMayMutate ) {
104117 return new QueryExecutionContext (
105118 QueryExecutionOrigin .API ,
106119 MutationMode .READ_ONLY_ONLY ,
107120 actorUsername ,
108- actorIsAdmin ,
121+ actorMayMutate ,
109122 false
110123 );
111124 }
0 commit comments