arjunashok commented on code in PR #131:
URL: https://github.com/apache/cassandra-sidecar/pull/131#discussion_r1719069504


##########
src/main/java/org/apache/cassandra/sidecar/server/MainModule.java:
##########
@@ -217,129 +322,412 @@ public Router vertxRouter(Vertx vertx,
         // Add custom routers
         // Provides a simple REST endpoint to determine if Sidecar is available
         router.get(ApiEndpointsV1.HEALTH_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/__health",
+                                            new ArrayList<>()))
               .handler(context -> context.json(OK_STATUS));
 
         // Backwards compatibility for the Cassandra health endpoint
         //noinspection deprecation
         router.get(ApiEndpointsV1.CASSANDRA_HEALTH_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/cassandra/__health",
+                                            new ArrayList<>()))
               .handler(cassandraHealthHandler);
 
         router.get(ApiEndpointsV1.CASSANDRA_NATIVE_HEALTH_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/cassandra/native/__health",
+                                            new ArrayList<>()))
               .handler(cassandraHealthHandler);
 
         router.get(ApiEndpointsV1.CASSANDRA_JMX_HEALTH_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/cassandra/jmx/__health",
+                                            new ArrayList<>()))
               .handler(cassandraHealthHandler);
 
         //noinspection deprecation
         router.get(ApiEndpointsV1.DEPRECATED_COMPONENTS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspace/:keyspace/table/:table/snapshots/:snapshot/component/:component",
+                                            Arrays.asList(STREAM_SSTABLES)))
               .handler(streamSSTableComponentHandler)
               .handler(fileStreamHandler);
 
         router.get(ApiEndpointsV1.COMPONENTS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/tables/:table/snapshots/:snapshot/components/:component",
+                                            Arrays.asList(STREAM_SSTABLES)))
               .handler(streamSSTableComponentHandler)
               .handler(fileStreamHandler);
 
         // Support for routes that want to stream SStable index components
         
router.get(ApiEndpointsV1.COMPONENTS_WITH_SECONDARY_INDEX_ROUTE_SUPPORT)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/tables/:table/snapshots/:snapshot/components/:index/:component",
+                                            Arrays.asList(STREAM_SSTABLES)))
               .handler(streamSSTableComponentHandler)
               .handler(fileStreamHandler);
 
         //noinspection deprecation
         router.get(ApiEndpointsV1.DEPRECATED_SNAPSHOTS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspace/:keyspace/table/:table/snapshots/:snapshot",
+                                            Arrays.asList(LIST_SNAPSHOTS)))
               .handler(listSnapshotHandler);
 
         router.get(ApiEndpointsV1.SNAPSHOTS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/tables/:table/snapshots/:snapshot",
+                                            Arrays.asList(LIST_SNAPSHOTS)))
               .handler(listSnapshotHandler);
 
         router.delete(ApiEndpointsV1.SNAPSHOTS_ROUTE)
               // Leverage the validateTableExistence. Currently, JMX does not 
validate for non-existent keyspace.
               // Additionally, the current JMX implementation to clear 
snapshots does not support passing a table
               // as a parameter.
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "DELETE 
/api/v1/keyspaces/:keyspace/tables/:table/snapshots/:snapshot",
+                                            Arrays.asList(CLEAR_SNAPSHOTS)))
               .handler(validateTableExistence)
               .handler(clearSnapshotHandler);
 
         router.put(ApiEndpointsV1.SNAPSHOTS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "PUT 
/api/v1/keyspaces/:keyspace/tables/:table/snapshots/:snapshot",
+                                            Arrays.asList(CREATE_SNAPSHOT)))
               .handler(createSnapshotHandler);
 
         //noinspection deprecation
         router.get(ApiEndpointsV1.DEPRECATED_ALL_KEYSPACES_SCHEMA_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/schema/keyspaces",
+                                            Arrays.asList(KEYSPACE_SCHEMA)))
               .handler(schemaHandler);
 
         router.get(ApiEndpointsV1.ALL_KEYSPACES_SCHEMA_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/cassandra/schema",
+                                            Arrays.asList(KEYSPACE_SCHEMA)))
               .handler(schemaHandler);
 
         //noinspection deprecation
         router.get(ApiEndpointsV1.DEPRECATED_KEYSPACE_SCHEMA_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/schema/keyspaces/:keyspace",
+                                            Arrays.asList(KEYSPACE_SCHEMA)))
               .handler(schemaHandler);
 
         router.get(ApiEndpointsV1.KEYSPACE_SCHEMA_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/schema",
+                                            Arrays.asList(KEYSPACE_SCHEMA)))
               .handler(schemaHandler);
 
         router.get(ApiEndpointsV1.RING_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/cassandra/ring",
+                                            Arrays.asList(RING)))
               .handler(ringHandler);
 
         router.get(ApiEndpointsV1.RING_ROUTE_PER_KEYSPACE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/cassandra/ring/keyspaces/:keyspace",
+                                            Arrays.asList(RING)))
               .handler(ringHandler);
 
         router.put(ApiEndpointsV1.SSTABLE_UPLOAD_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "PUT 
/api/v1/uploads/:uploadId/keyspaces/:keyspace/tables/:table/components/:component",
+                                            Arrays.asList(UPLOAD_SSTABLE)))
               .handler(ssTableUploadHandler);
 
         router.get(ApiEndpointsV1.KEYSPACE_TOKEN_MAPPING_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/token-range-replicas",
+                                            
Arrays.asList(KEYSPACE_TOKEN_MAPPING)))
               .handler(tokenRangeHandler);
 
         router.put(ApiEndpointsV1.SSTABLE_IMPORT_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "PUT 
/api/v1/uploads/:uploadId/keyspaces/:keyspace/tables/:table/import",
+                                            Arrays.asList(UPLOAD_SSTABLE)))
               .handler(ssTableImportHandler);
 
         router.delete(ApiEndpointsV1.SSTABLE_CLEANUP_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "DELETE /api/v1/uploads/:uploadId",
+                                            Arrays.asList(CLEANUP_SSTABLE)))
               .handler(ssTableCleanupHandler);
 
         router.get(ApiEndpointsV1.GOSSIP_INFO_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/cassandra/gossip",
+                                            Arrays.asList(GOSSIP_INFO)))
               .handler(gossipInfoHandler);
 
         router.get(ApiEndpointsV1.TIME_SKEW_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/time-skew",
+                                            Arrays.asList()))
               .handler(timeSkewHandler);
 
         router.get(ApiEndpointsV1.NODE_SETTINGS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET /api/v1/cassandra/settings",
+                                            Arrays.asList()))
               .handler(nodeSettingsHandler);
 
         router.post(ApiEndpointsV1.CREATE_RESTORE_JOB_ROUTE)
               .handler(BodyHandler.create())
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "POST 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs",
+                                            Arrays.asList(CREATE_RESTORE_JOB)))
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(createRestoreJobHandler);
 
         router.post(ApiEndpointsV1.RESTORE_JOB_SLICES_ROUTE)
               .handler(BodyHandler.create())
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "POST 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs/:jobId/slices",
+                                            Arrays.asList(CREATE_RESTORE_JOB)))
               .handler(diskSpaceProtection) // reject creating slice if short 
of disk space
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(createRestoreSliceHandler);
 
         router.get(ApiEndpointsV1.RESTORE_JOB_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs/:jobId",
+                                            Arrays.asList(RESTORE_JOB)))
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(restoreJobSummaryHandler);
 
         router.patch(ApiEndpointsV1.RESTORE_JOB_ROUTE)
               .handler(BodyHandler.create())
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "PATCH 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs/:jobId",
+                                            Arrays.asList(PATCH_RESTORE_JOB)))
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(updateRestoreJobHandler);
 
         router.post(ApiEndpointsV1.ABORT_RESTORE_JOB_ROUTE)
               .handler(BodyHandler.create())
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "POST 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs/:jobId/abort",
+                                            Arrays.asList(ABORT_RESTORE_JOB)))
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(abortRestoreJobHandler);
 
         router.get(ApiEndpointsV1.RESTORE_JOB_PROGRESS_ROUTE)
+              .handler(authorizationHandler(sidecarConfiguration,
+                                            permissionsAccessor,
+                                            requiredPermissionsProvider,
+                                            "GET 
/api/v1/keyspaces/:keyspace/tables/:table/restore-jobs/:jobId/ progress",
+                                            
Arrays.asList(RESTORE_JOB_PROGRESS)))
               .handler(validateTableExistence)
               .handler(validateRestoreJobRequest)
               .handler(restoreJobProgressHandler);
 
         return router;
     }
 
+    public AuthorizationHandler authorizationHandler(SidecarConfiguration conf,
+                                                     PermissionsAccessor 
permissionsAccessor,
+                                                     
RequiredPermissionsProvider requiredPermissionsProvider,
+                                                     String endpoint,
+                                                     
List<MutualTlsPermissions> permissions)
+    {
+        requiredPermissionsProvider.putPermissionsMapping(endpoint, 
permissions);
+
+        AuthorizationProvider authProvider;
+        if (conf.authenticatorConfiguration() != null &&
+            conf.authenticatorConfiguration().authConfig() != null &&
+            
conf.authorizerConfiguration().authConfig().equals(AuthorizerConfig.MutualTlsAuthorizer))
+        {
+            authProvider = new 
MutualTlsAuthorizationProvider(permissionsAccessor);
+        }
+        else if (conf.authenticatorConfiguration() != null &&
+                 conf.authenticatorConfiguration().authConfig() != null &&
+                 
conf.authorizerConfiguration().authConfig().equals(AuthorizerConfig.AllowAllAuthorizer))

Review Comment:
   Note: Addressed this in my most recent commit to your branch. Just has some 
minor refactoring of enums and defaults.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to