-
Couldn't load subscription status.
- Fork 1.2k
update #3203
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
update #3203
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR adds comprehensive Role-Based Access Control (RBAC) functionality to the Caldera platform through multiple new plugins and middleware enhancements.
- Implements an RBAC plugin with GUI for managing user permissions and ability assignments
- Adds a testing plugin that demonstrates RBAC integration and provides utility interfaces
- Introduces logging middleware for request filtering and access control enforcement
Reviewed Changes
Copilot reviewed 42 out of 57 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| server.py | Adds logging middleware integration to main application and v2 API routes |
| plugins/rbac/* | Complete RBAC plugin implementation with GUI, state management, and API endpoints |
| plugins/testing/* | Testing plugin with RBAC demonstrations and utility interfaces |
| app/api/v2/logging_middleware.py | Middleware for enforcing RBAC policies and request filtering |
| plugins/helloworld/* | Basic example plugin with authentication features |
| plugins/accesscontrol/* | React-based access control plugin with user management |
| plugins/studentlab/* | Plugin for student-specific ability assignments and operations |
Files not reviewed (1)
- caldera/package-lock.json: Language not supported
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
| from app.utility.base_world import BaseWorld | ||
| from app.utility.config_generator import ensure_local_config | ||
|
|
||
| from app.api.v2.logging_middleware import log_all_requests |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The import name 'log_all_requests' is misleading as this middleware actually performs RBAC enforcement and filtering rather than just logging. Consider renaming to 'rbac_enforcement_middleware' or similar to better reflect its purpose.
| # app_svc.register_subapp("/api/v2", app.api.v2.make_app(app_svc.get_services())) # converted into two liner below | ||
| v2_app = app.api.v2.make_app(app_svc.get_services()) | ||
| v2_app.middlewares.append(log_all_requests) # <-- add this line |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment and inline comment create redundancy. The commented-out line should be removed as it serves no purpose, and the inline comment is unnecessary given the clear variable names.
| # app_svc.register_subapp("/api/v2", app.api.v2.make_app(app_svc.get_services())) # converted into two liner below | |
| v2_app = app.api.v2.make_app(app_svc.get_services()) | |
| v2_app.middlewares.append(log_all_requests) # <-- add this line | |
| v2_app = app.api.v2.make_app(app_svc.get_services()) | |
| v2_app.middlewares.append(log_all_requests) |
| from aiohttp_jinja2 import template | ||
| from app.service.auth_svc import check_authorization |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate imports detected. Lines 2-3 and 7-8 import the same modules. Remove the duplicate imports on lines 7-8.
| from aiohttp_jinja2 import template | |
| from app.service.auth_svc import check_authorization |
| static_dir = Path(__file__).parent / 'static' | ||
| app.router.add_static('/plugin/testing/static', path=str(static_dir), append_version=True) |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate static directory setup. Lines 23-25 and 41-42 both set up the same static directory route. Remove the duplicate setup on lines 41-42.
| static_dir = Path(__file__).parent / 'static' | |
| app.router.add_static('/plugin/testing/static', path=str(static_dir), append_version=True) |
| <head> | ||
| <meta charset="UTF-8"> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
| <title>hello word Plugin</title> |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Typo in the title: 'hello word' should be 'hello world'.
| <title>hello word Plugin</title> | |
| <title>hello world Plugin</title> |
| <title>hello word Plugin</title> | ||
| </head> | ||
| <body> | ||
| <h1>This is my first hello world plugin ui for <p style="color: red;">Calder</p></h1> |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Incorrect product name: 'Calder' should be 'Caldera'.
| <h1>This is my first hello world plugin ui for <p style="color: red;">Calder</p></h1> | |
| <h1>This is my first hello world plugin ui for <p style="color: red;">Caldera</p></h1> |
| from .app.api.accesscontrol_api import add_routes, add_gui_routes | ||
| await add_routes(app_svc.application, services) |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate import and function calls. Lines 16-17 already import and call add_routes, making lines 19-21 redundant. Remove the duplicate code.
| from .app.api.accesscontrol_api import add_routes, add_gui_routes | |
| await add_routes(app_svc.application, services) | |
| from .app.api.accesscontrol_api import add_gui_routes |
| parts = path.split('/') | ||
| plugin_name = parts[2] if len(parts) > 2 else '' | ||
| blocked = _get_blocked_plugins_for_user(request, user) | ||
| if plugin_name and plugin_name in blocked: | ||
| if path.startswith('/plugin/') or path.startswith('/plugins/'): | ||
| return web.Response(text=f"Plugin '{plugin_name}' is not available for your role.", status=403, content_type='text/html') | ||
| return web.json_response({"error": "Forbidden for your role"}, status=403) |
Copilot
AI
Sep 29, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate plugin blocking logic. This code block (lines 170-176) duplicates the same logic from lines 159-169. The duplicate block should be removed as it's unreachable and creates confusion.
| parts = path.split('/') | |
| plugin_name = parts[2] if len(parts) > 2 else '' | |
| blocked = _get_blocked_plugins_for_user(request, user) | |
| if plugin_name and plugin_name in blocked: | |
| if path.startswith('/plugin/') or path.startswith('/plugins/'): | |
| return web.Response(text=f"Plugin '{plugin_name}' is not available for your role.", status=403, content_type='text/html') | |
| return web.json_response({"error": "Forbidden for your role"}, status=403) |
|
Can you Address the comments above and resubmit for approval |
|


Description
(insert summary)
Type of change
Please delete options that are not relevant.
How Has This Been Tested?
Please describe the tests that you ran to verify your changes.
Checklist: