"Theme Gallery", "version" => "0.3", "author" => "Starbeamrainbowlabs", "description" => "Adds a theme gallery page and optional automatic theme updates. Contacts a remote server, where IP addresses are stored in automatic server logs for security and attack mitigation purposes.", "id" => "feature-theme-gallery", "code" => function() { global $settings; /** * @api {get} ?action=theme-gallery Display the theme gallery * @apiName ThemeGallery * @apiGroup Utility * @apiPermission Moderator */ add_action("theme-gallery", function() { global $settings, $env; if(!$env->is_admin) { $errorMessage = "

You don't have permission to change $settings->sitename's theme.

\n"; if(!$env->is_logged_in) $errorMessage .= "

You could try logging in.

"; else $errorMessage .= "

You could try logging out and then logging in again with a different account that has the appropriate privileges..

"; exit(page_renderer::render_main("Error - $settings->sitename", $errorMessage)); } $themes_available = []; $gallery_urls = explode(" ", $settings->css_theme_gallery_index_url); foreach($gallery_urls as $url) { if(empty($url)) continue; $next_obj = json_decode(@file_get_contents($url)); if(empty($next_obj)) { http_response_code(503); exit(page_renderer::render_main("Error - Theme Gallery - $settings->sitename", "

Error: Failed to download theme index file from " . htmlentities($url) . ".")); } foreach($next_obj as $theme) { $theme->index_url = $url; $theme->root = dirname($url) . "/{$theme->id}"; $theme->url = "{$theme->root}/theme.css"; $theme->preview_large = "{$theme->root}/preview_large.png"; $theme->preview_small = "{$theme->root}/preview_small.png"; $themes_available[] = $theme; } } $sorter = new Collator(""); usort($themes_available, function($a, $b) use ($sorter) : int { return $sorter->compare($a->name, $b->name); }); $content = "

Theme Gallery

\n"; foreach($themes_available as $theme) { $selected = $theme->id == $settings->css_theme_gallery_selected_id ? " selected" : ""; $content .= "

" . str_replace("\n", "

\n

", htmlentities($theme->description)) . "

By " . htmlentities($theme->author) . " (View CSS, View Index)

"; } $content .= "

Warning: If you've altered $settings->sitename's CSS by changing the value of the css setting, then your changes will be overwritten by clicking the button below! If necessary, move your changes to the css_custom setting first before continuing here.

"; exit(page_renderer::render_main("Theme Gallery - $settings->sitename", "$content")); }); add_action("theme-gallery-select", function() { global $env, $settings; if(!$env->is_admin) { $errorMessage = "

You don't have permission to change $settings->sitename's theme.

\n"; if(!$env->is_logged_in) $errorMessage .= "

You could try logging in.

"; else $errorMessage .= "

You could try logging out and then logging in again with a different account that has the appropriate privileges..

"; exit(page_renderer::render_main("Error - $settings->sitename", $errorMessage)); } if(!isset($_GET["theme-selector"])) { http_response_code(400); exit(page_renderer::render_main("No theme selected - Error - $settings->sitename", "

Oops! Looks like you didn't select a theme. Try going back and selecting one.

")); } // Set the new theme's id $settings->css_theme_gallery_selected_id = $_GET["theme-selector"]; // TODO: Set the autoupdate_url here // TODO: Add option to disable theme updates if(!save_settings()) { http_response_code(503); exit(page_renderer::render_main("Server error - $settings->sitename", "

Oops! $settings->sitename wasn't able to save the peppermint.json settings file back to disk. If you're the administrator, try checking the permissions on disk. If not, try contacting $settings->sitename's administrator, who's contact details can be found at the bottom of every page.

")); } }); add_help_section("26-random-redirect", "Jumping to a random page", "

$settings->sitename has a function that can send you to a random page. To use it, click here. $settings->admindetails_name ($settings->sitename's adminstrator) may have added it to one of the menus.

"); } ]); /** * Updates the currently selected theme by fetching it from a remote url. * @param bool $force_update Whether to force an update - even if we've already updated recently. * @return bool Whether the update was sucessful. It might fail because of network issues, or the theme update requires a newer version of Pepperminty Wiki than is currently installed. */ function theme_update($force_update = false) : bool { global $version, $settings; // If there's no url to update from or updates are disabled, then we're done here if(empty($settings->css_theme_autoupdate_url) || $settings->css_theme_autoupdate_interval < 0) return true; // If it's not time for an update, then end here // ...unless we're supposed to force an update if(time() - $settings->css_theme_autoupdate_lastcheck < $settings->css_theme_autoupdate_interval || !$force_update) return true; // Fetch the new css $new_css = @file_get_contents($settings->css_theme_autoupdate_url); // Make sure it's valid if(empty($new_css)) { error_log("[Pepperminty Wiki/$settings->sitename] Error: Failed to update theme: Got an error while trying to download theme update from $settings->css_theme_autoupdate_url"); return false; } // TODO: Check the hash against themeindex.json? $min_version_loc = strpos($new_css, "@minversion") + strlen("@minversion"); $min_version = substr($new_css, $min_version_loc, strpos($new_css, "\n", $min_version_loc)); if(version_compare($version, $min_version) == -1) { error_log("[Pepperminty Wiki/$settings->sitename] Error: Failed to update theme: $settings->css_theme_gallery_selected_id requires Pepperminty Wiki $min_version, but $version is installed."); return false; } // If the css is identical to the string we've got stored already, then no point in updating if($new_css == $settings->css) return true; $settings->css = $new_css; return save_settings(); } ?>