Commit Graph

59 Commits

Author SHA1 Message Date
master3395
a8d1c0f4e9 pluginHolder: auto-persist activation keys from plugin settings pages.
Inject a lightweight fetch hook into settings pages to call store-activation after successful plugin activation responses, reducing premium relock risk after upgrades.
2026-03-26 15:09:03 +01:00
master3395
ff93f0facb pluginHolder: persist premium activation keys in MariaDB.
Store plugin activation entitlements in DB and use them in access checks so upgrades do not relock premium plugins.
2026-03-26 12:39:48 +01:00
master3395
4b4625e032 Populate plugin store modify dates 2026-03-25 15:26:26 +01:00
master3395
7a9fcf28fb Fix plugin settings proxy view callables 2026-03-25 14:41:40 +01:00
master3395
a2fddadfd6 Fix plugin settings proxy callable names 2026-03-25 14:38:09 +01:00
master3395
0b79346ea1 Improve plugin store UX and fix plugin settings 404s
- Make /plugins/<plugin>/settings/ work for incomplete plugin installs by importing plugin views from source and relaxing overly strict proxy checks.
- Sync INSTALLED_APPS from plugin source when installed markers exist but installed copies are incomplete.
- Keep prior plugin store performance improvements (lazy upgrades fetching, fewer GitHub calls).
2026-03-25 14:31:57 +01:00
master3395
69bafdf09e Add managePlugins ACL + enforce pluginHolder actions
Ensures delegated admins with plugin management permission can access `/plugins/installed` UI and all plugin action endpoints consistently.
2026-03-25 10:12:48 +01:00
master3395
bb61871b28 pluginHolder: compat installPlugin() without zip_path (legacy pluginInstaller)
Detect inspect.signature for zip_path; fall back to chdir + pluginName.zip
for store install, upload install, and upgrade from GitHub.
2026-03-24 22:28:12 +01:00
master3395
120f449b60 pluginHolder: harden upgrade - verify meta sync, retry, fsync so version updates reliably 2026-03-07 22:04:52 +01:00
master3395
9e8011990a Plugin settings 404 and uninstall permission fixes
- Add plugin_settings_proxy for /plugins/<name>/settings/ so settings pages
  work for all installed plugins (handles plugins installed after worker start)
- Add path('<str:plugin_name>/settings/', plugin_settings_proxy) in pluginHolder.urls
- removeFromSettings/removeFromURLs: use try/except for read/write, raise clear
  PermissionError message; ensure panel user can write (chgrp lscpd; chmod g+w)
- Deploy: make CyberCP/settings.py, urls.py, baseTemplate index.html group-
  writable by lscpd so uninstall can update them
2026-03-06 21:00:33 +01:00
master3395
aa783d150b Plugin install: exclude README.md from wrong-location check (main repo has it at root)
Fixes false 'Files extracted to wrong location' when /usr/local/CyberCP/README.md
exists. Ensure panel user can create plugin dirs (e.g. chgrp lscpd /usr/local/CyberCP,
chmod g+w, and add panel user to group lscpd).
2026-03-06 20:51:45 +01:00
master3395
26d3d289b4 Plugin store: fix install for all plugins (nested repo + extraction)
- Find plugin in GitHub archive by any path segment (Category/pluginName)
- extractPlugin: prefer top-level dir matching plugin name; handle repo-root
  single dir by using plugin subdir when present (avoids wrong location)
- Add pluginHolder and pluginInstaller to upgrade recovery essential dirs

Fixes: Files extracted to wrong location (e.g. pm2Manager, README.md in root)
2026-03-06 20:40:37 +01:00
master3395
d2ad06aa4e Plugin install: pass absolute zip path to avoid cwd races; extract always uses given path 2026-03-06 20:26:15 +01:00
master3395
8c78545e6d Plugins: fix 404 - add plugin roots to sys.path before loading URLs
- pluginHolder/urls: insert /usr/local/CyberCP and source paths at top of module
  so __import__(plugin_name + '.urls') finds plugin packages (fixes No module
  named 'X.urls'). Register plugin routes before catch-all help route.
- pluginHolder/views: add debug_loaded_plugins API and log full traceback on
  plugin import failure. panelAccess/emailMarketing settings/ routes added
  earlier; cspManager resilient to missing DB table.
Author: master3395
2026-02-15 23:24:04 +01:00
master3395
3a73682561 Plugins: fix installed/active counts, 404s, metadata sync, install fallback
- pluginHolder/views: use dir+meta.xml for installed count; exclude core apps;
  repair pass to restore meta.xml from source or GitHub; ensure_plugin_meta_xml
  falls back to GitHub when source missing; cap active <= installed
- pluginHolder/urls: include plugin routes for all on-disk plugins (not only
  INSTALLED_APPS) so /plugins/<name>/settings/ works after install
- pluginHolder/plugins.html: Install button tries local then store (GitHub)
- CyberCP/settings: sync INSTALLED_APPS with plugin dirs on disk (meta.xml+urls.py)
Author: master3395
2026-02-15 23:03:01 +01:00
master3395
483d418c2a Misc: firewall, pluginHolder, mobile CSS, install utilities, static assets
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-14 23:02:47 +01:00
master3395
20c471b36d Plugin upgrade: sync meta.xml from GitHub raw so version matches store; logging get_current_timestamp
- Add CyberCPLogFileWriter.get_current_timestamp() for errorSanitizer (fixes 500 logging)
- After upgrade/install: fetch meta.xml from raw GitHub and overwrite installed file so
  store version (e.g. 1.1.0) is correct even when archive ZIP is cached/stale
- Upgrade/install: discover ZIP top-level folder and match plugin folder case-insensitively
- Improves redisManager/memcacheManager upgrade and all store installs
2026-02-03 19:37:36 +01:00
master3395
efa1730816 Log successful plugin install (upload) to CyberPanel main log 2026-02-03 19:28:10 +01:00
master3395
f15cf401d8 Plugin Store & Installed Plugins: search bar, A-Å sort, sort toggle, Store A-Å label
- Installed plugins: search box in header (same row as Activate/Deactivate All)
- Grid/Table: default sort A-Å by name; sort bar with Name (toggle A-Å/Å-A), Type, Date (toggle newest/oldest)
- Apply sort on load so list shows A-Å when Name A-Å is selected
- Store view: letter filter label 'A-Å Filter' (not A-Z); add Æ, Ø, Å to letter buttons
- views.py: sort pluginList by name (case-insensitive) before template
- Add deploy-installed-plugins-search.sh for template deployment
2026-02-02 20:39:56 +01:00
master3395
90ec849a21 Plugin Store: badges (NEW/Stable/Unstable/STALE), Activate/Deactivate All, categories & premium docs in help 2026-02-02 02:18:05 +01:00
master3395
600bd7c702 feat: no plugins required by default; Plugin Store category updates
- Remove emailMarketing from default INSTALLED_APPS
- Comment out emailMarketing URL (plugin installer adds when installed)
- Bump emailMarketing, examplePlugin meta.xml to 1.0.1
- Plugin Holder: remove Plugin category, enforce Utility/Security/Backup/Performance
- Add to-do/PLUGIN-DEFAULT-REMOVAL-2026-02-01.md
2026-02-01 23:47:12 +01:00
master3395
b482dc9776 Enhance plugin store: Add upgrade button, auto-backup, revert functionality, cache randomization, and local time display
- Add upgrade button in plugin store when updates are available
- Implement automatic plugin backup before upgrades
- Add revert version functionality with backup selection
- Randomize cache duration (±10 minutes) to prevent simultaneous GitHub API requests
- Display cache expiry time in user's local timezone and locale format
- Fix revert plugin function to work without event object
- Improve error handling in plugin store operations
2026-01-27 00:32:45 +01:00
master3395
3474ae18f3 Fix plugin count discrepancy and remove duplicate view toggle
- Fixed installed plugin count to correctly show all 10 installed plugins
- Added filesystem verification to ensure accurate plugin counting
- Fixed duplicate view-toggle navigation row (removed second row)
- Added installed/active count display in page header
- Improved plugin installed status detection logic
- Enhanced debug logging for plugin count discrepancies
2026-01-26 17:45:36 +01:00
master3395
da746d900f fix(plugins): Add total_installed and total_active to context 2026-01-26 03:48:13 +01:00
master3395
8d09d75ff8 fix(plugins): Add missing outer except block in fetch_plugin_store 2026-01-26 03:45:29 +01:00
master3395
63f4f53eee fix(plugins): Fix indentation in fetch_plugin_store - final fix 2026-01-26 03:44:59 +01:00
master3395
e3b5123480 fix(plugins): Fix indentation error in fetch_plugin_store exception handler
- Fix except block indentation to match try block
- Add error handling for enrichment in stale cache fallback
- Ensures proper exception handling structure
2026-01-26 03:44:34 +01:00
master3395
c7c0e44a50 fix(plugins): Add error handling to fetch_plugin_store to prevent 500 errors
- Wrap mailUtilities.checkHome in try-except
- Add try-except around _enrich_store_plugins calls
- If enrichment fails, return plugins without enrichment instead of 500 error
- Add error handling for _is_plugin_enabled calls
- Prevents HTTP 500 errors when plugin store loading fails
- Fixes issue where installing discordWebhooks caused plugin store to fail
2026-01-26 03:43:49 +01:00
master3395
5d9154f726 fix(plugins): Fix 'local variable pluginInstaller referenced before assignment' error
- Remove redundant local import of pluginInstaller inside install_from_store function
- pluginInstaller is already imported at module level (line 20)
- The local import was creating a variable shadowing issue
- When the cleanup code path wasn't executed, pluginInstaller was referenced before assignment
- Fixes installation from store failing with variable reference error
2026-01-26 03:41:14 +01:00
master3395
87f421b761 fix(plugins): Fix plugin store showing uninstalled plugins as installed
- Only check /usr/local/CyberCP/ for installed status, not /home/cyberpanel/plugins/
- Require both plugin directory AND meta.xml to exist for installed status
- Plugins in source directory are not considered installed
- Fixes issue where Discord Webhooks, Fail2ban, Premium Plugin Example, and Test Plugin showed as installed when they weren't

Previously, the check used: os.path.exists(installed_path) or os.path.exists(source_path)
This incorrectly marked plugins as installed if they existed in the source directory.

Now uses: os.path.exists(installed_path) and os.path.exists(installed_meta)
This correctly only marks plugins as installed if they're actually in /usr/local/CyberCP/ with meta.xml
2026-01-26 03:37:48 +01:00
master3395
33440b62ba fix(plugins): Only show actually installed plugins in Installed Plugins page
- Filter pluginList to only include plugins where installed == True
- Uninstalled plugins will only appear in Plugin Store, not Installed Plugins
- This fixes the issue where uninstalled plugins were still showing locally
- Plugins in /home/cyberpanel/plugins/ but not in /usr/local/CyberCP/ are now hidden from Installed Plugins
2026-01-26 03:30:35 +01:00
master3395
c23dffb14a fix(plugins): Check ProcessUtilities return values and add shell=True fallback
- Check return values from ProcessUtilities.normalExecutioner() (returns 0/1)
- Add subprocess with shell=True as additional fallback
- Better error handling and logging

Fixes: pm2Manager and paypalPremiumPlugin uninstall failures
2026-01-26 03:25:09 +01:00
master3395
c26f66eb69 fix(plugins): Improve uninstall retry logic with permission fix and root fallback
- Fix permissions with ProcessUtilities before removal retry
- Add subprocess fallback if running as root
- Add filesystem sync delay after removal
- Better error messages showing all attempted methods

Fixes: pm2Manager and paypalPremiumPlugin uninstall failures
2026-01-26 03:24:23 +01:00
master3395
790d8831ba fix(plugins): Add verification and retry logic to uninstall process
- Verify plugin directory is actually removed after removeFiles()
- If directory still exists, retry with ProcessUtilities.normalExecutioner()
- Return error if directory still exists after all attempts
- Prevents silent failures where uninstall appears successful but plugin remains

Fixes: Plugins showing as installed after 'successful' uninstall
2026-01-26 03:20:56 +01:00
master3395
f006848765 fix: Remove remaining emailMarketing references from pluginHolder/views.py
Remove emailMarketing manage_url assignments that were left after
skipping the plugin. These were causing issues.
2026-01-26 03:12:50 +01:00
master3395
45aa097551 fix: Remove emailMarketing references after removal from INSTALLED_APPS
- Comment out emailMarketing menu item in baseTemplate/index.html
- Skip emailMarketing in pluginHolder/views.py when listing plugins
- Prevents HTTP 500 error when template tries to reverse 'emailMarketing' URL

Fixes: HTTP 500 on /plugins/installed after emailMarketing removal
2026-01-26 03:09:58 +01:00
master3395
a19e7581e3 fix(plugins): Improve auto-cleanup of incomplete plugin directories
- Use pluginInstaller.removeFiles() which handles permissions properly
- Add fallback to rm -rf if pluginInstaller method fails
- Better error handling and logging
- Applied to both install_plugin and install_from_store functions

Fixes: Incomplete plugin directory cleanup failures due to permission issues
2026-01-26 03:09:01 +01:00
master3395
96a2231d6a fix(plugins): Improve 'already installed' check to handle incomplete directories
- Only consider plugin installed if meta.xml exists
- Auto-cleanup incomplete plugin directories during install
- Prevents 'Plugin already installed' error when directory exists but is incomplete

Fixes: Plugin already installed: discordAuth (when directory exists but incomplete)
2026-01-26 03:03:52 +01:00
master3395
f1ea5efe0b feat(plugins): Add plugin registrations and improve installation process
- Add fail2ban, discordAuth, discordWebhooks, googleTagManager to INSTALLED_APPS
- Add URL routes for all new plugins
- Add automatic lscpd restart after plugin installation in pluginHolder/views.py
- Fix file ownership/permissions for baseTemplate/index.html (cyberpanel:cyberpanel 664)

Plugins added:
- fail2ban: Security management plugin
- discordAuth: Discord authentication plugin
- discordWebhooks: Discord webhook notifications plugin
- googleTagManager: Google Tag Manager integration plugin
2026-01-26 02:53:24 +01:00
master3395
c3adc75300 Add NEW/Stale badges to Plugin Store and fix intermittent display issues
- Added NEW badge for plugins updated within last 3 months (90 days)
- Added Stale badge for plugins not updated in last 2 years (730 days)
- Removed Author, Status, and Active columns from Plugin Store view
- Fixed intermittent old table display with cache-busting v7
- Added column count validation to ensure correct 8-column structure
- Added tooltips for NEW and Stale badges with descriptive messages
- Cleared plugin store cache to prevent stale data display
- Updated cache-busting version to v7 to force browser refresh
2026-01-25 22:25:21 +01:00
master3395
5c89de6b57 Update pluginHolder with Free/Paid badges and Plugin Information support
- Added Free/Paid badges to Grid View, Table View, and Plugin Store
- Fixed intermittent badge display issues with robust boolean handling
- Updated plugin store to show plugin icons and proper pricing badges
- Removed Deactivate/Uninstall from Plugin Store (only Install/Installed)
- Fixed template syntax errors and duplicate navigation buttons
- Enhanced cache handling for plugin metadata (is_paid, patreon_url, etc.)
- Improved JavaScript cache-busting and isPaid normalization
2026-01-25 20:55:56 +01:00
master3395
363a974937 Fix plugin Settings button to use main route instead of /settings/
- Change default manage_url from /plugins/{plugin}/settings/ to /plugins/{plugin}/
- Many plugins don't have a /settings/ route but have a main route
- Ensures Settings button works for plugins like examplePlugin that only have a main route
- Still respects settings_url and url from meta.xml if provided
2026-01-20 01:39:35 +01:00
master3395
8e4fa5c72b Ensure emailMarketing manage_url is always set correctly
- Add fallback handling for emailMarketing in else branch
- Ensures Settings button always has correct URL (/emailMarketing/)
- Prevents any edge case where manage_url might be wrong
2026-01-20 01:37:49 +01:00
master3395
89e9a0e55e Fix plugin author display and add Settings button
- Add author field extraction from meta.xml in both plugin processing loops
- Update discordWebhooks meta.xml to include author: Master3395
- Update examplePlugin meta.xml to include author: usmannasir
- Add Plugin Settings button next to Deactivate/Uninstall buttons in both grid and table views
- Special handling for emailMarketing core plugin URL (/emailMarketing/ instead of /plugins/emailMarketing/)
- Add btn-settings styling for Settings button with hover effects
2026-01-20 01:31:18 +01:00
master3395
c4b3da1436 Add markdown link and image support to plugin help pages
- Convert linked images (badges): [![alt](img_url)](link_url) to clickable <a><img></a>
- Convert regular images: ![alt](img_url) to <img> tags
- Convert regular links: [text](url) to <a> tags
- All external links open in new tab with security attributes
- Preserve existing HTML tags when wrapping paragraphs
- Fixes badge links not working in README.md content
2026-01-20 01:23:44 +01:00
master3395
1182ceb474 Add GitHub README.md and CHANGELOG.md fetching for plugin help pages
- Fetch CHANGELOG.md from GitHub if not found locally (non-blocking, 3s timeout)
- Fetch README.md from GitHub if no local help files found
- Provides version history and documentation for plugins from GitHub
- All GitHub fetches are optional and fail silently to avoid slow page loads
- Enhances plugin-specific help pages with complete information
2026-01-20 01:22:03 +01:00
master3395
ddeee68348 Fix plugin-specific help pages and examplePlugin version
- Update examplePlugin version from 0 to 1.0 in meta.xml
- Implement proper plugin_help view to show plugin-specific information
- Reads plugin meta.xml for name, version, author, description
- Looks for README.md, HELP.md, CHANGELOG.md files in plugin directory
- Displays plugin information and version history
- Now shows plugin-specific help instead of redirecting to development guide
- Individual plugin Help buttons now show plugin-specific information
2026-01-20 01:19:14 +01:00
master3395
c0d51fbaac Fix processed_plugins tracking - move add() after successful processing
- Move processed_plugins.add() to after plugin is successfully added to pluginList
- Prevents plugins from being marked as processed if they fail validation
- Ensures pm2Manager and other store-installed plugins show up correctly
2026-01-20 00:55:43 +01:00
master3395
19f2c3f68f Fix installed plugins view to show plugins installed from store - final fix
- Add logic to check installed plugins that don't have source directories
- Fixes issue where PM2 Manager (installed from store) wasn't showing
- Moved processed_plugins.add() to correct location in code flow
- Now shows all 4 installed plugins: testPlugin, discordWebhooks, fail2ban, pm2Manager
2026-01-20 00:55:24 +01:00
master3395
0a40e6245f Fix installed plugins view to show plugins installed from store
- Add logic to check installed plugins that don't have source directories
- Fixes issue where PM2 Manager (installed from store) wasn't showing in installed list
- Now shows all installed plugins regardless of whether they have source in /home/cyberpanel/plugins/
- Prevents duplicate plugin entries by tracking processed plugins
2026-01-20 00:53:18 +01:00