5.5 GitHubIssueSubmitter Plugin
Last Updated: July 17, 2025
Status: Complete
Plugin: GitHubIssueSubmitter
The GitHubIssueSubmitter plugin allows users to submit feedback and bug reports directly to the project’s GitHub repository.
Purpose
This plugin provides an in-application interface for capturing user feedback and automatically creating GitHub issues, streamlining the bug reporting and feature request process.
Key Features
- Feedback Form: User-friendly form for reporting issues
- Automatic GitHub Integration: Direct submission to GitHub via API
- Context Collection: Automatic collection of system state for better debugging
- User Attribution: Optional tracking of which user reported an issue
- Status Tracking: Follow-up on submitted issues
Configuration
The plugin requires GitHub API credentials configured in the app_settings
table through StaticHelpers:
GitHub Repository Configuration:
KMP.GitHub.Owner
: GitHub organization or user nameKMP.GitHub.Project
: Repository nameKMP.GitHub.Token
: Personal access token with issues:write permission (stored as array key)
Plugin Operation Settings:
Plugin.GitHubIssueSubmitter.Active
: Plugin activation status (“yes”/”no”)Plugin.GitHubIssueSubmitter.PopupMessage
: User guidance messageGitHubIssueSubmitter.configVersion
: Configuration version tracking
Architecture Overview
The GitHubIssueSubmitter plugin provides a complete feedback collection system with anonymous submission capabilities and direct GitHub integration. The plugin follows KMP’s standard architecture patterns with clear separation of concerns between controllers, view cells, policies, and frontend components.
Core Components
- Plugin Class: Configuration management and version control
- Issues Controller: GitHub API integration and submission processing
- View Cell: Conditional plugin display and template integration
- Stimulus Controller: Frontend AJAX handling and user interaction
- Authorization Policy: Anonymous access control and security
Configuration Management
The plugin uses a version-based configuration system through StaticHelpers:
// Configuration settings initialized automatically
StaticHelpers::getAppSetting("GitHubIssueSubmitter.configVersion", "25.01.11.a");
StaticHelpers::getAppSetting("KMP.GitHub.Owner", "Ansteorra");
StaticHelpers::getAppSetting("KMP.GitHub.Project", "KMP");
StaticHelpers::getAppSetting("Plugin.GitHubIssueSubmitter.Active", "yes");
StaticHelpers::getAppSetting("Plugin.GitHubIssueSubmitter.PopupMessage", "...");
Complete Feedback Submission Workflow
1. Plugin Activation and Initialization
The plugin initializes during application bootstrap:
// Automatic configuration version management
$currentConfigVersion = "25.01.11.a";
$configVersion = StaticHelpers::getAppSetting("GitHubIssueSubmitter.configVersion");
if ($configVersion != $currentConfigVersion) {
// Initialize/update all plugin settings
StaticHelpers::setAppSetting("GitHubIssueSubmitter.configVersion", $currentConfigVersion);
// ... other settings initialization
}
Process Flow:
- Plugin loads during application bootstrap
- Configuration version is checked and updated if needed
- GitHub repository settings are initialized with defaults
- Plugin activation status is set
- User guidance message is configured
2. User Interface Presentation
The feedback interface is displayed through view cells with conditional rendering:
// IssueSubmitterCell.php display logic
public function display()
{
if (!StaticHelpers::pluginEnabled("GitHubIssueSubmitter")) {
return; // Don't render if plugin is inactive
}
// Render feedback form modal
}
UI Components:
- Small info button trigger in application layout
- Bootstrap modal dialog for form presentation
- Form fields: title, feedback type, detailed description
- Success state display with GitHub issue link
- Error handling with user-friendly messages
3. Anonymous Form Submission
Users submit feedback without authentication through AJAX:
// Stimulus controller handles form submission
submit(event) {
event.preventDefault();
let formData = new FormData(this.formTarget);
fetch(this.urlValue, {
method: 'POST',
body: formData
}).then(response => response.json())
.then(data => {
// Handle success/error response
});
}
Form Processing:
- Form data collected via FormData API
- AJAX POST request to
/git-hub-issue-submitter/issues/submit
- No authentication required (anonymous submission)
- CSRF protection maintained through CakePHP framework
4. Input Validation and Sanitization
The controller processes and sanitizes all user input before API transmission:
// Data sanitization in IssuesController
$title = htmlspecialchars(stripslashes($this->request->getData('title')), ENT_QUOTES);
$body = htmlspecialchars(stripslashes($this->request->getData('body')), ENT_QUOTES);
$category = $this->request->getData('feedbackType');
Security Measures:
- XSS prevention through
htmlspecialchars()
with ENT_QUOTES - Malicious slash removal with
stripslashes()
- Content validation before API transmission
- Input length and format validation
5. GitHub API Integration
The controller communicates directly with GitHub’s REST API:
// GitHub API request formation
$url = "https://api.github.com/repos/$owner/$repo/issues";
$header = [
'Content-type: application/x-www-form-urlencoded',
'Authorization: token ' . $token,
];
$postData = json_encode([
'title' => $title,
'body' => $body,
'labels' => ['web', $category],
]);
API Integration Details:
- Endpoint:
https://api.github.com/repos/{owner}/{repo}/issues
- Method: HTTP POST
- Authentication: Bearer token in Authorization header
- Payload: JSON with title, body, and automatic labels
- Labels: Automatic ‘web’ label plus category-specific label
6. Response Processing and User Feedback
The system processes GitHub’s response and provides immediate user feedback:
// Response handling
$decoded = json_decode($response, true);
if (isset($decoded['message'])) {
$responseJson["message"] = $decoded['message']; // Error case
} else {
$responseJson = [
"url" => $decoded["html_url"],
"number" => $decoded["number"]
]; // Success case
}
Response Types:
- Success: Returns issue URL and number for user confirmation
- GitHub API Error: Returns specific error message from GitHub
- Network Error: Generic error message to protect system details
7. UI State Management
The frontend controller manages UI transitions based on submission results:
// Success state handling
.then(data => {
if (data.message) {
alert("Error: " + data.message);
return;
}
// Update UI for successful submission
this.formBlockTarget.style.display = 'none';
this.submitBtnTarget.style.display = 'none';
this.issueLinkTarget.href = data.url;
this.successTarget.style.display = 'block';
});
UI Transitions:
- Hide form interface after successful submission
- Display success message with link to created issue
- Show error messages while preserving form state
- Reset form state when modal is closed
Configuration Management Documentation
Version Control System
The plugin implements automatic configuration management:
class GitHubIssueSubmitterPlugin extends BasePlugin
{
public function bootstrap(PluginApplicationInterface $app): void
{
$currentConfigVersion = "25.01.11.a"; // Updated with each config change
$configVersion = StaticHelpers::getAppSetting("GitHubIssueSubmitter.configVersion", "0.0.0");
if ($configVersion != $currentConfigVersion) {
// Perform configuration initialization/update
}
}
}
GitHub Repository Configuration
Configure the target GitHub repository through StaticHelpers:
// Required GitHub settings - actual implementation
StaticHelpers::setAppSetting('KMP.GitHub.Owner', 'YourOrganization');
StaticHelpers::setAppSetting('KMP.GitHub.Project', 'YourRepository');
// Token is stored as nested array structure
$githubSettings = StaticHelpers::getAppSetting('KMP.GitHub', []);
$githubSettings['Token'] = 'github_pat_...';
StaticHelpers::setAppSetting('KMP.GitHub', $githubSettings);
Repository Settings:
- KMP.GitHub.Owner: GitHub organization or user name
- KMP.GitHub.Project: Repository name
- KMP.GitHub.Token: Personal access token stored as array key within KMP.GitHub setting
Plugin Operation Configuration
// Plugin operation settings
StaticHelpers::setAppSetting('Plugin.GitHubIssueSubmitter.Active', 'yes');
StaticHelpers::setAppSetting('Plugin.GitHubIssueSubmitter.PopupMessage',
'This Feedback form is anonymous and will be submitted to the KMP GitHub repository. Please do not include any pii or use this for support requests.');
Label Management and Issue Categorization
Issues are automatically categorized with labels:
// Automatic label assignment
$postData = json_encode([
'title' => $title,
'body' => $body,
'labels' => ['web', $category], // 'web' + user-selected category
]);
Standard Labels:
- web: Indicates submission from web interface
- bug: Bug reports and technical issues
- feature: Feature requests and enhancements
- general: General feedback and suggestions
Security Architecture and Considerations
Anonymous Submission Safety
The plugin allows anonymous access while maintaining security:
// Anonymous access configuration in IssuesController
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->Authentication->allowUnauthenticated(["submit"]);
}
Security Measures:
- Authentication bypassed only for submit() action
- CSRF protection maintained through CakePHP framework
- Input validation and sanitization enforced
- API token security preserved
Data Protection and Privacy
// Input sanitization pipeline
$title = htmlspecialchars(stripslashes($title), ENT_QUOTES);
$body = htmlspecialchars(stripslashes($body), ENT_QUOTES);
Protection Features:
- XSS prevention through proper HTML encoding
- No personal information collection or storage
- Direct transmission to GitHub without local storage
- User privacy maintained through anonymous process
API Token Security
// Secure token handling - actual implementation
$token = StaticHelpers::getAppSetting("KMP.GitHub", "")["Token"];
$header = [
'Authorization: token ' . $token,
];
Token Security:
- Secure storage through StaticHelpers configuration system
- Token transmitted only over HTTPS connections
- No token exposure in client-side code or logs
- Proper authorization header formatting
Abuse Prevention Strategies
Rate Limiting Considerations:
- Infrastructure-level rate limiting recommended
- GitHub API has built-in rate limiting (5000 requests/hour)
- Form validation prevents malicious content submission
- User guidance discourages inappropriate usage
Integration Patterns and Deployment
KMP Application Integration
The plugin integrates seamlessly with KMP’s architecture:
// Application.php bootstrap integration
$this->addPlugin('GitHubIssueSubmitter', [
'bootstrap' => true,
'routes' => true
]);
Integration Points:
- Service container integration for dependency injection
- Navigation system integration through view cells
- Plugin lifecycle management with proper bootstrapping
- Authorization framework integration for administrative controls
Routing Configuration
// Plugin routes configuration
public function routes(RouteBuilder $routes): void
{
$routes->plugin(
'GitHubIssueSubmitter',
['path' => '/git-hub-issue-submitter'],
function (RouteBuilder $builder) {
$builder->fallbacks(); // Standard CakePHP routing conventions
}
);
}
Available Routes:
POST /git-hub-issue-submitter/issues/submit
: Issue submission endpoint- Standard CakePHP routes for administrative functions
- AJAX-friendly response format for seamless user experience
Deployment Considerations
GitHub API Token Configuration:
- Create GitHub personal access token with
public_repo
scope (orrepo
for private repositories) - Configure token in KMP application settings using the nested array structure:
$githubSettings = StaticHelpers::getAppSetting('KMP.GitHub', []); $githubSettings['Token'] = 'github_pat_your_token_here'; StaticHelpers::setAppSetting('KMP.GitHub', $githubSettings);
- Verify repository access and permissions
- Test issue creation before production deployment
Repository Setup:
- Ensure target repository exists and is accessible
- Configure appropriate issue templates (optional)
- Set up repository labels for categorization
- Configure issue notification settings
Monitoring and Maintenance
GitHub API Integration Monitoring:
- Monitor API rate limit usage through GitHub API headers
- Track successful vs. failed submission rates
- Monitor issue creation patterns and categories
- Set up alerts for API authentication failures
Maintenance Procedures:
- Regular token rotation for security
- Repository access verification
- Label management and cleanup
- User feedback analysis and system improvements
Troubleshooting Guide
Common Issues and Solutions:
- API Authentication Errors:
- Verify token validity and permissions
- Check repository access rights
- Confirm token scope includes
public_repo
- Network Connectivity Issues:
- Verify HTTPS connectivity to api.github.com
- Check firewall and proxy settings
- Test API connectivity from server
- Form Submission Failures:
- Verify CSRF token configuration
- Check form field validation rules
- Confirm JavaScript controller loading
- Configuration Problems:
- Verify StaticHelpers setting storage
- Check plugin activation status
- Confirm configuration version updates
References and Additional Resources
Plugin Architecture Documentation
- Plugin Architecture Overview - Complete KMP plugin system documentation
- KMP Coding Standards - Development guidelines and best practices
GitHub API Documentation
- GitHub Issues API - Complete GitHub REST API reference
- GitHub Personal Access Tokens - Authentication setup guide
- GitHub API Rate Limiting - API usage limits and best practices
CakePHP Framework References
- CakePHP Controllers - Controller architecture and patterns
- CakePHP View Cells - View cell implementation guide
- CakePHP Authorization - Authorization component documentation
- CakePHP Plugins - Plugin development guide
Frontend Technologies
- Stimulus.js Documentation - JavaScript framework for progressive enhancement
- Bootstrap 5 Components - UI component library
- Fetch API - Modern AJAX request handling
Security Best Practices
- OWASP Input Validation - Input sanitization guidelines
- CSRF Protection - Cross-site request forgery prevention
- API Security - API security best practices
Last Updated: July 19, 2025
Plugin Version: 25.01.11.a
Documentation Status: Complete - All workflow documentation implemented
Fact-Check Status: ✅ Verified against source code implementation
Documentation Fact-Check Summary
This documentation has been fact-checked against the actual source code implementation and corrected for accuracy:
✅ Verified Implementations:
- Plugin bootstrap process and configuration version management
- GitHub API integration workflow and authentication
- Anonymous submission process with proper security measures
- Stimulus controller AJAX handling and UI state management
- View cell conditional rendering with
StaticHelpers::pluginEnabled()
- Input sanitization and XSS prevention measures
- Response processing and error handling
🔧 Corrected Configuration Details:
- GitHub repository settings use
KMP.GitHub.Owner
,KMP.GitHub.Project
structure - API token stored as nested array in
KMP.GitHub["Token"]
- Plugin activation checked via
StaticHelpers::pluginEnabled()
method - Token scope requirements specify
public_repo
for public repos,repo
for private repos
📋 Implementation Notes:
- All code examples match actual source code implementation
- Configuration examples reflect the nested array structure used in practice
- Security measures and API integration details verified against controller code
- UI state management verified against Stimulus controller implementation