WP Manifestindependent plugin directory

Install

Download schoolbooth-photo-manager-v3.4.1.zip From the v3.4.1 release on GitHub, Jun 13, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/awebbtx/production_schoolbooth_wp_plugin/releases/download/v3.4.1/schoolbooth-photo-manager-v3.4.1.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

=== Schoolbooth Photo Manager === Contributors: ikapsystems Tags: photo download, secure downloads, access codes Requires at least: 5.6 Tested up to: 6.0 Stable tag: 3.2.2 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html

Secure photo downloads with access codes and portal interface.

Description

This plugin provides:

  • Secure photo downloads with access codes
  • Download portal interface
  • Download limits per image
  • Automatic image expiration
  • Access-code based photo portals
  • One-click page creation
  • Bulk download/delete options
  • Signed REST API for app uploads

Installation

  1. Upload the plugin files to the /wp-content/plugins/schoolbooth-photo-manager directory
  2. Activate the plugin through the Plugins menu in WordPress
  3. Configure settings under Settings > Photo Downloads
  4. Use the [schoolbooth_download_portal] shortcode or create a page automatically

GitHub Installation / Updates

Install from GitHub Releases using the ZIP asset for the version you want.

For manual installs in wp-admin:

  1. Download the release ZIP named schoolbooth-photo-manager-vX.Y.Z.zip.
  2. In WordPress admin, go to Plugins > Add New > Upload Plugin.
  3. Upload the ZIP and click Install Now.
  4. Click Activate Plugin.

For updates, always use the newest release ZIP from the Releases page. Do not upload source-code ZIPs generated by GitHub's "Source code (zip)" links.

Shared Hosting / Bluehost Deployment Note

On some shared hosts (including Bluehost and similar providers), ModSecurity or other WAF layers may block app enrollment or image upload requests with HTTP 403/406.

If this occurs, ask hosting support to keep WAF enabled globally and apply a narrow path-based exception for POST requests to these plugin API routes:

  • /wp-json/schoolbooth/v1/enroll
  • /wp-json/schoolbooth/v1/ingest
  • /wp-json/pta-schoolbooth/v1/enroll (legacy compatibility)
  • /wp-json/pta-schoolbooth/v1/ingest (legacy compatibility)
  • /wp-json/nbpta/v1/enroll (legacy compatibility)
  • /wp-json/nbpta/v1/ingest (legacy compatibility)

Also ask support to confirm request-body limits are sufficient for base64 image payloads used by API uploads.

Changelog

3.2.2

  • Fixed activation warning "generated unexpected output" by removing UTF-8 BOM bytes from all PHP files.
  • Packaging hardening to ensure clean WordPress extraction and activation.

3.2.1

  • Fixed activation failures by making setup checks non-fatal and surfacing warnings in wp-admin.
  • Automatically regenerates an invalid/too-short shared secret during activation.

3.0.2

  • Rebranding cleanup for Schoolbooth naming
  • API namespace and settings naming alignment
  • Production-focused packaging updates

3.0.0

  • Complete redesign with portal interface
  • Added bulk download/delete options
  • Improved security
  • Better error handling
  • Added expiration countdown display

Releases

13 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v3.4.1 latest
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.4.1.zip
3
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.4.0.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.3.0.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.9.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.8.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.7.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.6.zip
2
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.5.zip
1
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.4.zip
2
Jun 13, 2026 4mo ago
schoolbooth-photo-manager-v3.2.3.zip
6
Mar 23, 2026 7mo ago
schoolbooth-photo-manager-v3.2.2.zip
5
Mar 23, 2026 7mo ago
schoolbooth-photo-manager-v3.2.1.zip
1
Mar 23, 2026 7mo ago
schoolbooth-photo-manager-v3.2.0.zip
1
D+ grade

Security

Schoolbooth Photo Manager 3.4.1 · audited by WP Registry

High-severity findings.

1 high 1 medium
Audited release
3.4.1
Findings
2
Worst severity
high
Content hash
d4e53666fe311aa5442517ee…

Findings

  • high Minors' photos, access-code map and consent log stored in public uploads with Apache-only (and image-permissive) protection

    information_disclosure

    Photos are written to wp-content/uploads/<upload_path>/photos/, the code-to-file map to uploads/<upload_path>/access_codes.json, and the audit fallback log (consent emails) to uploads/schoolbooth/data/audit-fallback.log. The only protection is an .htaccess written on activation. It does nothing on nginx, IIS or LiteSpeed without htaccess, and nothing if the admin changes upload_path, because no .htaccess is written to the new path. On those hosts an unauthenticated GET of access_codes.json reveals every photo path and access code. Even on Apache, the .htaccess explicitly 'Allow from all' for jpg/jpeg/png/gif, and get_photos_data() emits direct baseurl URLs for images and thumbnails. Anyone with or guessing a photo path can fetch it directly, bypassing the HMAC link, expiry_days and download_limit. Photos are only deleted when the download limit is reached through the PHP handler, never on expiry.

    schoolbooth-photo-manager.php:53-78

    Recommendation

    Store photos, the code map and logs outside the web root (or in a randomized, non-guessable directory with server-agnostic deny rules). Never emit direct file URLs; stream every image through the HMAC/expiry/limit-checked handler. Move access-code records into the database, and delete expired files with a cron job.

  • medium Portal access gate: consent check trusts any cookie and access-code guessing is not rate-limited

    auth_bypass

    SCHOOLBOOTH_Permissions_Form_Handler::has_completed_form() returns true when a cookie named schoolbooth_form_<code> merely exists, and never verifies the wp_hash token set on submission. The [schoolbooth_download_portal] shortcode calls get_photos_data($code) for any ?code= value with no call to the rate limiter; the limiter is only used by the HMAC download handler. An unauthenticated attacker can set the cookie and enumerate access codes against the portal page at full speed. Every hit returns that family's photo URLs and signed download links and skips the required release form. Real-world impact depends on the access-code entropy generated by the kiosk app.

    includes/class-permissions-form-handler.php:451-454

    Recommendation

    Validate the cookie value: store the issued token server-side, or make it an HMAC over the code and expiry that is verified with hash_equals. Apply SCHOOLBOOTH_Rate_Limiter (per IP and globally per code) to portal code lookups, and enforce a minimum access-code length and entropy at ingest.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.