Allow users to select their own theme overlays
authorJamie Cameron <jcameron@webmin.com>
Thu, 18 Dec 2008 00:34:02 +0000 (00:34 +0000)
committerJamie Cameron <jcameron@webmin.com>
Thu, 18 Dec 2008 00:34:02 +0000 (00:34 +0000)
acl/acl-lib.pl
blue-theme/left.cgi
change-user/change.cgi
change-user/index.cgi
change-user/lang/en
overlay-theme/theme.info
webmin/change_overlay.cgi

index 8d68fd1..278818c 100644 (file)
@@ -51,7 +51,8 @@ while(<PWFILE>) {
                $user{'skill'} = $gconfig{"skill_$user[0]"};
                $user{'risk'} = $gconfig{"risk_$user[0]"};
                $user{'rbacdeny'} = $gconfig{"rbacdeny_$user[0]"};
-               $user{'theme'} = $gconfig{"theme_$user[0]"};
+               ($user{'theme'}, $user{'overlay'}) =
+                       split(/\s+/, $gconfig{"theme_$user[0]"});
                $user{'readonly'} = $gconfig{"readonly_$user[0]"};
                $user{'ownmods'} = [ split(/\s+/,
                                           $gconfig{"ownmods_$user[0]"}) ];
@@ -110,7 +111,8 @@ local(%user, %miniserv, @mods);
 &lock_file($ENV{'MINISERV_CONFIG'});
 &get_miniserv_config(\%miniserv);
 if ($user{'theme'}) {
-       $miniserv{"preroot_".$user{'name'}} = $user{'theme'};
+       $miniserv{"preroot_".$user{'name'}} =
+               $user{'theme'}.($user{'overlay'} ? " ".$user{'overlay'} : "");
        }
 elsif (defined($user{'theme'})) {
        $miniserv{"preroot_".$user{'name'}} = "";
@@ -164,7 +166,13 @@ delete($gconfig{"ownmods_".$user{'name'}});
 $gconfig{"ownmods_".$user{'name'}} = join(" ", @{$user{'ownmods'}})
        if (@{$user{'ownmods'}});
 delete($gconfig{"theme_".$user{'name'}});
-$gconfig{"theme_".$user{'name'}} = $user{'theme'} if (defined($user{'theme'}));
+if ($user{'theme'}) {
+       $gconfig{"theme_".$user{'name'}} =
+               $user{'theme'}.($user{'overlay'} ? " ".$user{'overlay'} : "");
+       }
+elsif (defined($user{'theme'})) {
+       $gconfig{"theme_".$user{'name'}} = '';
+       }
 $gconfig{"readonly_".$user{'name'}} = $user{'readonly'}
        if (defined($user{'readonly'}));
 $gconfig{"realname_".$user{'name'}} = $user{'real'}
@@ -194,7 +202,8 @@ local(%user, %miniserv, @pwfile, @acl, @mods, $_, $m);
 &get_miniserv_config(\%miniserv);
 delete($miniserv{"preroot_".$_[0]});
 if ($user{'theme'}) {
-       $miniserv{"preroot_".$user{'name'}} = $user{'theme'};
+       $miniserv{"preroot_".$user{'name'}} =
+               $user{'theme'}.($user{'overlay'} ? " ".$user{'overlay'} : "");
        }
 elsif (defined($user{'theme'})) {
        $miniserv{"preroot_".$user{'name'}} = "";
@@ -289,7 +298,13 @@ delete($gconfig{"ownmods_".$_[0]});
 $gconfig{"ownmods_".$user{'name'}} = join(" ", @{$user{'ownmods'}})
        if (@{$user{'ownmods'}});
 delete($gconfig{"theme_".$_[0]});
-$gconfig{"theme_".$user{'name'}} = $user{'theme'} if (defined($user{'theme'}));
+if ($user{'theme'}) {
+        $gconfig{"theme_".$user{'name'}} =
+                $user{'theme'}.($user{'overlay'} ? " ".$user{'overlay'} : "");
+        }
+elsif (defined($user{'theme'})) {
+        $gconfig{"theme_".$user{'name'}} = '';
+        }
 delete($gconfig{"readonly_".$_[0]});
 $gconfig{"readonly_".$user{'name'}} = $user{'readonly'}
        if (defined($user{'readonly'}));
index ef798cd..429187b 100755 (executable)
@@ -12,12 +12,8 @@ do './ui-lib.pl';
 @modules = map { @{$_->{'modules'}} } @cats;
 
 $charset = defined($force_charset) ? $force_charset : &get_charset();
-&PrintHeader($charset);
+print &popup_header();
 print <<EOF;
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<link rel="stylesheet" type="text/css" href="unauthenticated/style.css" />
 <link rel="stylesheet" type="text/css" href="left.css" />
 <script>
 function toggleview (id1,id2) {
@@ -153,10 +149,7 @@ if ($ENV{'HTTP_WEBMIN_SERVERS'}) {
        print "<div class='aftericon'><a target=_top href='$ENV{'HTTP_WEBMIN_SERVERS'}'>$text{'header_servers'}</a></div>";
        }
 
-print <<EOF;
-</form>
-</body>
-EOF
+print &popup_footer();
 
 # print_category_opener(name, &allcats, label)
 # Prints out an open/close twistie for some category
index 0e54799..710a788 100755 (executable)
@@ -5,13 +5,12 @@
 require './change-user-lib.pl';
 &ReadParse();
 
-&ui_print_unbuffered_header(undef, $text{'change_title'}, "");
-
 @users = &acl::list_users();
 ($user) = grep { $_->{'name'} eq $base_remote_user } @users;
 $oldtheme = $user->{'theme'};
+$oldoverlay = $user->{'overlay'};
 if (!defined($oldtheme)) {
-       $oldtheme = $gconfig{'theme'};
+       ($oldtheme, $oldoverlay) = split(/\s+/, $gconfig{'theme'});
        }
 
 # Validate the password
@@ -22,7 +21,7 @@ if ($access{'pass'} && &can_change_pass($user) && !$in{'pass_def'}) {
        &error(&text('change_epass', $perr)) if ($perr);
        }
 
-print "$text{'change_user'}<br>\n";
+# Parse custom language
 if ($access{'lang'}) {
        if ($in{'lang_def'}) {
                $user->{'lang'} = undef;
@@ -31,6 +30,8 @@ if ($access{'lang'}) {
                $user->{'lang'} = $in{'lang'};
                }
        }
+
+# Parse custom theme and possibly overlay
 if ($access{'theme'}) {
        if ($in{'theme_def'}) {
                $user->{'theme'} = undef;
@@ -42,11 +43,33 @@ if ($access{'theme'}) {
        if (!defined($newtheme)) {
                $newtheme = $gconfig{'theme'};
                }
+
+       # Overlay
+       if ($in{'overlay_def'} || !defined($in{'overlay'})) {
+               $newoverlay = undef;
+               }
+       else {
+               $newoverlay = $in{'overlay'};
+               $user->{'theme'} || &error($text{'change_eoverlay'});
+               %oinfo = &get_theme_info($in{'overlay'});
+               if ($oinfo{'depends'} &&
+                   &indexof($user->{'theme'},
+                            split(/\s+/, $oinfo{'depends'})) < 0) {
+                       &error($text{'change_eoverlay2'});
+                       }
+               $user->{'overlay'} = $in{'overlay'};
+               }
        }
+
+# Parse password change
 if ($access{'pass'} && &can_change_pass($user) && !$in{'pass_def'}) {
        $user->{'pass'} = &acl::encrypt_password($in{'pass'});
        $user->{'temppass'} = 0;
        }
+
+&ui_print_unbuffered_header(undef, $text{'change_title'}, "");
+
+print "$text{'change_user'}<br>\n";
 &acl::modify_user($user->{'name'}, $user);
 print "$text{'change_done'}<p>\n";
 
@@ -54,11 +77,10 @@ print "$text{'change_restart'}<br>\n";
 &reload_miniserv();
 print "$text{'change_done'}<p>\n";
 
-if ($access{'theme'} && $newtheme ne $oldtheme) {
+if ($access{'theme'} &&
+    ($newtheme ne $oldtheme || $newoverlay ne $oldoverlay)) {
        print "$text{'change_redirect'}<br>\n";
-       print "<script>\n";
-       print "window.parent.location = '/';\n";
-       print "</script>\n";
+       print &js_redirect("/", "top");
        print "$text{'change_done'}<p>\n";
        }
 
index dd8bdca..b3339da 100755 (executable)
@@ -36,12 +36,18 @@ if ($access{'lang'}) {
 if ($access{'theme'}) {
        # Show personal theme
        if ($gconfig{'theme'}) {
-               %tinfo = &webmin::get_theme_info($gconfig{'theme'});
+               ($gtheme, $goverlay) = split(/\s+/, $gconfig{'theme'});
+               %tinfo = &webmin::get_theme_info($gtheme);
                $tname = $tinfo{'desc'};
                }
        else {
                $tname = $text{'index_themedef'};
                }
+       @all = &webmin::list_themes();
+       @themes = grep { !$_->{'overlay'} } @all;
+       @overlays = grep { $_->{'overlay'} } @all;
+
+       # Main theme
        print &ui_table_row($text{'index_theme'},
                &ui_radio("theme_def", defined($user->{'theme'}) ? 0 : 1,
                          [ [ 1, &text('index_themeglobal', $tname)."<br>" ],
@@ -49,7 +55,16 @@ if ($access{'theme'}) {
                &ui_select("theme", $user->{'theme'},
                        [ [ '', $text{'index_themedef'} ],
                          map { [ $_->{'dir'}, $_->{'desc'} ] }
-                             &webmin::list_themes() ]));
+                             @themes ]));
+
+       # Overlay, if any
+       if (@overlays) {
+               print &ui_table_row($text{'index_overlay'},
+                       &ui_select("overlay", $user->{'overlay'},
+                               [ [ '', $text{'index_overlaydef'} ],
+                                 map { [ $_->{'dir'}, $_->{'desc'} ] }
+                                     @overlays ]));
+               }
        }
 
 if ($access{'pass'} && &can_change_pass($user)) {
index f1a35c0..4995843 100644 (file)
@@ -3,6 +3,8 @@ index_lang=Webmin UI language
 index_langglobal=Global language ($1)
 index_langset=Personal choice ..
 index_theme=Webmin UI theme
+index_overlay=Theme overlay
+index_overlaydef=None - use theme defaults
 index_themeglobal=Global theme ($1)
 index_themeset=Personal choice ..
 index_pass=Webmin login password
@@ -21,10 +23,12 @@ index_dpass=the password used to login with
 change_title=Changing Settings
 change_user=Modifying Webmin login ..
 change_done=.. done
-change_restart=Re-starting Webmin ..
+change_restart=Reloading Webmin ..
 change_redirect=Re-directing to main menu ..
 change_ecolon=Your password cannot contain the : character
 change_epass=New password is not valid : $1
+change_eoverlay=You cannot select a theme overlay unless a UI theme is also chosen
+change_eoverlay2=The selected theme overlay is not compatible with the chosen UI theme
 
 acl_lang=Can change language?
 acl_theme=Can change theme?
index 92f49c5..c9c60cf 100644 (file)
@@ -2,5 +2,5 @@ desc=CSS Overlay Demo Theme
 overlay=1
 webmin=1
 usermin=1
-depends=virtual-server-theme
+depends=virtual-server-theme blue-theme
 version=1.0
index a342d19..9ed3457 100755 (executable)
@@ -9,8 +9,8 @@ require './webmin-lib.pl';
 ($gtheme) = split(/\s+/, $gconfig{'theme'});
 if ($in{'overlay'}) {
        %oinfo = &get_theme_info($in{'overlay'});
-       if ($oinfo{'overlay'} &&
-           &indexof($gtheme, split(/\s+/, $oinfo{'overlay'})) < 0) {
+       if ($oinfo{'depends'} &&
+           &indexof($gtheme, split(/\s+/, $oinfo{'depends'})) < 0) {
                &error($text{'themes_eoverlay'});
                }
        }