8989import io .cdap .wrangler .utils .SchemaConverter ;
9090import io .cdap .wrangler .utils .StructuredToRowTransformer ;
9191import org .apache .commons .lang3 .StringEscapeUtils ;
92+ import org .slf4j .Logger ;
93+ import org .slf4j .LoggerFactory ;
9294
9395import java .net .HttpURLConnection ;
9496import java .nio .charset .StandardCharsets ;
116118 */
117119public class WorkspaceHandler extends AbstractDirectiveHandler {
118120
121+ private static final Logger LOG = LoggerFactory .getLogger (WorkspaceHandler .class );
119122 private static final Gson GSON =
120123 new GsonBuilder ().registerTypeAdapter (Schema .class , new SchemaTypeAdapter ()).create ();
121124 private static final Pattern PRAGMA_PATTERN = Pattern .compile ("^\\ s*#pragma\\ s+load-directives\\ s+" );
@@ -126,6 +129,7 @@ public class WorkspaceHandler extends AbstractDirectiveHandler {
126129 private RecipeStore recipeStore ;
127130 private ConnectionDiscoverer discoverer ;
128131 private ContextAccessEnforcer contextAccessEnforcer ;
132+ private boolean authEnforcementEnabled ;
129133
130134 // Injected by CDAP
131135 @ SuppressWarnings ("unused" )
@@ -138,6 +142,7 @@ public void initialize(SystemHttpServiceContext context) throws Exception {
138142 recipeStore = new RecipeStore (context );
139143 discoverer = new ConnectionDiscoverer (context );
140144 contextAccessEnforcer = context .getContextAccessEnforcer ();
145+ authEnforcementEnabled = Feature .WRANGLER_WORKSPACE_AUTH_CHECK .isEnabled (context );
141146 }
142147
143148 @ POST
@@ -151,9 +156,10 @@ public void createWorkspace(HttpServiceRequest request, HttpServiceResponder res
151156 }
152157
153158 WorkspaceId wsId = new WorkspaceId (ns );
154- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
155- StandardPermission .CREATE );
156-
159+ if (authEnforcementEnabled ) {
160+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
161+ StandardPermission .CREATE );
162+ }
157163 WorkspaceCreationRequest creationRequest =
158164 GSON .fromJson (StandardCharsets .UTF_8 .decode (request .getContent ()).toString (), WorkspaceCreationRequest .class );
159165
@@ -199,8 +205,10 @@ public void listWorkspaces(HttpServiceRequest request, HttpServiceResponder resp
199205 if (ns .getName ().equalsIgnoreCase (NamespaceId .SYSTEM .getNamespace ())) {
200206 throw new BadRequestException ("Listing workspaces in system namespace is currently not supported" );
201207 }
202- contextAccessEnforcer .enforceOnParent (EntityType .SYSTEM_APP_ENTITY , new NamespaceId (ns .getName ()),
203- StandardPermission .LIST );
208+ if (authEnforcementEnabled ) {
209+ contextAccessEnforcer .enforceOnParent (EntityType .SYSTEM_APP_ENTITY , new NamespaceId (ns .getName ()),
210+ StandardPermission .LIST );
211+ }
204212 responder .sendString (GSON .toJson (new ServiceResponse <>(wsStore .listWorkspaces (ns ))));
205213 });
206214 }
@@ -216,8 +224,10 @@ public void getWorkspace(HttpServiceRequest request, HttpServiceResponder respon
216224 throw new BadRequestException ("Getting workspace in system namespace is currently not supported" );
217225 }
218226 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
219- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
220- StandardPermission .GET );
227+ if (authEnforcementEnabled ) {
228+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
229+ StandardPermission .GET );
230+ }
221231 responder .sendString (GSON .toJson (wsStore .getWorkspace (wsId )));
222232 });
223233 }
@@ -236,9 +246,10 @@ public void updateWorkspace(HttpServiceRequest request, HttpServiceResponder res
236246 throw new BadRequestException ("Updating workspace in system namespace is currently not supported" );
237247 }
238248 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
239- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
240- StandardPermission .UPDATE );
241-
249+ if (authEnforcementEnabled ) {
250+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
251+ StandardPermission .UPDATE );
252+ }
242253 WorkspaceUpdateRequest updateRequest =
243254 GSON .fromJson (StandardCharsets .UTF_8 .decode (request .getContent ()).toString (), WorkspaceUpdateRequest .class );
244255
@@ -266,9 +277,10 @@ public void resampleWorkspace(HttpServiceRequest request, HttpServiceResponder r
266277 }
267278
268279 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
269- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
270- StandardPermission .UPDATE );
271-
280+ if (authEnforcementEnabled ) {
281+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
282+ StandardPermission .UPDATE );
283+ }
272284 Workspace currentWorkspace = wsStore .getWorkspace (wsId );
273285
274286 String connectionName = currentWorkspace .getSampleSpec () == null ? null :
@@ -314,8 +326,10 @@ public void deleteWorkspace(HttpServiceRequest request, HttpServiceResponder res
314326 throw new BadRequestException ("Deleting workspace in system namespace is currently not supported" );
315327 }
316328 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
317- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
318- StandardPermission .DELETE );
329+ if (authEnforcementEnabled ) {
330+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
331+ StandardPermission .DELETE );
332+ }
319333 wsStore .deleteWorkspace (wsId );
320334 responder .sendStatus (HttpURLConnection .HTTP_OK );
321335 });
@@ -335,9 +349,10 @@ public void upload(HttpServiceRequest request, HttpServiceResponder responder,
335349 }
336350
337351 WorkspaceId id = new WorkspaceId (ns );
338- contextAccessEnforcer .enforce (new WorkspaceEntityId (id .getNamespace ().getName (), id .getWorkspaceId ()),
339- StandardPermission .CREATE );
340-
352+ if (authEnforcementEnabled ) {
353+ contextAccessEnforcer .enforce (new WorkspaceEntityId (id .getNamespace ().getName (), id .getWorkspaceId ()),
354+ StandardPermission .CREATE );
355+ }
341356 String name = request .getHeader (PropertyIds .FILE_NAME );
342357 if (name == null ) {
343358 throw new BadRequestException ("Name must be provided in the 'file' header" );
@@ -386,9 +401,10 @@ public void execute(HttpServiceRequest request, HttpServiceResponder responder,
386401 respond (responder , namespace , ns -> {
387402 validateNamespace (ns , "Executing directives in system namespace is currently not supported" );
388403 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
389- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
390- StandardPermission .USE );
391-
404+ if (authEnforcementEnabled ) {
405+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
406+ StandardPermission .USE );
407+ }
392408 DirectiveExecutionResponse response = execute (ns , request , wsId , null );
393409 responder .sendJson (response );
394410 });
@@ -433,8 +449,10 @@ public void specification(HttpServiceRequest request, HttpServiceResponder respo
433449 composite .reload (namespace );
434450
435451 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
436- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
437- StandardPermission .GET );
452+ if (authEnforcementEnabled ) {
453+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
454+ StandardPermission .GET );
455+ }
438456 WorkspaceDetail detail = wsStore .getWorkspaceDetail (wsId );
439457 List <String > directives = new ArrayList <>(detail .getWorkspace ().getDirectives ());
440458 UserDirectivesCollector userDirectivesCollector = new UserDirectivesCollector ();
@@ -478,8 +496,10 @@ public void applyRecipe(HttpServiceRequest request, HttpServiceResponder respond
478496 respond (responder , namespace , ns -> {
479497 validateNamespace (ns , "Executing directives in system namespace is currently not supported" );
480498 WorkspaceId wsId = new WorkspaceId (ns , workspaceId );
481- contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
482- StandardPermission .USE );
499+ if (authEnforcementEnabled ) {
500+ contextAccessEnforcer .enforce (new WorkspaceEntityId (wsId .getNamespace ().getName (), wsId .getWorkspaceId ()),
501+ StandardPermission .USE );
502+ }
483503 RecipeId recipeId = RecipeId .builder (ns ).setRecipeId (recipeIdString ).build ();
484504 Recipe recipe = recipeStore .getRecipeById (recipeId );
485505
0 commit comments