diff --git a/module_index.json b/module_index.json index bc8a487..17ec967 100755 --- a/module_index.json +++ b/module_index.json @@ -155,7 +155,7 @@ "version": "0.1", "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.", - "lastupdate": 1567107944, + "lastupdate": 1567366716, "optional": false, "extra_data": [] }, diff --git a/modules/feature-theme-gallery.php b/modules/feature-theme-gallery.php index bffed46..5178eb5 100644 --- a/modules/feature-theme-gallery.php +++ b/modules/feature-theme-gallery.php @@ -30,8 +30,8 @@ register_module([ $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($next_obj === null) { + $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) . ".")); } @@ -59,7 +59,7 @@ register_module([ $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) @@ -73,8 +73,75 @@ register_module([ }); + 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.

"); } ]); +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; + + +} + ?> diff --git a/peppermint.guiconfig.json b/peppermint.guiconfig.json index aba8169..206ddd1 100644 --- a/peppermint.guiconfig.json +++ b/peppermint.guiconfig.json @@ -188,6 +188,7 @@ "disable_peppermint_access_check": { "type": "checkbox", "description": "Disables the access check for peppermint.json on first-run. VERY DANGEROUS. Use only for development. Note that it's recommend to block access to peppermint.json for a reason - it contains your site secret and password hashes, so an attacker could do all sorts of nefarious things if it's left unblocked.", "default": false }, "css_theme_autoupdate_url": { "type": "url", "description": "A url that points to the css theme file to check for updates. If blank, then automatic updates are disabled.", "default": "" }, "css_theme_autoupdate_interval": { "type": "number", "description": "The interval, in seconds, that updates to the theme should be checked for. Defaults to every week. A value of -1 disables automatic updates.", "default": 604800 }, + "css_theme_autoupdate_lastcheck": { "type": "number", "description": "The timestamp of the last time that updates for the selected theme were last checked for. To disable automatic updates, you should set css_theme_autoupdate_interval to -1 instead of changing this setting.", "default": 0 }, "css_theme_gallery_index_url": { "type": "text", "description": "A url that points to an index file that contains a list of themes. Used to populate the gallary. Multiple urls are allowed - separate them with a space.", "default": "https://starbeamrainbowlabs.com/labs/peppermint/themes/themeindex.php" }, "css_theme_gallery_selected_id": { "type": "text", "description": "The id of the currently selected theme. Defaults to the internal default theme.", "default": "default" }, "css": { "type": "textarea", "description": "A string of css to include. Will be included in the <head> of every page inside a <style> tag. This may also be an absolute url - urls will be referenced via a <link rel='stylesheet' /> tag. If the theme gallery is installed and automatic updates enabled, then the value of this property is managed by the theme gallery and changes may be overwritten (try the css_custom setting instead).", "default": "auto" }, diff --git a/themes/blue/theme.css b/themes/blue/theme.css index 2ff0732..e516159 100644 --- a/themes/blue/theme.css +++ b/themes/blue/theme.css @@ -4,7 +4,7 @@ * @description A more blue theme. * @author ZestyclosePainting * @author_link https://reddit.com/u/ZestyclosePainting - * @minversion 0.20 + * @minversion v0.20 * * "A more blue theme for pepperminty if anyone's interested." * By u/ZestyclosePainting on Reddit: https://www.reddit.com/user/ZestyclosePainting/ diff --git a/themes/default/theme.css b/themes/default/theme.css index 02e3932..e346ac9 100644 --- a/themes/default/theme.css +++ b/themes/default/theme.css @@ -4,7 +4,7 @@ * @description The default theme. * @author Starbeamrainbowlabs * @author_link https://starbeamrainbowlabs.com/ - * @minversion 0.20 + * @minversion v0.20 */ :root { diff --git a/themes/none/theme.css b/themes/none/theme.css index ac4e15e..d92aa80 100644 --- a/themes/none/theme.css +++ b/themes/none/theme.css @@ -4,5 +4,5 @@ * @description A special theme with no CSS. Useful if you want to create your own theme from scratch! * @author Starbeamrainbowlabs * @author_link https://starbeamrainbowlabs.com/ - * @minversion 0.20 + * @minversion v0.20 */